{"id":49141,"date":"2025-04-16T09:27:43","date_gmt":"2025-04-16T09:27:43","guid":{"rendered":"https:\/\/www.devopsschool.com\/blog\/?p=49141"},"modified":"2025-07-12T05:54:57","modified_gmt":"2025-07-12T05:54:57","slug":"step-by-step-guide-to-deploy-aro-azure-red-hat-openshift","status":"publish","type":"post","link":"https:\/\/www.devopsschool.com\/blog\/step-by-step-guide-to-deploy-aro-azure-red-hat-openshift\/","title":{"rendered":"OpenShift Install &amp; Configurations using Azure Red Hat OpenShift (ARO) with Azure Az Command line"},"content":{"rendered":"\n<p>]If you&#8217;re aiming to <strong>learn OpenShift<\/strong> without having a Red Hat subscription and want to deploy it on <strong>Azure using Azure Red Hat OpenShift (ARO)<\/strong>, you\u2019re in a great spot. ARO <strong>doesn\u2019t require a separate Red Hat license<\/strong> \u2014 everything is billed through Azure pay-as-you-go. Let\u2019s walk through it step by step.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\"><\/h1>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 Prerequisites<\/h2>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Requirement<\/th><th>Details<\/th><\/tr><\/thead><tbody><tr><td>\ud83d\udd11 Azure Account<\/td><td>Free or Pay-as-you-go \u2014 <a href=\"https:\/\/azure.microsoft.com\/free\/\" target=\"_blank\" rel=\"noopener\">Sign up here<\/a><\/td><\/tr><tr><td>\ud83e\udde0 Basic CLI knowledge<\/td><td>You&#8217;ll use Azure CLI and <code>az aro<\/code> commands<\/td><\/tr><tr><td>\ud83d\udee0\ufe0f Tools to install<\/td><td>Azure CLI, ARO CLI extension, jq<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udce6 Step 1: Install Required Tools<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">A. Install Azure CLI<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">brew install azure-cli\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">B. Login to Azure<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">az login\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">C. Install ARO CLI Extension<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">az extension add --name aro\naz extension update --name aro\n<\/code><\/span><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udccd Step 2: Set Up Azure Resources<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">A. Set variables (use your own values)<\/h3>\n\n\n<pre class=\"wp-block-code\"><span><code class=\"hljs\">RESOURCEGROUP=aro-rg\nLOCATION=eastus\nVNET=aro-vnet\nCLUSTER=aro-cluster\nARO_SUBNET=aro-subnet\nWORKER_SUBNET=worker-subnet\n<\/code><\/span><\/pre>\n\n\n<h3 class=\"wp-block-heading\">B. Create Resource Group<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">az group create --name $RESOURCEGROUP --location $LOCATION\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">C. Create Virtual Network and Subnets<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">az network vnet create \\\n  --resource-group $RESOURCEGROUP \\\n  --name $VNET \\\n  --address-prefixes <span class=\"hljs-number\">10.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span>\/<span class=\"hljs-number\">22<\/span> \\\n  --subnet-name $ARO_SUBNET \\\n  --subnet-prefix <span class=\"hljs-number\">10.0<\/span><span class=\"hljs-number\">.0<\/span><span class=\"hljs-number\">.0<\/span>\/<span class=\"hljs-number\">23<\/span>\n\naz network vnet subnet create \\\n  --resource-group $RESOURCEGROUP \\\n  --vnet-name $VNET \\\n  --name $WORKER_SUBNET \\\n  --address-prefixes <span class=\"hljs-number\">10.0<\/span><span class=\"hljs-number\">.2<\/span><span class=\"hljs-number\">.0<\/span>\/<span class=\"hljs-number\">23<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd10 Step 3: Register Required Azure Providers<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"CSS\" data-shcb-language-slug=\"css\"><span><code class=\"hljs language-css\"><span class=\"hljs-selector-tag\">az<\/span> <span class=\"hljs-selector-tag\">provider<\/span> <span class=\"hljs-selector-tag\">register<\/span> <span class=\"hljs-selector-tag\">-n<\/span> <span class=\"hljs-selector-tag\">Microsoft<\/span><span class=\"hljs-selector-class\">.RedHatOpenShift<\/span>\n<span class=\"hljs-selector-tag\">az<\/span> <span class=\"hljs-selector-tag\">provider<\/span> <span class=\"hljs-selector-tag\">register<\/span> <span class=\"hljs-selector-tag\">-n<\/span> <span class=\"hljs-selector-tag\">Microsoft<\/span><span class=\"hljs-selector-class\">.Authorization<\/span>\n<span class=\"hljs-selector-tag\">az<\/span> <span class=\"hljs-selector-tag\">provider<\/span> <span class=\"hljs-selector-tag\">register<\/span> <span class=\"hljs-selector-tag\">-n<\/span> <span class=\"hljs-selector-tag\">Microsoft<\/span><span class=\"hljs-selector-class\">.Network<\/span>\n<span class=\"hljs-selector-tag\">az<\/span> <span class=\"hljs-selector-tag\">provider<\/span> <span class=\"hljs-selector-tag\">register<\/span> <span class=\"hljs-selector-tag\">-n<\/span> <span class=\"hljs-selector-tag\">Microsoft<\/span><span class=\"hljs-selector-class\">.Compute<\/span>\n<span class=\"hljs-selector-tag\">az<\/span> <span class=\"hljs-selector-tag\">provider<\/span> <span class=\"hljs-selector-tag\">register<\/span> <span class=\"hljs-selector-tag\">-n<\/span> <span class=\"hljs-selector-tag\">Microsoft<\/span><span class=\"hljs-selector-class\">.Storage<\/span>\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">CSS<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">css<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Wait for a few minutes until all are registered.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\ude80 Step 4: Create the ARO Cluster<\/h2>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">az aro create \\\n  --resource-group $RESOURCEGROUP \\\n  --name $CLUSTER \\\n  --vnet $VNET \\\n  --master-subnet $ARO_SUBNET \\\n  --worker-subnet $WORKER_SUBNET\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>This will take <strong>35\u201345 minutes<\/strong>.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83d\udd10 Step 5: Get Cluster Credentials and Access Console<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Get Admin Credentials:<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">az aro <span class=\"hljs-keyword\">list<\/span>-credentials --name $CLUSTER --resource-group $RESOURCEGROUP\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h3 class=\"wp-block-heading\">Get Console URL:<\/h3>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-6\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">az aro show --name $CLUSTER --resource-group $RESOURCEGROUP --query <span class=\"hljs-string\">\"consoleProfile.url\"<\/span> -o tsv\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-6\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>You can now log in with the <code>kubeadmin<\/code> username and the password provided.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\u2705 Clean Up (After 12 hours)<\/h2>\n\n\n\n<p>To delete the cluster and avoid cost:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-7\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">az aro delete --name $CLUSTER --resource-group $RESOURCEGROUP\naz group delete --name $RESOURCEGROUP --yes --no-wait\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-7\"><span class=\"shcb-language__label\">Code language:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h1 class=\"wp-block-heading\">\ud83d\udcb0 ARO Cost Estimate for 12 Hours<\/h1>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><thead><tr><th>Resource<\/th><th>Cost Per Hour<\/th><th>Total for 12h<\/th><\/tr><\/thead><tbody><tr><td>Control Plane (3 x D8s_v3)<\/td><td>~$0.40 \u00d7 3<\/td><td>~$14.40<\/td><\/tr><tr><td>Infra + Workers (4 x D4s_v3)<\/td><td>~$0.20 \u00d7 4<\/td><td>~$9.60<\/td><\/tr><tr><td>Load Balancers + Egress<\/td><td>~$0.05<\/td><td>~$0.60<\/td><\/tr><tr><td><strong>Total Estimated<\/strong><\/td><td>\u2014<\/td><td><strong>~$25\u2013$30<\/strong><\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p>\u2705 <strong>Red Hat licensing is included automatically<\/strong> in Azure pricing.<\/p>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<h2 class=\"wp-block-heading\">\ud83e\udde0 Bonus: No Red Hat Account Needed<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You do <strong>not<\/strong> need to register with Red Hat or bring a license<\/li>\n\n\n\n<li>You do <strong>not<\/strong> need to download a pull secret<\/li>\n\n\n\n<li>ARO is <strong>fully managed and billed by Azure<\/strong><\/li>\n<\/ul>\n\n\n\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>]If you&#8217;re aiming to learn OpenShift without having a Red Hat subscription and want to deploy it on Azure using Azure Red Hat OpenShift (ARO), you\u2019re in a great spot&#8230;. <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"_joinchat":[],"footnotes":""},"categories":[5153],"tags":[],"class_list":["post-49141","post","type-post","status-publish","format-standard","hentry","category-openshift"],"_links":{"self":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49141","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/comments?post=49141"}],"version-history":[{"count":2,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49141\/revisions"}],"predecessor-version":[{"id":49278,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/posts\/49141\/revisions\/49278"}],"wp:attachment":[{"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/media?parent=49141"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/categories?post=49141"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devopsschool.com\/blog\/wp-json\/wp\/v2\/tags?post=49141"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}