다음을 통해 공유


빠른 시작: Azure Resource Manager 템플릿 또는 Bicep 파일을 사용하여 Azure Red Hat OpenShift 클러스터 배포

이 문서에서는 ARM 템플릿(Azure Resource Manager 템플릿) 또는 Bicep을 사용하여 Azure Red Hat OpenShift 클러스터를 만드는 방법을 설명합니다. PowerShell 또는 Azure CLI(Azure 명령줄 인터페이스)를 사용하여 Azure Red Hat OpenShift 클러스터를 배포할 수 있습니다.

Azure Resource Manager 템플릿은 프로젝트에 대한 인프라 및 구성을 정의하는 JSON(JavaScript Object Notation) 파일입니다. 이 템플릿은 선언적 구문을 사용합니다. 배포를 만들기 위한 프로그래밍 명령의 시퀀스를 작성하지 않고 의도하는 배포를 설명합니다.

Bicep은 선언적 구문을 사용하여 Azure 리소스를 배포하는 DSL(도메인 특정 언어)입니다. Bicep 파일에서 Azure에 배포하려는 인프라를 정의한 다음, 개발 수명 주기 내내 해당 파일을 사용하여 인프라를 반복적으로 배포합니다. 리소스는 일관된 방식으로 배포됩니다.

필수 조건

ARM 템플릿 또는 Bicep 파일 만들기

ARM 템플릿(Azure Resource Manager 템플릿) 또는 Azure Bicep 파일을 선택합니다. 그런 다음 Azure 명령줄(azure-cli) 또는 PowerShell을 사용하여 템플릿을 배포할 수 있습니다.

ARM 템플릿 만들기

다음 예에서는 Azure RedHat OpenShift 클러스터에 대해 구성된 경우 ARM 템플릿이 어떻게 표시되는지 보여 줍니다.

템플릿은 세 가지 Azure 리소스를 정의합니다.

더 많은 Azure Red Hat OpenShift 템플릿 샘플은 Red Hat OpenShift 웹 사이트에서 찾을 수 있습니다.

