Поделиться через


Создание кластера Azure Red Hat OpenShift с управляемыми удостоверениями (предварительная версия)

Это важно

В настоящее время эта функция Azure Red Hat OpenShift доступна только в предварительной версии. Предварительные версии функций доступны на основе самообслуживания и требуют активации пользователем. Предварительные версии предоставляются как есть и по мере доступности, и они исключены из соглашений на уровне обслуживания и ограниченной гарантии. Предварительные версии Azure Red Hat OpenShift частично охватываются поддержкой клиентов на основе лучших усилий. Как таковые, эти функции не предназначены для использования в производстве.

В этой статье объясняется, как развернуть кластер Azure Red Hat OpenShift с использованием управляемых удостоверений. Существующий кластер, использующий учетная запись службы, нельзя изменить для использования управляемого удостоверения. Необходимо создать новый кластер, использующий управляемое удостоверение в кластере Azure Red Hat OpenShift.

Azure Red Hat OpenShift — это служба с управлением OpenShift, которая поддерживает управляемые идентификации и идентификационные данные рабочей нагрузки. Управляемые идентификаторы и идентификаторы рабочих нагрузок помогают минимизировать риск при защите рабочих нагрузок и приложений, предоставляя токены с ограниченным сроком действия, а не долговечные учетные данные, такие как служебный принципал с учетными данными клиента-секретами.

Дополнительные сведения можно найти здесь

Предпосылки

Убедитесь, что вы используете Azure CLI версии 2.67.0 или более поздней. Используется az--version для поиска установленной версии Azure CLI. Если вам нужно установить или обновить, см. статью "Установка Azure CLI".

Для создания кластера OpenShift в Azure Red Hat OpenShift требуется не менее 44 ядер. Квота ресурсов Azure по умолчанию для новой подписки Azure не соответствует этому требованию. Чтобы запросить увеличение предела ресурсов, ознакомьтесь с разделом "Увеличение квот виртуальных ЦП семейства виртуальных машин".

44 ядра используются следующим образом:

  • Компьютер начальной загрузки: 8 ядер
  • Плоскость управления (главные компьютеры): 24 ядра
  • Вычисления (рабочие компьютеры): 12 ядер

После завершения установки компьютер начальной загрузки удаляется, а кластер использует в общей сложности 36 ядер. Дополнительные сведения см. в статье об установке в Azure.

Например, чтобы проверить текущую квоту подписки на наименьший поддерживаемый номер SKU семейства виртуальных машин "Standard DSv5":

LOCATION=eastus
az vm list-usage -l $LOCATION \
--query "[?contains(name.value, 'standardDSv5Family')]" -o table

Скачайте файл колесика расширения Azure Red Hat OpenShift (только предварительная версия)

Чтобы выполнить команды в этой статье, сначала скачайте файл колесика расширения Azure Red Hat OpenShift.https://aka.ms/az-aroext-latest Чтобы установить расширение , выполните следующую команду:

az extension add -s <path to downloaded whl file>

Проверка разрешений

В этой статье вы создадите группу ресурсов, содержащую виртуальную сеть и управляемые удостоверения для кластера. Чтобы создать группу ресурсов, вам потребуются разрешения участника и администратора доступа пользователей или разрешения владельца для группы ресурсов или подписки, содержащей ее.

Для создания набора управляемых удостоверений и назначения ролей для использования кластером вам также потребуются достаточные разрешения Microsoft Entra (либо пользователь организации, либо гость с назначенной ролью Администратор приложения). Дополнительные сведения см. в статье "Член и гости" , а также назначение ролей администратора и неадминистратора пользователям с идентификатором Microsoft Entra.

Регистрация поставщиков ресурсов

Для работы некоторых поставщиков ресурсов Azure, включая поставщика ресурсов Azure Red Hat OpenShift, требуется регистрация. Регистрация поставщика ресурсов создает субъект-службу внутри вашей подписки, которая разрешает поставщику ресурсов выполнять определенные действия, такие как создание ресурсов. Дополнительные сведения о регистрации поставщика ресурсов см. в разделе "Регистрация поставщика ресурсов".

  1. Если у вас несколько подписок Azure, выберите нужный идентификатор подписки:

    az account set --subscription <SUBSCRIPTION ID>
    
  2. Зарегистрируйте поставщик ресурсов Microsoft.RedHatOpenShift.

    az provider register -n Microsoft.RedHatOpenShift --wait
    
  3. Зарегистрируйте поставщик ресурсов Microsoft.Compute.

    az provider register -n Microsoft.Compute --wait
    
  4. Зарегистрируйте поставщик ресурсов Microsoft.Storage.

    az provider register -n Microsoft.Storage --wait
    
  5. Зарегистрируйте поставщик ресурсов Microsoft.Authorization.

    az provider register -n Microsoft.Authorization --wait
    

Получение секрета для извлечения Red Hat (необязательно)

Секрет аутентификации Azure Red Hat OpenShift не изменяет стоимость лицензии Red Hat OpenShift.

Секрет извлечения Red Hat позволяет кластеру получать доступ к реестрам контейнеров Red Hat, а также к другому содержимому, например операторам из OperatorHub. Этот шаг необязателен, но рекомендуется. Если вы решите добавить секрет извлечения позже, следуйте этим инструкциям. Поле cloud.openshift.com удаляется из секрета, даже если секрет по запросу содержит это поле. Это поле включает дополнительную функцию мониторинга, которая отправляет данные в RedHat и поэтому отключается по умолчанию. Сведения о включении этой функции см. в разделе Включение удаленного мониторинга здоровья.

  1. Перейдите на портал диспетчера кластеров Red Hat OpenShift и войдите в систему.

    Вам нужно войти в учетную запись Red Hat или создать новую учетную запись Red Hat с вашей бизнес-электронной почтой и принять условия.

  2. Выберите "Скачать секрет извлечения", а затем скачайте секрет извлечения, который будет использоваться с кластером Azure Red Hat OpenShift.

    Сохраните файл pull-secret.txt в безопасном месте. Файл используется в каждом создании кластера, если необходимо создать кластер, включающий примеры или операторы для Red Hat или сертифицированных партнеров.

    При выполнении команды az aro create вы можете ссылаться на секрет для извлечения, используя параметр --pull-secret @pull-secret.txt. Выполните az aro create из каталога, в котором был сохранен файл pull-secret.txt. В противном случае измените @pull-secret.txt на @/path/to/my/pull-secret.txt.

    Если вы копируете секрет извлечения или ссылаетесь на него в других сценариях, секрет извлечения должен быть отформатирован как допустимая строка JSON.