다음 예를 azuredeploy.json으로 저장합니다.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
      "location" : {
        "type": "string",
        "defaultValue": "eastus",
        "metadata": {
          "description": "Location"
        }
      },
      "domain": {
          "type": "string",
          "defaultValue": "",
          "metadata": {
              "description": "Domain Prefix"
          }
      },
      "pullSecret": {
          "type": "string",
          "metadata": {
              "description": "Pull secret from cloud.redhat.com. The json should be input as a string"
          }
      },
      "clusterVnetName": {
          "type": "string",
          "defaultValue": "aro-vnet",
          "metadata": {
              "description": "Name of ARO vNet"
          }
      },
      "clusterVnetCidr": {
          "type": "string",
          "defaultValue": "10.100.0.0/15",
          "metadata": {
              "description": "ARO vNet Address Space"
          }
      },
      "workerSubnetCidr": {
          "type": "string",
          "defaultValue": "10.100.70.0/23",
          "metadata": {
              "description": "Worker node subnet address space"
          }
      },
      "masterSubnetCidr": {
          "type": "string",
          "defaultValue": "10.100.76.0/24",
          "metadata": {
              "description": "Master node subnet address space"
          }
      },
      "masterVmSize" : {
          "type": "string",
          "defaultValue": "Standard_D8s_v3",
          "metadata": {
              "description": "Master Node VM Type"
          }
      },
      "workerVmSize": {
          "type": "string",
          "defaultValue": "Standard_D4s_v3",
          "metadata": {
              "description": "Worker Node VM Type"
          }
      },
      "workerVmDiskSize": {
          "type" : "int",
          "defaultValue": 128,
          "minValue": 128,
          "metadata": {
              "description": "Worker Node Disk Size in GB"
          }
      },
      "workerCount": {
          "type": "int",
          "defaultValue": 3,
          "minValue": 3,
          "metadata": {
              "description": "Number of Worker Nodes"
          }
      },
      "podCidr": {
          "type": "string",
          "defaultValue": "10.128.0.0/14",
          "metadata": {
              "description": "Cidr for Pods"
          }
      },
      "serviceCidr": {
          "type": "string",
          "defaultValue": "172.30.0.0/16",
          "metadata": {
              "decription": "Cidr of service"
          }
      },
      "clusterName" : {
        "type": "string",
        "metadata": {
          "description": "Unique name for the cluster"
        }
      },
      "tags": {
          "type": "object",
          "defaultValue" : {
              "env": "Dev",
              "dept": "Ops"
          },
          "metadata": {
              "description": "Tags for resources"
          }
      },
      "apiServerVisibility": {
          "type": "string",
          "allowedValues": [
              "Private",
              "Public"
          ],
          "defaultValue": "Public",
          "metadata": {
              "description": "Api Server Visibility"
          }
      },
      "ingressVisibility": {
          "type": "string",
          "allowedValues": [
              "Private",
              "Public"
          ],
          "defaultValue": "Public",
          "metadata": {
              "description": "Ingress Visibility"
          }
      },
      "aadClientId" : {
        "type": "string",
        "metadata": {
          "description": "The Application ID of an Azure Active Directory client application"
        }
      },
      "aadObjectId": {
          "type": "string",
          "metadata": {
              "description": "The Object ID of an Azure Active Directory client application"
          }
      },
      "aadClientSecret" : {
        "type":"securestring",
        "metadata": {
          "description": "The secret of an Azure Active Directory client application"
        }
      },
      "rpObjectId": {
          "type": "String",
          "metadata": {
              "description": "The ObjectID of the Resource Provider Service Principal"
          }
      }
    },
    "variables": {
        "contribRole": "[concat('/subscriptions/', subscription().subscriptionId, '/providers/Microsoft.Authorization/roleDefinitions/', 'b24988ac-6180-42a0-ab88-20f7382dd24c')]"
    },
    "resources": [
        {
            "type": "Microsoft.Network/virtualNetworks",
            "apiVersion": "2020-05-01",
            "name": "[parameters('clusterVnetName')]",
            "location": "[parameters('location')]",
            "tags": "[parameters('tags')]",
            "properties": {
                "addressSpace": {
                "addressPrefixes": [
                    "[parameters('clusterVnetCidr')]"
                    ]
                },
                "subnets": [
                {
                    "name": "master",
                    "properties": {
                        "addressPrefix": "[parameters('masterSubnetCidr')]",
                        "serviceEndpoints": [
                            {
                                "service": "Microsoft.ContainerRegistry"
                            }
                        ],
                        "privateLinkServiceNetworkPolicies": "Disabled"
                    }
                },
                {
                    "name": "worker",
                    "properties": {
                        "addressPrefix": "[parameters('workerSubnetCidr')]",
                        "serviceEndpoints": [
                            {
                                "service": "Microsoft.ContainerRegistry"
                            }
                        ]
                    }
                }]
            }
        },
        {
            "type": "Microsoft.Network/virtualNetworks/providers/roleAssignments",
            "apiVersion": "2018-09-01-preview",
            "name": "[concat(parameters('clusterVnetName'), '/Microsoft.Authorization/', guid(resourceGroup().id, deployment().name, parameters('aadObjectId')))]",
            "dependsOn": [
                "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
            ],
            "properties": {
                "roleDefinitionId": "[variables('contribRole')]",
                "principalId":"[parameters('aadObjectId')]"
            }
        },
        {
            "type": "Microsoft.Network/virtualNetworks/providers/roleAssignments",
            "apiVersion": "2018-09-01-preview",
            "name": "[concat(parameters('clusterVnetName'), '/Microsoft.Authorization/', guid(resourceGroup().id, deployment().name, parameters('rpObjectId')))]",
            "dependsOn": [
                "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
            ],
            "properties": {
                "roleDefinitionId": "[variables('contribRole')]",
                "principalId":"[parameters('rpObjectId')]"
            }
        },
        {
            "type": "Microsoft.RedHatOpenShift/OpenShiftClusters",
            "apiVersion": "2020-04-30",
            "name": "[parameters('clusterName')]",
            "location": "[parameters('location')]",
            "tags": "[parameters('tags')]",
            "dependsOn": [
                "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
            ],
            "properties": {
                "clusterProfile": {
                    "domain": "[parameters('domain')]",
                    "resourceGroupId": "[concat('/subscriptions/', subscription().subscriptionId,'/resourceGroups/aro-', parameters('domain'))]",
                    "pullSecret": "[parameters('pullSecret')]"
                },
                "networkProfile": {
                    "podCidr": "[parameters('podCidr')]",
                    "serviceCidr": "[parameters('serviceCidr')]"
                },
                "servicePrincipalProfile": {
                    "clientId": "[parameters('aadClientId')]",
                    "clientSecret": "[parameters('aadClientSecret')]"
                },
                "masterProfile": {
                    "vmSize": "[parameters('masterVmSize')]",
                    "subnetId": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'master')]"
                },
                "workerProfiles": [
                    {
                        "name": "worker",
                        "vmSize": "[parameters('workerVmSize')]",
                        "diskSizeGB": "[parameters('workerVmDiskSize')]",
                        "subnetId": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'worker')]",
                        "count": "[parameters('workerCount')]"
                    }
                ],
                "apiserverProfile": {
                    "visibility": "[parameters('apiServerVisibility')]"
                },
                "ingressProfiles": [
                    {
                        "name": "default",
                        "visibility": "[parameters('ingressVisibility')]"
                    }
                ]
            }
        }
    ],
    "outputs": {
         "clusterCredentials": {
             "type": "object",
             "value": "[listCredentials(resourceId('Microsoft.RedHatOpenShift/OpenShiftClusters', parameters('clusterName')), '2020-04-30')]"
         },
         "oauthCallbackURL": {
             "type": "string",
             "value": "[concat('https://oauth-openshift.apps.', parameters('domain'), '.', parameters('location'), '.aroapp.io/oauth2callback/AAD')]"
         }
    }
}