Подготовка личного домена для кластера (дополнительно)

При выполнении команды az aro create можно указать личный домен для кластера с использованием параметра --domain foo.example.com.

Замечание

Добавление доменного имени является необязательным при создании кластера с помощью Azure CLI. При добавлении кластера через портал требуется доменное имя (или префикс, используемый в составе автоматического создания DNS-имени для консоли OpenShift и серверов API). Дополнительные сведения см. в статье Краткое руководство: Развертывание кластера Azure Red Hat OpenShift с помощью портала Azure.

Если вы предоставляете личный домен для кластера, обратите внимание на следующие моменты:

  • После создания кластера необходимо создать две записи DNS A на DNS-сервере для указанного --domain :
    • API — указатель на IP-адрес сервера API
    • *.apps — указатель на IP-адрес входящего трафика
    • Извлеките эти значения, выполнив следующую команду после создания кластера: az aro show -n -g --query '{api:apiserverProfile.ip, ingress:ingressProfiles[0].ip}'.
  • Консоль OpenShift доступна по URL-адресу, например https://console-openshift-console.apps.example.comвместо встроенного домена https://console-openshift-console.apps.<random>.<location>.aroapp.io.
  • По умолчанию OpenShift использует самозаверяющие сертификаты для всех маршрутов, созданных в личных доменах *.apps.example.com. Если вы решили использовать пользовательский DNS после подключения к кластеру, необходимо следовать документации OpenShift, чтобы настроить пользовательский ЦС для контроллера входящего трафика и пользовательского ЦС для сервера API.

Установка

Вы можете использовать Azure CLI, Bicep или шаблон Azure Resource Manager (шаблон ARM) для развертывания кластера Azure Red Hat OpenShift, использующего управляемые удостоверения.

Установка с помощью Azure CLI

В этом разделе описывается, как использовать Azure CLI для создания кластера Azure Red Hat OpenShift с помощью управляемых удостоверений.

Создание виртуальной сети, содержащей две пустые подсети

Создайте виртуальную сеть, содержащую две пустые подсети. Если у вас есть существующая виртуальная сеть, которая соответствует вашим потребностям, пропустите этот шаг.

Сведения о сетях и требованиях см. в разделе "Сеть" для Azure Red Hat OpenShift.

  1. Задайте следующие переменные в среде оболочки, в которой выполняются az команды.

    LOCATION=eastus                 # the location of your cluster
    RESOURCEGROUP=aro-rg            # the name of the resource group where you want to create your cluster
    CLUSTER=cluster                 # the name of your cluster
    
  2. Создайте группу ресурсов.

    Группа ресурсов Azure — это логическая группа, в которой развертываются и управляются ресурсы Azure. При создании группы ресурсов вам будет предложено указать расположение. В этом расположении хранятся метаданные группы ресурсов, и здесь выполняются ваши ресурсы в Azure, если вы не указываете другой регион при создании ресурса. Создайте группу ресурсов с помощью команды az group create.

    Замечание

    Azure Red Hat OpenShift недоступен во всех регионах, где можно создать группу ресурсов Azure. Список регионов, где поддерживается Azure Red Hat OpenShift, см. в разделе Available regions (Доступные регионы).

    az group create \
      --location $LOCATION \
      --name $RESOURCEGROUP
    
  3. Создайте виртуальную сеть, главные и рабочие подсети в той же группе ресурсов, созданной ранее.

    Для кластеров Azure Red Hat OpenShift требуется виртуальная сеть с двумя пустыми подсетями для главных и рабочих узлов. Вы можете создать виртуальную сеть или использовать существующую виртуальную сеть.

    az network vnet create \
       --resource-group $RESOURCEGROUP \
       --name aro-vnet \
       --address-prefixes 10.0.0.0/22
    
    az network vnet subnet create \
       --resource-group $RESOURCEGROUP \
       --vnet-name aro-vnet \
       --name master \
       --address-prefixes 10.0.0.0/23
    
    az network vnet subnet create \
       --resource-group $RESOURCEGROUP \
       --vnet-name aro-vnet \
       --name worker \
       --address-prefixes 10.0.2.0/23
    