Bicep 파일 만들기

다음 예에서는 Azure Red Hat OpenShift 클러스터에 대해 구성된 경우 Azure Bicep 파일이 어떻게 표시되는지 보여 줍니다.

Bicep 파일은 세 가지 Azure 리소스를 정의합니다.

더 많은 Azure Red Hat OpenShift 템플릿은 Red Hat OpenShift 웹 사이트에서 찾을 수 있습니다.

Azure Red Hat OpenShift 클러스터에 대한 정의를 포함하는 다음 Bicep 파일을 만듭니다. 다음 예에서는 구성 시 Bicep 파일이 어떻게 표시되는지 보여 줍니다.

다음 파일을 azuredeploy.bicep으로 저장합니다.

@description('Location')
param location string = 'eastus'

@description('Domain Prefix')
param domain string = ''

@description('Pull secret from cloud.redhat.com. The json should be input as a string')
param pullSecret string

@description('Name of ARO vNet')
param clusterVnetName string = 'aro-vnet'

@description('ARO vNet Address Space')
param clusterVnetCidr string = '10.100.0.0/15'

@description('Worker node subnet address space')
param workerSubnetCidr string = '10.100.70.0/23'

@description('Master node subnet address space')
param masterSubnetCidr string = '10.100.76.0/24'

@description('Master Node VM Type')
param masterVmSize string = 'Standard_D8s_v3'

@description('Worker Node VM Type')
param workerVmSize string = 'Standard_D4s_v3'

@description('Worker Node Disk Size in GB')
@minValue(128)
param workerVmDiskSize int = 128

@description('Number of Worker Nodes')
@minValue(3)
param workerCount int = 3

@description('Cidr for Pods')
param podCidr string = '10.128.0.0/14'

@metadata({
  description: 'Cidr of service'
})
param serviceCidr string = '172.30.0.0/16'

@description('Unique name for the cluster')
param clusterName string

@description('Tags for resources')
param tags object = {
  env: 'Dev'
  dept: 'Ops'
}

@description('Api Server Visibility')
@allowed([
  'Private'
  'Public'
])
param apiServerVisibility string = 'Public'

@description('Ingress Visibility')
@allowed([
  'Private'
  'Public'
])
param ingressVisibility string = 'Public'

@description('The Application ID of an Azure Active Directory client application')
param aadClientId string

@description('The Object ID of an Azure Active Directory client application')
param aadObjectId string

@description('The secret of an Azure Active Directory client application')
@secure()
param aadClientSecret string

@description('The ObjectID of the Resource Provider Service Principal')
param rpObjectId string

@description('Specify if FIPS validated crypto modules are used')
@allowed([
  'Enabled'
  'Disabled'
])
param fips string = 'Disabled'

@description('Specify if master VMs are encrypted at host')
@allowed([
  'Enabled'
  'Disabled'
])
param masterEncryptionAtHost string = 'Disabled'

@description('Specify if worker VMs are encrypted at host')
@allowed([
  'Enabled'
  'Disabled'
])
param workerEncryptionAtHost string = 'Disabled'

var contributorRoleDefinitionId = resourceId('Microsoft.Authorization/roleDefinitions', 'b24988ac-6180-42a0-ab88-20f7382dd24c')
var resourceGroupId = '/subscriptions/${subscription().subscriptionId}/resourceGroups/aro-${domain}-${location}'
var masterSubnetId=resourceId('Microsoft.Network/virtualNetworks/subnets', clusterVnetName, 'master')
var workerSubnetId=resourceId('Microsoft.Network/virtualNetworks/subnets', clusterVnetName, 'worker')

resource clusterVnetName_resource 'Microsoft.Network/virtualNetworks@2020-05-01' = {
  name: clusterVnetName
  location: location
  tags: tags
  properties: {
    addressSpace: {
      addressPrefixes: [
        clusterVnetCidr
      ]
    }
    subnets: [
      {
        name: 'master'
        properties: {
          addressPrefix: masterSubnetCidr
          serviceEndpoints: [
            {
              service: 'Microsoft.ContainerRegistry'
            }
          ]
          privateLinkServiceNetworkPolicies: 'Disabled'
        }
      }
      {
        name: 'worker'
        properties: {
          addressPrefix: workerSubnetCidr
          serviceEndpoints: [
            {
              service: 'Microsoft.ContainerRegistry'
            }
          ]
        }
      }
    ]
  }
}

resource clusterVnetName_Microsoft_Authorization_id_name_aadObjectId 'Microsoft.Authorization/roleAssignments@2020-10-01-preview' = {
  name: guid(aadObjectId, clusterVnetName_resource.id, contributorRoleDefinitionId)
  scope: clusterVnetName_resource
  properties: {
    roleDefinitionId: contributorRoleDefinitionId
    principalId: aadObjectId
    principalType: 'ServicePrincipal'
  }
}

resource clusterVnetName_Microsoft_Authorization_id_name_rpObjectId 'Microsoft.Authorization/roleAssignments@2020-10-01-preview' = {
  name: guid(rpObjectId, clusterVnetName_resource.id, contributorRoleDefinitionId)
  scope: clusterVnetName_resource
  properties: {
    roleDefinitionId: contributorRoleDefinitionId
    principalId: rpObjectId
    principalType: 'ServicePrincipal'
  }
}

resource clusterName_resource 'Microsoft.RedHatOpenShift/OpenShiftClusters@2023-04-01' = {
  name: clusterName
  location: location
  tags: tags
  properties: {
    clusterProfile: {
      domain: domain
      resourceGroupId: resourceGroupId
      pullSecret: pullSecret
      fipsValidatedModules: fips
    }
    networkProfile: {
      podCidr: podCidr
      serviceCidr: serviceCidr
    }
    servicePrincipalProfile: {
      clientId: aadClientId
      clientSecret: aadClientSecret
    }
    masterProfile: {
      vmSize: masterVmSize
      subnetId: masterSubnetId
      encryptionAtHost: masterEncryptionAtHost
    }
    workerProfiles: [
      {
        name: 'worker'
        vmSize: workerVmSize
        diskSizeGB: workerVmDiskSize
        subnetId: workerSubnetId
        count: workerCount
        encryptionAtHost: workerEncryptionAtHost
      }
    ]
    apiserverProfile: {
      visibility: apiServerVisibility
    }
    ingressProfiles: [
      {
        name: 'default'
        visibility: ingressVisibility
      }
    ]
  }
  dependsOn: [
    clusterVnetName_resource
  ]
}

azuredeploy.json 템플릿 배포