Создание необходимых управляемых удостоверений, назначенных для пользователя

  1. Создайте следующие обязательные удостоверения личности. Для Azure Red Hat OpenShift требуется девять управляемых удостоверений, каждая из которых должна иметь назначенную встроенную роль:

    • Семь управляемых идентификаторов, связанных с основными операторами OpenShift.
    • Одно управляемое удостоверение для оператора службы Azure Red Hat OpenShift.
    • Ещё один идентификатор для кластера, чтобы обеспечить использование этих идентификаторов.

    Компоненты управляемого удостоверения:

    • Оператор реестра образов OpenShift (image-registry)
    • Оператор сети OpenShift (cloud-network-config)
    • Оператор хранилища дисков OpenShift (disk-csi-driver)
    • Оператор хранилища файлов OpenShift (file-csi-driver)
    • Оператор Ingress кластера OpenShift (входящий трафик)
    • OpenShift Cloud Controller Manager (менеджер облачных контроллеров)
    • Оператор API машин OpenShift (machine-api)
    • Оператор службы Azure Red Hat OpenShift (aro-operator)

    Существует восемь различных управляемых удостоверений и соответствующих встроенных ролей, представляющих разрешения, необходимые для каждого компонента Azure Red Hat OpenShift для выполнения своих обязанностей. Кроме того, для платформы требуется другой идентификатор — кластерный идентификатор, чтобы создавать федеративные учетные данные для ранее перечисленных компонентов управляемых идентификаторов (aro-cluster).

    Дополнительные сведения об операторах кластера Red Hat OpenShift см. в справочнике по операторам кластера.

    Дополнительные сведения об управляемых удостоверениях в Azure Red Hat OpenShift см. в статье "Общие сведения об управляемых удостоверениях в Azure Red Hat OpenShift".

    Создайте необходимые идентичности.

    az identity create \
    --resource-group $RESOURCEGROUP \
    --name aro-cluster
    
    az identity create \
    --resource-group $RESOURCEGROUP \
    --name cloud-controller-manager
    
    az identity create \
    --resource-group $RESOURCEGROUP \
    --name ingress
    
    az identity create \
    --resource-group $RESOURCEGROUP \
    --name machine-api
    
    az identity create \
    --resource-group $RESOURCEGROUP \
    --name disk-csi-driver
    
    az identity create \
    --resource-group $RESOURCEGROUP \
    --name cloud-network-config
    
    az identity create \
    --resource-group $RESOURCEGROUP \
    --name image-registry
    
    az identity create \
    --resource-group $RESOURCEGROUP \
    --name file-csi-driver
    
    az identity create \
    --resource-group $RESOURCEGROUP \
    --name aro-operator
    
  2. Создайте необходимые назначения ролей для каждого оператора, идентификации кластера и сервисного принципала первого лица.

    Замечание

    В этой статье предполагается, что присутствуют только главные и рабочие подсети. Если при установке было настроено больше подсетей кластера, необходимо предоставить этим подсетям область назначения роли для операторов, которым это требуется.

    Следующие назначения ролей для главных и рабочих подсетей предполагают отсутствие группы безопасности сети (NSG), таблицы маршрутов или подключенного шлюза преобразования сетевых адресов (NAT). При добавлении любого из этих сетевых ресурсов в процессе установки необходимо создать дополнительные назначения ролей, которые предоставляют операторам учетные записи с разрешениями для этих дополнительных сетевых ресурсов. Для каждого оператора, требующего назначения ролей для следующих подсетей или виртуальной сети, также требуется назначение роли для дополнительного сетевого ресурса.

    SUBSCRIPTION_ID=$(az account show --query 'id' -o tsv)
    
    # assign cluster identity permissions over identities previously created
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-cluster --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/aro-operator"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-cluster --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/cloud-controller-manager"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-cluster --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ingress"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-cluster --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/machine-api"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-cluster --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/disk-csi-driver"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-cluster --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/cloud-network-config"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-cluster --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/image-registry"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-cluster --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/ef318e2a-8334-4a05-9e4a-295a196c6a6e" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/file-csi-driver"
    
    # assign vnet-level permissions for operators that require it, and subnets-level permission for operators that require it
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name cloud-controller-manager --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/a1f96423-95ce-4224-ab27-4e3dc72facd4" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/master"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name cloud-controller-manager --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/a1f96423-95ce-4224-ab27-4e3dc72facd4" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/worker"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name ingress --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/0336e1d3-7a87-462b-b6db-342b63f7802c" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/master"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name ingress --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/0336e1d3-7a87-462b-b6db-342b63f7802c" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/worker"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name machine-api --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/0358943c-7e01-48ba-8889-02cc51d78637" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/master"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name machine-api --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/0358943c-7e01-48ba-8889-02cc51d78637" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/worker"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name cloud-network-config --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/be7a6435-15ae-4171-8f30-4a343eff9e8f" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name file-csi-driver --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/0d7aedc0-15fd-4a67-a412-efad370c947e" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name image-registry --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/8b32b316-c2f5-4ddf-b05b-83dacd2d08b5" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-operator --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/4436bae4-7702-4c84-919b-c4069ff25ee2" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/master"
    
    az role assignment create \
        --assignee-object-id "$(az identity show --resource-group $RESOURCEGROUP --name aro-operator --query principalId -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/4436bae4-7702-4c84-919b-c4069ff25ee2" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet/subnets/worker"
    
    az role assignment create \
        --assignee-object-id "$(az ad sp list --display-name "Azure Red Hat OpenShift RP" --query '[0].id' -o tsv)" \
        --assignee-principal-type ServicePrincipal \
        --role "/subscriptions/$SUBSCRIPTION_ID/providers/Microsoft.Authorization/roleDefinitions/4d97b98b-1d4f-4787-a291-c67834d212e7" \
        --scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCEGROUP/providers/Microsoft.Network/virtualNetworks/aro-vnet"
    

Создайте кластер.

Чтобы создать кластер, выполните следующую команду, показанную в разделе параметров. Если вы решили использовать один из указанных ниже параметров, измените команду соответствующим образом:

  • Вариант 1. Вы можете передать секрет хранилища Red Hat, который позволяет вашему кластеру получать доступ к реестрам контейнеров Red Hat и к другому контенту. Добавьте в команду аргумент --pull-secret @pull-secret.txt.
  • Вариант 2. Вы можете использовать личный домен. Добавьте в команду аргумент --domain foo.example.com, заменив foo.example.com собственным личным доменом.

Создайте кластер с необходимыми переменными среды. Для каждого --assign-platform-workload-identity флага первый аргумент представляет ключ, который указывает поставщику ресурсов Azure Red Hat OpenShift, который оператор OpenShift будет использовать для заданного удостоверения. Второй аргумент представляет ссылку на само удостоверение.