azuredeploy.json 템플릿은 Azure Red Hat OpenShift 클러스터를 배포하는 데 사용됩니다. 필수 매개 변수는 다음과 같습니다.

참고 항목

domain 매개 변수에 대해 OpenShift 콘솔 및 API 서버에 대해 자동 생성된 DNS 이름의 일부로 사용될 도메인 접두사를 지정합니다. 이 접두사는 클러스터 VM을 호스트하기 위해 만들어진 리소스 그룹 이름의 일부로도 사용됩니다.

속성 설명 유효한 옵션 기본값
domain 클러스터의 도메인 접두사입니다. 없음
pullSecret Red Hat OpenShift Cluster Manager 웹 사이트에서 얻은 풀 비밀입니다.
clusterName 클러스터의 이름입니다.
aadClientId Microsoft Entra 클라이언트 애플리케이션의 애플리케이션 ID(GUID)입니다.
aadObjectId Microsoft Entra 클라이언트 애플리케이션에 대한 서비스 주체의 개체 ID(GUID)입니다.
aadClientSecret Microsoft Entra 클라이언트 애플리케이션에 대한 서비스 주체의 클라이언트 암호(보안 문자열)입니다.
rpObjectId 리소스 공급자 서비스 주체의 개체 ID(GUID)입니다.

아래 템플릿 매개 변수에는 기본값이 있습니다. 지정할 수 있지만 명시적으로 필요하지는 않습니다.

속성 설명 유효한 옵션 기본값
location 새 ARO 클러스터의 위치입니다. 이 위치는 리소스 그룹 지역과 동일하거나 다를 수 있습니다. eastus
clusterVnetName ARO 클러스터의 가상 네트워크 이름입니다. aro-vnet
clusterVnetCidr CIDR(Classless Inter-Domain Routing) 표기법의 ARO 가상 네트워크 주소 공간입니다. 10.100.0.0/15
workerSubnetCidr 작업자 노드 서브넷의 주소 공간(CIDR 표기법). 10.100.70.0/23
masterSubnetCidr CIDR 표기법으로 된 컨트롤 플레인 노드 서브넷의 주소 공간입니다. 10.100.76.0/24
masterVmSize 컨트롤 플레인 노드의 가상 머신 형식/크기입니다. Standard_D8s_v3
workerVmSize 작업자 노드의 가상 머신 형식/크기입니다. Standard_D4s_v3
workerVmDiskSize 작업자 노드의 디스크 크기(GB)입니다. 128
workerCount 작업자 노드 수. 3
podCidr CIDR 표기법으로 된 Pod의 주소 공간입니다. 10.128.0.0/14
serviceCidr CIDR 표기법으로 된 서비스의 주소 공간입니다. 172.30.0.0/16
tags 리소스 태그의 해시 테이블입니다. @{env = 'Dev'; dept = 'Ops'}
apiServerVisibility API 서버의 표시 유형(Public 또는 Private). 공공 사업
ingressVisibility 수신(입구) 표시 유형(Public 또는 Private). 공공 사업

다음 섹션에서는 PowerShell 또는 Azure CLI를 사용하는 지침을 제공합니다.

PowerShell 단계

PowerShell을 사용하는 경우 다음 단계를 수행합니다.

시작하기 전에 - PowerShell

이 문서의 명령을 실행하기 전에 Connect-AzAccount를 실행해야 할 수도 있습니다. 계속하기 전에 Azure에 연결되어 있는지 확인합니다. 연결 여부를 확인하려면 Get-AzContext를 실행하여 활성 Azure 구독에 대한 액세스 권한이 있는지 확인합니다.

참고 항목

이 템플릿은 Red Hat OpenShift Cluster Manager 웹 사이트에서 얻은 풀 비밀 텍스트를 사용합니다. 계속하기 전에 풀 비밀을 pull-secret.txt로 로컬에 저장했는지 확인합니다.

$rhosPullSecret= Get-Content .\pull-secret.txt -Raw # the pull secret text that was obtained from the Red Hat OpenShift Cluster Manager website

다음 매개 변수를 환경 변수로 정의 - PowerShell