az aro create \
    --resource-group $RESOURCEGROUP \
    --name $CLUSTER \
    --vnet aro-vnet \
    --master-subnet master \
    --worker-subnet worker \
    --version <VERSION> \
    --enable-managed-identity \
    --assign-cluster-identity aro-cluster \
    --assign-platform-workload-identity file-csi-driver file-csi-driver \
    --assign-platform-workload-identity cloud-controller-manager cloud-controller-manager \
    --assign-platform-workload-identity ingress ingress \
    --assign-platform-workload-identity image-registry image-registry \
    --assign-platform-workload-identity machine-api machine-api \
    --assign-platform-workload-identity cloud-network-config cloud-network-config \
    --assign-platform-workload-identity aro-operator aro-operator \
    --assign-platform-workload-identity disk-csi-driver disk-csi-driver

Если ресурсы удостоверений существуют в другом регионе или группе ресурсов, можно передать полные идентификаторы ресурсов для создания. См. следующий пример.

az aro create \
    --resource-group $RESOURCEGROUP \
    --name $CLUSTER \
    --vnet aro-vnet \
    --master-subnet master \
    --worker-subnet worker \
    --version <VERSION> \
    --enable-managed-identity \
    --assign-cluster-identity /subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/aro-cluster \
    --assign-platform-workload-identity file-csi-driver /subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/file-csi-driver \
    --assign-platform-workload-identity cloud-controller-manager /subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/cloud-controller-manager \
    --assign-platform-workload-identity ingress /subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/ingress \
    --assign-platform-workload-identity image-registry /subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/image-registry \
    --assign-platform-workload-identity machine-api /subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/machine-api \
    --assign-platform-workload-identity cloud-network-config /subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/cloud-network-config \
    --assign-platform-workload-identity aro-operator /subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/aro-operator \
    --assign-platform-workload-identity disk-csi-driver /subscriptions/$SUBSCRIPTION_ID/resourcegroups/$RESOURCEGROUP/providers/Microsoft.ManagedIdentity/userAssignedIdentities/disk-csi-driver

Выберите другую версию Azure Red Hat OpenShift

При создании кластера можно использовать определенную версию Azure Red Hat OpenShift. Сначала используйте интерфейс командной строки для запроса доступных версий Azure Red Hat OpenShift:

az aro get-versions --location <REGION>

После выбора версии укажите его с помощью --version параметра в команде az aro create .

Установка с помощью Bicep

В этом разделе описывается, как с помощью Bicep создать кластер Azure Red Hat OpenShift с управляемыми удостоверениями.

  1. Сохраните пример файла Bicep в файл. В этом примере сохраните его как azuredeploy.bicep.

  2. Задайте следующие переменные в среде оболочки, в которой планируете выполнять команды az.

    LOCATION=eastus                     # the location of your cluster
    RESOURCEGROUP=aro-rg                # the name of the resource group where you want to create your cluster
    CLUSTER=cluster                     # the name of your cluster
    VERSION=4.15.35                     # the version of the cluster
    PULL_SECRET=$(cat pull-secret.txt)  # the Red Hat pull secret JSON, provided as file or string
    
  3. Создайте группу ресурсов для хранения ресурсов кластера, виртуальной сети кластера и идентификаторов.

    az group create --name $RESOURCEGROUP --location $LOCATION
    
  4. Для поставщика ресурсов проверьте идентификатор объекта основной службы для вашей подписки.

    ARO_RP_SP_OBJECT_ID=$(az ad sp list --display-name "Azure Red Hat OpenShift RP" --query '[0].id' -o tsv)
    
  5. Разверните Bicep-файл:

    az deployment group create \
      --name aroDeployment \
      --resource-group $RESOURCEGROUP \
      --template-file azuredeploy.bicep \
      --parameters location=$LOCATION \
      --parameters version=$VERSION \
      --parameters clusterName=$CLUSTER \
      --parameters rpObjectId=$ARO_RP_SP_OBJECT_ID
    

    Если вы используете необязательные параметры для pull-секрета или пользовательского домена, добавьте обратную косую черту продолжения строки (\) после параметра rpObjectId и включите следующие параметры в команду развертывания:

    --parameters domain=$DOMAIN \ #optional
    --parameters pullSecret=$PULL_SECRET # optional
    

Пример файла Bicep

Замечание

В этой статье предполагается, что присутствуют только главные и рабочие подсети. Если при установке было настроено больше подсетей кластера, необходимо предоставить этим подсетям область назначения роли для операторов, которым это требуется.

Следующие назначения ролей для главных и рабочих подсетей предполагают отсутствие группы безопасности сети (NSG), таблицы маршрутов или подключенного шлюза преобразования сетевых адресов (NAT). При добавлении любого из этих сетевых ресурсов в процессе установки необходимо создать дополнительные назначения ролей, которые предоставляют операторам учетные записи с разрешениями для этих дополнительных сетевых ресурсов. Для каждого оператора, требующего назначения ролей для следующих подсетей или виртуальной сети, также требуется назначение роли для дополнительного сетевого ресурса.

@description('Location')
param location string = resourceGroup().location

@description('Domain Prefix')
param domain string

@description('Version of the OpenShift cluster')
param version string

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

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