$resourceGroup="aro-rg"	     # the new resource group for the cluster
$location="eastus"    		 # the location of the new ARO cluster
$domain="mydomain"           # the domain prefix for the cluster  
$aroClusterName="cluster"    # the name of the cluster

필요한 리소스 공급자 등록 - PowerShell

구독에 Microsoft.RedHatOpenShift, Microsoft.Compute, Microsoft.StorageMicrosoft.Authorization 리소스 공급자를 등록합니다.

Register-AzResourceProvider -ProviderNamespace Microsoft.RedHatOpenShift
Register-AzResourceProvider -ProviderNamespace Microsoft.Compute
Register-AzResourceProvider -ProviderNamespace Microsoft.Storage
Register-AzResourceProvider -ProviderNamespace Microsoft.Authorization

새 리소스 그룹 만들기 - PowerShell

New-AzResourceGroup -Name $resourceGroup -Location $location

새 서비스 주체 만들기 및 역할 할당 - PowerShell

$suffix=Get-Random # random suffix for the Service Principal
$spDisplayName="sp-$resourceGroup-$suffix"
$azureADAppSp = New-AzADServicePrincipal -DisplayName $spDisplayName -Role Contributor

New-AzRoleAssignment -ObjectId $azureADAppSp.Id -RoleDefinitionName 'User Access Administrator' -ResourceGroupName $resourceGroup -ObjectType 'ServicePrincipal'
New-AzRoleAssignment -ObJectId $azureADAppSp.Id -RoleDefinitionName 'Contributor' -ResourceGroupName $resourceGroup -ObjectType 'ServicePrincipal'

서비스 주체 암호 가져오기 - PowerShell

$aadClientSecretDigest = ConvertTo-SecureString -String $azureADAppSp.PasswordCredentials.SecretText -AsPlainText -Force

OpenShift 리소스 공급자에 대한 서비스 주체 가져오기 - PowerShell

$rpOpenShift =  Get-AzADServicePrincipal -DisplayName 'Azure Red Hat OpenShift RP' | Select-Object -ExpandProperty Id -Property Id -First 1

클러스터를 배포하기 전에 매개 변수 확인 - PowerShell

# setup the parameters for the deployment
$templateParams = @{  
    domain = $domain
    clusterName = $aroClusterName
    location = $location
    aadClientId = $azureADAppSp.AppId
    aadObjectId = $azureADAppSp.Id
    aadClientSecret = $aadClientSecretDigest 
    rpObjectId = $rpOpenShift.Id
    pullSecret = $rhosPullSecret
}

Write-Verbose (ConvertTo-Json $templateParams) -Verbose

ARM 템플릿을 사용하여 Azure Red Hat OpenShift 클러스터 배포 - PowerShell

New-AzResourceGroupDeployment -ResourceGroupName $resourceGroup @templateParams `
    -TemplateFile azuredeploy.json

클러스터에 연결

새 클러스터에 연결하려면 Azure Red Hat OpenShift 4 클러스터에 연결의 단계를 검토합니다.

리소스 정리 - PowerShell

완료되면 다음 명령을 실행하여 리소스 그룹과 이 문서에서 만든 모든 리소스를 삭제합니다.

Remove-AzResourceGroup -Name $resourceGroup -Force

Azure CLI 단계

Azure CLI를 사용하는 경우 다음 단계를 수행합니다.

시작하기 전에 - Azure CLI

이 문서의 명령을 실행하기 전에 az login을 실행해야 할 수도 있습니다. 계속하기 전에 Azure에 연결되어 있는지 확인합니다. 연결 여부를 확인하려면 az account list를 실행하고 활성 Azure 구독에 대한 액세스 권한이 있는지 확인합니다.

참고 항목

이 템플릿은 Red Hat OpenShift Cluster Manager 웹 사이트에서 얻은 풀 비밀 텍스트를 사용합니다. 계속하기 전에 해당 비밀을 pull-secret.txt로 로컬에 저장했는지 확인합니다.

PULL_SECRET=$(cat pull-secret.txt)    # the pull secret text 

다음 매개 변수를 환경 변수로 정의 - Azure CLI

RESOURCEGROUP=aro-rg            # the new resource group for the cluster
LOCATION=eastus                 # the location of the new cluster
DOMAIN=mydomain                 # the domain prefix for the cluster
ARO_CLUSTER_NAME=aro-cluster    # the name of the cluster

필요한 리소스 공급자 등록 - Azure CLI

구독에 Microsoft.RedHatOpenShift, Microsoft.Compute, Microsoft.StorageMicrosoft.Authorization 리소스 공급자를 등록합니다.

az provider register --namespace 'Microsoft.RedHatOpenShift' --wait
az provider register --namespace 'Microsoft.Compute' --wait
az provider register --namespace 'Microsoft.Storage' --wait
az provider register --namespace 'Microsoft.Authorization' --wait

새 리소스 그룹 만들기 - Azure CLI

az group create --name $RESOURCEGROUP --location $LOCATION

새로운 Microsoft Entra 애플리케이션에 대한 서비스 주체 만들기

  • Azure CLI
az ad sp create-for-rbac --name "sp-$RG_NAME-${RANDOM}" > app-service-principal.json
SP_CLIENT_ID=$(jq -r '.appId' app-service-principal.json)
SP_CLIENT_SECRET=$(jq -r '.password' app-service-principal.json)
SP_OBJECT_ID=$(az ad sp show --id $SP_CLIENT_ID | jq -r '.id')

새 서비스 주체에 기여자 역할 할당 - Azure CLI

az role assignment create \
    --role 'User Access Administrator' \
    --assignee-object-id $SP_OBJECT_ID \
    --scope $SCOPE \
    --assignee-principal-type 'ServicePrincipal'

az role assignment create \
    --role 'Contributor' \
    --assignee-object-id $SP_OBJECT_ID \
    --scope $SCOPE \
    --assignee-principal-type 'ServicePrincipal'

OpenShift 리소스 공급자에 대한 서비스 주체 개체 ID 가져오기 - Azure CLI

ARO_RP_SP_OBJECT_ID=$(az ad sp list --display-name "Azure Red Hat OpenShift RP" --query [0].id -o tsv)

클러스터 배포 - Azure CLI

az deployment group create \
    --name aroDeployment \
    --resource-group $RESOURCEGROUP \
    --template-file azuredeploy.json \
    --parameters location=$LOCATION \
    --parameters domain=$DOMAIN \
    --parameters pullSecret=$PULL_SECRET \
    --parameters clusterName=$ARO_CLUSTER_NAME \
    --parameters aadClientId=$SP_CLIENT_ID \
    --parameters aadObjectId=$SP_OBJECT_ID \
    --parameters aadClientSecret=$SP_CLIENT_SECRET \
    --parameters rpObjectId=$ARO_RP_SP_OBJECT_ID
az deployment group create \
    --name aroDeployment \
    --resource-group $RESOURCEGROUP \
    --template-file azuredeploy.bicep \
    --parameters location=$LOCATION \
    --parameters domain=$DOMAIN \
    --parameters pullSecret=$PULL_SECRET \
    --parameters clusterName=$ARO_CLUSTER_NAME \
    --parameters aadClientId=$SP_CLIENT_ID \
    --parameters aadObjectId=$SP_OBJECT_ID \
    --parameters aadClientSecret=$SP_CLIENT_SECRET \
    --parameters rpObjectId=$ARO_RP_SP_OBJECT_ID

클러스터에 연결 - Azure CLI

새 클러스터에 연결하려면 Azure Red Hat OpenShift 4 클러스터에 연결의 단계를 검토합니다.

리소스 정리 - Azure CLI

완료되면 다음 명령을 실행하여 리소스 그룹과 이 문서에서 만든 모든 리소스를 삭제합니다.

az aro delete --resource-group $RESOURCEGROUP --name $CLUSTER

문제가 있나요? ARO(Azure Red Hat Openshift) 리포지토리에서 문제를 열어 GitHub에서 알려 주세요.

다음 단계

이 문서에서 ARM 템플릿과 Bicep을 모두 사용하여 OpenShift 4를 실행하는 Azure Red Hat OpenShift 클러스터를 만드는 방법을 알아보았습니다.

Microsoft Entra ID를 사용하여 인증을 위해 클러스터를 구성하는 방법을 알아보려면 다음 문서로 이동합니다.