@description('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('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('Api Server Visibility')
@allowed([
 'Private'
 'Public'
])
param apiServerVisibility string = 'Public'

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

@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 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 vnet 'Microsoft.Network/virtualNetworks@2023-06-01' = {
 name: clusterVnetName
 location: location
 properties: {
   addressSpace: { addressPrefixes: [ clusterVnetCidr ] }
   subnets: [
     {
       name: 'master'
       properties: {
         addressPrefixes: [ masterSubnetCidr ]
         serviceEndpoints: [ { service: 'Microsoft.ContainerRegistry' } ]
       }
     }
     {
       name: 'worker'
       properties: {
         addressPrefixes: [ workerSubnetCidr ]
         serviceEndpoints: [ { service: 'Microsoft.ContainerRegistry' } ]
       }
     }
   ]
 }
}

resource workerSubnet 'Microsoft.Network/virtualNetworks/subnets@2020-08-01' existing = {
 parent: vnet
 name: 'worker'
}

resource masterSubnet 'Microsoft.Network/virtualNetworks/subnets@2020-08-01' existing = {
 parent: vnet
 name: 'master'
}

// create required identities

resource cloudControllerManager 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
   name: 'cloud-controller-manager'
   location: location
}

resource ingress 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
   name: 'ingress'
   location: location
}

resource machineApi 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
   name: 'machine-api'
   location: location
}

resource diskCsiDriver 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
   name: 'disk-csi-driver'
   location: location
}

resource cloudNetworkConfig 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
   name: 'cloud-network-config'
   location: location
}

resource imageRegistry 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
   name: 'image-registry'
   location: location
}

resource fileCsiDriver 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
   name: 'file-csi-driver'
   location: location
}

resource aroOperator 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
   name: 'aro-operator'
   location: location
}

resource clusterMsi 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
   name: 'cluster'
   location: location
}

// create required role assignments on vnet / subnets

resource cloudControllerManagerMasterSubnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(masterSubnet.id, 'cloud-controller-manager')
   scope: masterSubnet
   properties: {
       principalId: cloudControllerManager.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'a1f96423-95ce-4224-ab27-4e3dc72facd4')
       principalType: 'ServicePrincipal'
   }
}

resource cloudControllerManagerWorkerSubnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
 name: guid(workerSubnet.id, 'cloud-controller-manager')
 scope: workerSubnet
 properties: {
     principalId: cloudControllerManager.properties.principalId
     roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'a1f96423-95ce-4224-ab27-4e3dc72facd4')
     principalType: 'ServicePrincipal'
 }
}

resource ingressMasterSubnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(masterSubnet.id, 'ingress')
   scope: masterSubnet
   properties: {
       principalId: ingress.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0336e1d3-7a87-462b-b6db-342b63f7802c')
       principalType: 'ServicePrincipal'
   }
}

resource ingressWorkerSubnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
 name: guid(workerSubnet.id, 'ingress')
 scope: workerSubnet
 properties: {
     principalId: ingress.properties.principalId
     roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0336e1d3-7a87-462b-b6db-342b63f7802c')
     principalType: 'ServicePrincipal'
 }
}

resource machineApiMasterSubnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(masterSubnet.id, 'machine-api')
   scope: masterSubnet
   properties: {
       principalId: machineApi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0358943c-7e01-48ba-8889-02cc51d78637')
       principalType: 'ServicePrincipal'
   }
}

resource machineApiWorkerSubnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(workerSubnet.id, 'machine-api')
   scope: workerSubnet
   properties: {
       principalId: machineApi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0358943c-7e01-48ba-8889-02cc51d78637')
       principalType: 'ServicePrincipal'
   }
}

resource cloudNetworkConfigVnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(vnet.id, 'cloud-network-config')
   scope: vnet
   properties: {
       principalId: cloudNetworkConfig.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'be7a6435-15ae-4171-8f30-4a343eff9e8f')
       principalType: 'ServicePrincipal'
   }
}

resource fileCsiDriverVnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(vnet.id, 'file-csi-driver')
   scope: vnet
   properties: {
       principalId: fileCsiDriver.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0d7aedc0-15fd-4a67-a412-efad370c947e')
       principalType: 'ServicePrincipal'
   }
}

resource imageRegistryVnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(vnet.id, 'image-registry')
   scope: vnet
   properties: {
       principalId: imageRegistry.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '8b32b316-c2f5-4ddf-b05b-83dacd2d08b5')
       principalType: 'ServicePrincipal'
   }
}

resource aroOperatorMasterSubnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(masterSubnet.id, 'aro-operator')
   scope: masterSubnet
   properties: {
       principalId: aroOperator.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '4436bae4-7702-4c84-919b-c4069ff25ee2')
       principalType: 'ServicePrincipal'
   }
}

resource aroOperatorWorkerSubnetRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
 name: guid(workerSubnet.id, 'aro-operator')
 scope: workerSubnet
 properties: {
     principalId: aroOperator.properties.principalId
     roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '4436bae4-7702-4c84-919b-c4069ff25ee2')
     principalType: 'ServicePrincipal'
 }
}

// create required role assignments on cluster MSI

resource clusterMsiRoleAssignmentCloudControllerManager 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(cloudControllerManager.id, 'cluster')
   scope: cloudControllerManager
   properties: {
       principalId: clusterMsi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')
       principalType: 'ServicePrincipal'
   }
}

resource clusterMsiRoleAssignmentIngress 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(ingress.id, 'cluster')
   scope: ingress
   properties: {
       principalId: clusterMsi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')
       principalType: 'ServicePrincipal'
   }
}

resource clusterMsiRoleAssignmentMachineApi 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(machineApi.id, 'cluster')
   scope: machineApi
   properties: {
       principalId: clusterMsi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')
       principalType: 'ServicePrincipal'
   }
}

resource clusterMsiRoleAssignmentDiskCsiDriver 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(diskCsiDriver.id, 'cluster')
   scope: diskCsiDriver
   properties: {
       principalId: clusterMsi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')
       principalType: 'ServicePrincipal'
   }
}

resource clusterMsiRoleAssignmentCloudNetworkConfig 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(cloudNetworkConfig.id, 'cluster')
   scope: cloudNetworkConfig
   properties: {
       principalId: clusterMsi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')
       principalType: 'ServicePrincipal'
   }
}

resource clusterMsiRoleAssignmentCloudImageRegistry 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(imageRegistry.id, 'cluster')
   scope: imageRegistry
   properties: {
       principalId: clusterMsi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')
       principalType: 'ServicePrincipal'
   }
}

resource clusterMsiRoleAssignmentCloudFileCsiDriver 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(fileCsiDriver.id, 'cluster')
   scope: fileCsiDriver
   properties: {
       principalId: clusterMsi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')
       principalType: 'ServicePrincipal'
   }
}

resource clusterMsiRoleAssignmentCloudAroOperator 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(aroOperator.id, 'cluster')
   scope: aroOperator
   properties: {
       principalId: clusterMsi.properties.principalId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')
       principalType: 'ServicePrincipal'
   }
}

// create first party role assignment over the vnet

resource fpspRoleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
   name: guid(vnet.id, rpObjectId)
   scope: vnet
   properties: {
       principalId: rpObjectId
       roleDefinitionId: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '4d97b98b-1d4f-4787-a291-c67834d212e7')
       principalType: 'ServicePrincipal'
   }
}

// create cluster

resource cluster 'Microsoft.RedHatOpenShift/openShiftClusters@2024-08-12-preview' = {
   name: clusterName
   location: location
   properties: {
       clusterProfile: {
           domain: domain
           #disable-next-line use-resource-id-functions
           resourceGroupId: resourceGroupId
           version: version
           fipsValidatedModules: fips
           pullSecret: pullSecret
       }
       networkProfile: {podCidr: podCidr, serviceCidr: serviceCidr}
       masterProfile: {
           vmSize: masterVmSize
           subnetId: masterSubnetId
           encryptionAtHost: masterEncryptionAtHost
       }
       workerProfiles: [{
           name: 'worker'
           count: 3
           diskSizeGB: workerVmDiskSize
           vmSize: workerVmSize
           subnetId: workerSubnetId
           encryptionAtHost: workerEncryptionAtHost
       }]
       apiserverProfile: {visibility: apiServerVisibility}
       ingressProfiles: [{name: 'default', visibility: ingressVisibility}]
       platformWorkloadIdentityProfile: {
           platformWorkloadIdentities: {
               'cloud-controller-manager': {resourceId: cloudControllerManager.id}
               ingress: {resourceId: ingress.id}
               'machine-api': {resourceId: machineApi.id}
               'disk-csi-driver': {resourceId: diskCsiDriver.id}
               'cloud-network-config': {resourceId: cloudNetworkConfig.id}
               'image-registry': {resourceId: imageRegistry.id}
               'file-csi-driver': {resourceId: fileCsiDriver.id}
               'aro-operator': {resourceId: aroOperator.id}
           }
       }
   }
   identity: {
       type: 'UserAssigned'
       userAssignedIdentities: {
           '${clusterMsi.id}': {}
       }
   }
}

Установка с помощью шаблона ARM

В этом разделе описывается, как использовать шаблон ARM для создания кластера Azure Red Hat OpenShift с управляемыми удостоверениями.

  1. Сохраните пример шаблона ARM в файл. В этом примере назовите файл azuredeploy.json.

  2. Задайте следующие переменные в среде оболочки, в которой планируете выполнять команды az.

    LOCATION=eastus                     # the location of your cluster
    RESOURCEGROUP=aro-rg                # the name of the resource group where you want to create your cluster
    CLUSTER=cluster                     # the name of your cluster
    VERSION=4.15.35                     # the version of the cluster
    PULL_SECRET=$(cat pull-secret.txt)  # the Red Hat pull secret JSON, provided as file or string
    
  3. Создайте группу ресурсов для хранения ресурсов кластера, виртуальной сети кластера и идентификаторов.

    az group create --name $RESOURCEGROUP --location $LOCATION
    
  4. Для поставщика ресурсов проверьте идентификатор объекта основной службы для вашей подписки.

    ARO_RP_SP_OBJECT_ID=$(az ad sp list --display-name "Azure Red Hat OpenShift RP" --query '[0].id' -o tsv)
    
  5. Разверните шаблон ARM:

    az deployment group create \
      --name aroDeployment \
      --resource-group $RESOURCEGROUP \
      --template-file azuredeploy.json \
      --parameters location=$LOCATION \
      --parameters version=$VERSION \
      --parameters clusterName=$CLUSTER \
      --parameters rpObjectId=$ARO_RP_SP_OBJECT_ID
    

    Если вы используете необязательные параметры для секрета извлечения или настраиваемого домена, добавьте обратную косую черту продолжения строки (\) после параметра rpObjectId и включите следующие параметры в команду развертывания:

    --parameters domain=$DOMAIN \ #optional
    --parameters pullSecret=$PULL_SECRET # optional
    

Пример шаблона ARM

Замечание

В этой статье предполагается, что присутствуют только главные и рабочие подсети. Если при установке было настроено больше подсетей кластера, необходимо предоставить этим подсетям область назначения роли для операторов, которым это требуется.

Следующие назначения ролей для главных и рабочих подсетей предполагают отсутствие группы безопасности сети (NSG), таблицы маршрутов или подключенного шлюза преобразования сетевых адресов (NAT). При добавлении любого из этих сетевых ресурсов в процессе установки необходимо создать дополнительные назначения ролей, которые предоставляют операторам учетные записи с разрешениями для этих дополнительных сетевых ресурсов. Для каждого оператора, требующего назначения ролей для следующих подсетей или виртуальной сети, также требуется назначение роли для дополнительного сетевого ресурса.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.38.33.27573",
      "templateHash": "9848565761041118745"
    }
  },
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "Location"
      }
    },
    "domain": {
      "type": "string",
      "metadata": {
        "description": "Domain Prefix"
      }
    },
    "version": {
      "type": "string",
      "metadata": {
        "description": "Version of the OpenShift cluster"
      }
    },
    "pullSecret": {
      "type": "securestring",
      "defaultValue": "",
      "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 vNet"
      }
    },
    "clusterVnetCidr": {
      "type": "string",
      "defaultValue": "10.100.0.0/15",
      "metadata": {
        "description": "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"
      }
    },
    "podCidr": {
      "type": "string",
      "defaultValue": "10.128.0.0/14",
      "metadata": {
        "description": "Cidr for Pods"
      }
    },
    "serviceCidr": {
      "type": "string",
      "defaultValue": "172.30.0.0/16",
      "metadata": {
        "description": "Cidr of service"
      }
    },
    "clusterName": {
      "type": "string",
      "metadata": {
        "description": "Unique name for the cluster"
      }
    },
    "apiServerVisibility": {
      "type": "string",
      "defaultValue": "Public",
      "allowedValues": [
        "Private",
        "Public"
      ],
      "metadata": {
        "description": "Api Server Visibility"
      }
    },
    "ingressVisibility": {
      "type": "string",
      "defaultValue": "Public",
      "allowedValues": [
        "Private",
        "Public"
      ],
      "metadata": {
        "description": "Ingress Visibility"
      }
    },
    "rpObjectId": {
      "type": "string",
      "metadata": {
        "description": "The ObjectID of the Resource Provider Service Principal"
      }
    },
    "fips": {
      "type": "string",
      "defaultValue": "Disabled",
      "allowedValues": [
        "Enabled",
        "Disabled"
      ],
      "metadata": {
        "description": "Specify if FIPS validated crypto modules are used"
      }
    },
    "masterEncryptionAtHost": {
      "type": "string",
      "defaultValue": "Disabled",
      "allowedValues": [
        "Enabled",
        "Disabled"
      ],
      "metadata": {
        "description": "Specify if master VMs are encrypted at host"
      }
    },
    "workerEncryptionAtHost": {
      "type": "string",
      "defaultValue": "Disabled",
      "allowedValues": [
        "Enabled",
        "Disabled"
      ],
      "metadata": {
        "description": "Specify if worker VMs are encrypted at host"
      }
    }
  },
  "variables": {
    "resourceGroupId": "[format('/subscriptions/{0}/resourceGroups/aro-{1}-{2}', subscription().subscriptionId, parameters('domain'), parameters('location'))]",
    "masterSubnetId": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'master')]",
    "workerSubnetId": "[resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'worker')]"
  },
  "resources": [
    {
      "type": "Microsoft.Network/virtualNetworks",
      "apiVersion": "2023-06-01",
      "name": "[parameters('clusterVnetName')]",
      "location": "[parameters('location')]",
      "properties": {
        "addressSpace": {
          "addressPrefixes": [
            "[parameters('clusterVnetCidr')]"
          ]
        },
        "subnets": [
          {
            "name": "master",
            "properties": {
              "addressPrefixes": [
                "[parameters('masterSubnetCidr')]"
              ],
              "serviceEndpoints": [
                {
                  "service": "Microsoft.ContainerRegistry"
                }
              ]
            }
          },
          {
            "name": "worker",
            "properties": {
              "addressPrefixes": [
                "[parameters('workerSubnetCidr')]"
              ],
              "serviceEndpoints": [
                {
                  "service": "Microsoft.ContainerRegistry"
                }
              ]
            }
          }
        ]
      }
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-01-31",
      "name": "cloud-controller-manager",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-01-31",
      "name": "ingress",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-01-31",
      "name": "machine-api",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-01-31",
      "name": "disk-csi-driver",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-01-31",
      "name": "cloud-network-config",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-01-31",
      "name": "image-registry",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-01-31",
      "name": "file-csi-driver",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-01-31",
      "name": "aro-operator",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities",
      "apiVersion": "2023-01-31",
      "name": "cluster",
      "location": "[parameters('location')]"
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}/subnets/{1}', parameters('clusterVnetName'), 'master')]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'master'), 'cloud-controller-manager')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-controller-manager'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'a1f96423-95ce-4224-ab27-4e3dc72facd4')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-controller-manager')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}/subnets/{1}', parameters('clusterVnetName'), 'worker')]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'worker'), 'cloud-controller-manager')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-controller-manager'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'a1f96423-95ce-4224-ab27-4e3dc72facd4')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-controller-manager')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}/subnets/{1}', parameters('clusterVnetName'), 'master')]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'master'), 'ingress')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'ingress'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0336e1d3-7a87-462b-b6db-342b63f7802c')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'ingress')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}/subnets/{1}', parameters('clusterVnetName'), 'worker')]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'worker'), 'ingress')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'ingress'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0336e1d3-7a87-462b-b6db-342b63f7802c')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'ingress')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}/subnets/{1}', parameters('clusterVnetName'), 'master')]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'master'), 'machine-api')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'machine-api'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0358943c-7e01-48ba-8889-02cc51d78637')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'machine-api')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}/subnets/{1}', parameters('clusterVnetName'), 'worker')]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'worker'), 'machine-api')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'machine-api'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0358943c-7e01-48ba-8889-02cc51d78637')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'machine-api')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}', parameters('clusterVnetName'))]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName')), 'cloud-network-config')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-network-config'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'be7a6435-15ae-4171-8f30-4a343eff9e8f')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-network-config')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}', parameters('clusterVnetName'))]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName')), 'file-csi-driver')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'file-csi-driver'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '0d7aedc0-15fd-4a67-a412-efad370c947e')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'file-csi-driver')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}', parameters('clusterVnetName'))]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName')), 'image-registry')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'image-registry'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '8b32b316-c2f5-4ddf-b05b-83dacd2d08b5')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'image-registry')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}/subnets/{1}', parameters('clusterVnetName'), 'master')]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'master'), 'aro-operator')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'aro-operator'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '4436bae4-7702-4c84-919b-c4069ff25ee2')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'aro-operator')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}/subnets/{1}', parameters('clusterVnetName'), 'worker')]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks/subnets', parameters('clusterVnetName'), 'worker'), 'aro-operator')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'aro-operator'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '4436bae4-7702-4c84-919b-c4069ff25ee2')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'aro-operator')]",
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.ManagedIdentity/userAssignedIdentities/{0}', 'cloud-controller-manager')]",
      "name": "[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-controller-manager'), 'cluster')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-controller-manager')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster')]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.ManagedIdentity/userAssignedIdentities/{0}', 'ingress')]",
      "name": "[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'ingress'), 'cluster')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'ingress')]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.ManagedIdentity/userAssignedIdentities/{0}', 'machine-api')]",
      "name": "[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'machine-api'), 'cluster')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'machine-api')]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.ManagedIdentity/userAssignedIdentities/{0}', 'disk-csi-driver')]",
      "name": "[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'disk-csi-driver'), 'cluster')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'disk-csi-driver')]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.ManagedIdentity/userAssignedIdentities/{0}', 'cloud-network-config')]",
      "name": "[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-network-config'), 'cluster')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-network-config')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster')]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.ManagedIdentity/userAssignedIdentities/{0}', 'image-registry')]",
      "name": "[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'image-registry'), 'cluster')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'image-registry')]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.ManagedIdentity/userAssignedIdentities/{0}', 'file-csi-driver')]",
      "name": "[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'file-csi-driver'), 'cluster')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'file-csi-driver')]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.ManagedIdentity/userAssignedIdentities/{0}', 'aro-operator')]",
      "name": "[guid(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'aro-operator'), 'cluster')]",
      "properties": {
        "principalId": "[reference(resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster'), '2023-01-31').principalId]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', 'ef318e2a-8334-4a05-9e4a-295a196c6a6e')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'aro-operator')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster')]"
      ]
    },
    {
      "type": "Microsoft.Authorization/roleAssignments",
      "apiVersion": "2022-04-01",
      "scope": "[format('Microsoft.Network/virtualNetworks/{0}', parameters('clusterVnetName'))]",
      "name": "[guid(resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName')), parameters('rpObjectId'))]",
      "properties": {
        "principalId": "[parameters('rpObjectId')]",
        "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '4d97b98b-1d4f-4787-a291-c67834d212e7')]",
        "principalType": "ServicePrincipal"
      },
      "dependsOn": [
        "[resourceId('Microsoft.Network/virtualNetworks', parameters('clusterVnetName'))]"
      ]
    },
    {
      "type": "Microsoft.RedHatOpenShift/openShiftClusters",
      "apiVersion": "2024-08-12-preview",
      "name": "[parameters('clusterName')]",
      "location": "[parameters('location')]",
      "properties": {
        "clusterProfile": {
          "domain": "[parameters('domain')]",
          "resourceGroupId": "[variables('resourceGroupId')]",
          "version": "[parameters('version')]",
          "fipsValidatedModules": "[parameters('fips')]",
          "pullSecret": "[parameters('pullSecret')]"
        },
        "networkProfile": {
          "podCidr": "[parameters('podCidr')]",
          "serviceCidr": "[parameters('serviceCidr')]"
        },
        "masterProfile": {
          "vmSize": "[parameters('masterVmSize')]",
          "subnetId": "[variables('masterSubnetId')]",
          "encryptionAtHost": "[parameters('masterEncryptionAtHost')]"
        },
        "workerProfiles": [
          {
            "name": "worker",
            "count": 3,
            "diskSizeGB": "[parameters('workerVmDiskSize')]",
            "vmSize": "[parameters('workerVmSize')]",
            "subnetId": "[variables('workerSubnetId')]",
            "encryptionAtHost": "[parameters('workerEncryptionAtHost')]"
          }
        ],
        "apiserverProfile": {
          "visibility": "[parameters('apiServerVisibility')]"
        },
        "ingressProfiles": [
          {
            "name": "default",
            "visibility": "[parameters('ingressVisibility')]"
          }
        ],
        "platformWorkloadIdentityProfile": {
          "platformWorkloadIdentities": {
            "cloud-controller-manager": {
              "resourceId": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-controller-manager')]"
            },
            "ingress": {
              "resourceId": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'ingress')]"
            },
            "machine-api": {
              "resourceId": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'machine-api')]"
            },
            "disk-csi-driver": {
              "resourceId": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'disk-csi-driver')]"
            },
            "cloud-network-config": {
              "resourceId": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-network-config')]"
            },
            "image-registry": {
              "resourceId": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'image-registry')]"
            },
            "file-csi-driver": {
              "resourceId": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'file-csi-driver')]"
            },
            "aro-operator": {
              "resourceId": "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'aro-operator')]"
            }
          }
        }
      },
      "identity": {
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "[format('{0}', resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster'))]": {}
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'aro-operator')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-controller-manager')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cloud-network-config')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'cluster')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'disk-csi-driver')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'file-csi-driver')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'image-registry')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'ingress')]",
        "[resourceId('Microsoft.ManagedIdentity/userAssignedIdentities', 'machine-api')]"
      ]
    }
  ]
}

Очистка

Чтобы удалить кластер управляемой идентичности, запустите следующую команду:

az aro delete -n $CLUSTER -g $RESOURCEGROUP

Команда удаления не выполняет очистку управляемых удостоверений, которые были назначены кластером и созданы в ходе установки. Необходимо вручную удалить идентификаторы и назначения ролей.

Дополнительные сведения см. в статье "Общие сведения об управляемых удостоверениях" в Azure Red Hat OpenShift (предварительная версия).