Compartilhar via


Criar um cluster do Red Hat OpenShift no Azure com identidades gerenciadas (versão prévia)

Importante

Atualmente, esse recurso do Red Hat OpenShift do Azure está sendo oferecido apenas em versão prévia. Os recursos de pré-visualização estão disponíveis em um sistema de autoatendimento e adesão voluntária. As visualizações são fornecidas tal como são e conforme disponíveis e são excluídas dos contratos de nível de serviço e da garantia limitada. As versões prévias do Red Hat OpenShift no Azure são parcialmente cobertas pelo suporte ao cliente em uma base de melhor esforço. Dessa forma, esses recursos não são destinados ao uso em produção.

Este artigo mostra como implantar um cluster do Red Hat OpenShift do Azure utilizando identidades gerenciadas. Um cluster existente que usa um service principal não pode ser migrado para usar uma identidade gerenciada. Você precisa criar um novo cluster que use uma identidade gerenciada em um cluster do Red Hat OpenShift no Azure.

O Red Hat OpenShift do Azure é um serviço openshift gerenciado que dá suporte a identidades gerenciadas e identidades de carga de trabalho. Identidades gerenciadas e identidades de carga de trabalho ajudam a minimizar o risco na proteção de cargas de trabalho e aplicativos ao fornecerem tokens de curta duração em vez de credenciais de longa duração, como um principal de serviço com credenciais de segredo do cliente.

Para obter mais informações, consulte:

Pré-requisitos

Verifique se você está usando a CLI do Azure versão 2.67.0 ou superior. Use az--version para localizar a versão da CLI do Azure instalada. Se você precisa instalar ou atualizar, consulte Instalar a CLI do Azure.

O Red Hat OpenShift do Azure requer um mínimo de 44 núcleos para criar um cluster do OpenShift. A cota de recursos padrão do Azure para uma nova assinatura do Azure não atende a esse requisito. Para solicitar um aumento no limite do seu recurso, confira Aumentar as cotas de vCPU da família de VMs.

Os 44 núcleos são usados da seguinte maneira:

  • Computador bootstrap: 8 núcleos
  • Plano de controle (máquinas mestras): 24 núcleos
  • Computação (computadores de trabalho): 12 núcleos

Quando a instalação for concluída, o computador de inicialização será removido e o cluster usará um total de 36 núcleos. Para obter mais informações, consulte Instalar no Azure.

Por exemplo, para verificar a cota de assinatura atual do menor SKU da família de máquinas virtuais com suporte "DSv5 Standard":

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

Baixar o arquivo de roda de extensão do Red Hat OpenShift do Azure (somente versão prévia)

Para executar os comandos neste artigo, primeiro baixe o arquivo de roda de extensão do Red Hat OpenShift do Azure de https://aka.ms/az-aroext-latest. Para instalar a extensão , execute o seguinte comando:

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

Verificar as permissões

Neste artigo, você criará um grupo de recursos que contém a rede virtual e as identidades gerenciadas para o cluster. Para criar um grupo de recursos, você precisa de permissões de Administrador de Acesso do Usuário e Colaborador ou permissões de Proprietário no grupo de recursos ou assinatura que o contenha.

Você também precisa de permissões suficientes do Microsoft Entra (um usuário membro do locatário ou um convidado atribuído com a função Administrador de aplicativos) para criar um conjunto de identidades gerenciadas e atribuir funções para o cluster a ser usado. Para obter mais informações, consulte Membro e convidados e atribua funções de administrador e não administrador a usuários com a ID do Microsoft Entra.

Registrar os provedores de recursos

Alguns provedores de recursos do Azure, incluindo o provedor de recursos do Red Hat OpenShift do Azure, exigem registro para funcionar. Registrar um provedor de recursos cria uma entidade de serviço dentro de sua assinatura que autoriza o provedor de recursos a executar determinadas ações, como a criação de recursos. Para obter mais informações sobre o registro do provedor de recursos, consulte Registrar provedor de recursos.

  1. Se você tem várias assinaturas do Azure, especifique a ID de assinatura relevante:

    az account set --subscription <SUBSCRIPTION ID>
    
  2. Registre o provedor de recursos Microsoft.RedHatOpenShift:

    az provider register -n Microsoft.RedHatOpenShift --wait
    
  3. Registre o provedor de recursos Microsoft.Compute:

    az provider register -n Microsoft.Compute --wait
    
  4. Registre o provedor de recursos Microsoft.Storage:

    az provider register -n Microsoft.Storage --wait
    
  5. Registre o provedor de recursos Microsoft.Authorization:

    az provider register -n Microsoft.Authorization --wait
    

Obter um segredo de pull do Red Hat (opcional)

Observação

O segredo de pull do Azure Red Hat OpenShift não altera o custo da licença do Red Hat OpenShift associada a ele.

Um segredo de pull do Red Hat permite que o cluster acesse registros de contêiner do Red Hat com outros conteúdos, como operadores do OperatorHub. Este passo é opcional, mas recomendado. Se você decidir adicionar o segredo de pull mais tarde, siga estas diretrizes. O campo cloud.openshift.com é removido do seu segredo, mesmo que o segredo de pull contenha esse campo. Esse campo habilita um recurso de monitoramento extra que envia dados para o RedHat e, portanto, é desabilitado por padrão. Para habilitar esse recurso, consulte Ativação de relatórios de saúde remota.

  1. Navegue até o portal do gerenciador de cluster do Red Hat OpenShift e faça login.

    Você precisa entrar em sua conta do Red Hat ou criar uma nova conta do Red Hat com seu email comercial e aceitar os termos e condições.

  2. Selecione Baixar segredo de pull e baixe um segredo de pull a ser usado com o cluster do Red Hat OpenShift no Azure.

    Mantenha o arquivo pull-secret.txt salvo em algum lugar seguro. O arquivo será usado em cada criação de cluster se você precisar criar um cluster que inclua exemplos ou operadores para o Red Hat ou parceiros certificados.

    Quando executar o comando az aro create, você pode fazer referência ao segredo de pull usando o parâmetro --pull-secret @pull-secret.txt. Execute az aro create no diretório em que você armazenou o arquivo pull-secret.txt. Caso contrário, substitua @pull-secret.txt por @/path/to/my/pull-secret.txt.

    Se você estiver copiando o segredo de pull ou fazendo referência a ele em outros scripts, o segredo de pull deverá ser formatado como uma cadeia de caracteres JSON válida.

Preparar um domínio personalizado para o seu cluster (opcional)

Ao executar o comando az aro create, você pode especificar um domínio personalizado para o cluster usando o parâmetro --___domain foo.example.com.

Observação

Adicionar um nome de domínio é opcional ao criar um cluster por meio da CLI do Azure. Um nome de domínio (ou um prefixo usado como parte do nome DNS gerado automaticamente para servidores de console e API do OpenShift) é necessário ao adicionar um cluster por meio do portal. Para obter mais informações, consulte Início Rápido: Implantar um cluster do Red Hat OpenShift no Azure usando o portal do Azure.

Se você fornecer um domínio personalizado para o seu cluster, observe os seguintes pontos:

  • Depois de criar seu cluster, você deve criar dois registros DNS A no servidor DNS para o --___domain especificado:
    • api – apontando para o endereço IP do servidor de API
    • *.apps – apontando para o endereço IP de entrada
    • Recupere esses valores executando o seguinte comando após a criação do cluster: az aro show -n -g --query '{api:apiserverProfile.ip, ingress:ingressProfiles[0].ip}'.
  • O console do OpenShift está disponível em uma URL como https://console-openshift-console.apps.example.com, em vez do domínio interno https://console-openshift-console.apps.<random>.<___location>.aroapp.io.
  • Por padrão, o OpenShift usa certificados autoassinados para todas as rotas criadas em domínios personalizados *.apps.example.com. Se você optar por usar o DNS personalizado depois de se conectar ao cluster, precisará seguir a documentação do OpenShift para configurar uma AC personalizada para o controlador de entrada e uma AC personalizada para o servidor de API.

Instalação

Você pode usar a CLI do Azure ou o Bicep para implantar um cluster do Red Hat OpenShift do Azure utilizando identidades gerenciadas.

Instalar usando a CLI do Azure

Esta seção descreve como usar a CLI do Azure para criar um cluster do Red Hat OpenShift do Azure utilizando identidades gerenciadas.

Criar uma rede virtual contendo duas sub-redes vazias

Criar uma rede virtual contendo duas sub-redes vazias. Se você tiver uma rede virtual existente que atenda às suas necessidades, ignore esta etapa.

Para obter informações sobre rede e requisitos, consulte Rede para Red Hat OpenShift do Azure.

  1. Defina as variáveis a seguir no ambiente do shell no qual você executa os az comandos.

    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. Crie um grupo de recursos.

    Um grupo de recursos do Azure é um grupo lógico no qual os recursos do Azure são implantados e gerenciados. Ao criar um grupo de recursos, você é solicitado a especificar um local. Esse local é onde os metadados do grupo de recursos são armazenados e onde seus recursos são executados no Azure se você não especificar outra região durante a criação de recursos. Crie um grupo de recursos usando o comando az group create.

    Observação

    O Red Hat OpenShift do Azure não está disponível em todas as regiões em que um grupo de recursos do Azure pode ser criado. Confira regiões disponíveis para obter informações sobre em que locais há suporte para o Red Hat OpenShift no Azure.

    az group create \
      --___location $LOCATION \
      --name $RESOURCEGROUP
    
  3. Crie uma rede virtual, um mestre e uma sub-rede de trabalho no mesmo grupo de recursos criado anteriormente.

    Os clusters do Red Hat OpenShift do Azure exigem uma rede virtual com duas sub-redes vazias para os nós mestre e de trabalho. Você pode criar uma nova rede virtual ou usar uma rede virtual existente.

    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
    

Criar as identidades gerenciadas atribuídas pelo usuário necessárias

  1. Crie as identidades requeridas a seguir. O Red Hat OpenShift do Azure requer nove identidades gerenciadas, cada uma precisa ter uma função interna atribuída:

    • Sete identidades gerenciadas relacionadas aos principais operadores do OpenShift.
    • Uma identidade gerenciada para o operador de serviço do Red Hat OpenShift no Azure.
    • Uma outra identidade para o cluster para habilitar o uso dessas identidades.

    Os componentes de identidade gerenciada são:

    • Operador de Registro de Imagens do OpenShift (image-registry)
    • Operador de rede openshift (cloud-network-config)
    • Operador de Armazenamento de Disco do OpenShift (disk-csi-driver)
    • Operador de Armazenamento de Arquivos do OpenShift (file-csi-driver)
    • Operador de entrada de cluster do OpenShift (entrada)
    • Gerenciador de Controle de Nuvem do OpenShift (cloud-controller-manager)
    • Operador de API de Máquina OpenShift (machine-api)
    • Operador do serviço Azure Red Hat OpenShift (aro-operator)

    Há oito identidades gerenciadas diferentes e funções internas correspondentes que representam as permissões necessárias para que cada componente do Red Hat OpenShift do Azure execute suas funções. Além disso, a plataforma requer uma outra identidade, a identidade do cluster, para executar a criação de credenciais federadas para os componentes de identidade gerenciada listados anteriormente (aro-cluster).

    Para obter mais informações sobre os operadores de cluster do Red Hat OpenShift, consulte a referência de Operadores de Cluster.

    Para obter mais informações sobre identidades gerenciadas no Red Hat OpenShift do Azure, consulte Noções básicas sobre identidades gerenciadas no Red Hat OpenShift do Azure.

    Crie as identidades necessárias:

    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. Crie as atribuições de função necessárias para cada identidade do operador, a identidade do cluster e a entidade de serviço de primeira parte.

    Observação

    Este artigo pressupõe que apenas sub-redes mestras e de trabalho estejam presentes. Se você configurou mais sub-redes de cluster no momento da instalação, precisará conceder o escopo de atribuição de função a essas sub-redes, para operadores que exigem isso.

    As atribuições de função a seguir para sub-redes mestre e de trabalho pressupõem que não haja nenhum grupo de segurança de rede (NSG), tabela de rotas ou gateway NAT (Conversão de Endereço de Rede) anexado. Se você levar qualquer um desses recursos de rede para a instalação, precisará criar mais atribuições de função que concedam permissões de identidades de operador para esses recursos de rede extras. Para cada operador que requer uma atribuição de função para as sub-redes a seguir ou para a rede virtual, ele também requer uma atribuição de função para o recurso de rede extra.

    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"
    

Criar o cluster

Para criar um cluster, execute o comando a seguir mostrado nas opções. Se você optar por usar uma das seguintes opções, modifique o comando adequadamente:

  • Opção 1: você pode passar o segredo de pull do Red Hat, que permite que o cluster acesse os registros de contêiner do Red Hat junto com outros conteúdos. Adicione o argumento --pull-secret @pull-secret.txt ao comando.
  • Opção 2: você pode usar um domínio personalizado. Adicione o argumento --___domain foo.example.com ao comando, substituindo foo.example.com pelo seu domínio personalizado.

Crie o cluster com as variáveis de ambiente necessárias. Para cada --assign-platform-workload-identity flag, o primeiro argumento representa a chave, que informa ao provedor de recursos do Azure Red Hat OpenShift qual operador OpenShift usar para uma dada identidade. O segundo argumento representa a referência à própria identidade.

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

Como opção, se houver recursos de identidade em uma região ou grupo de recursos diferente, você poderá passar IDs de recurso completas para criar. Consulte o seguinte exemplo:

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

Selecionar uma versão diferente do Red Hat OpenShift no Azure

Você pode optar por usar uma versão específica do Red Hat OpenShift do Azure ao criar seu cluster. Primeiro, use a CLI para consultar as versões disponíveis do Red Hat OpenShift no Azure:

az aro get-versions --___location <REGION>

Depois que a versão for escolhida, especifique-a usando o parâmetro --version no comando az aro create.

Instalar usando o Bicep

Esta seção descreve como usar o Bicep para criar um cluster do Red Hat OpenShift do Azure utilizando identidades gerenciadas.

  1. Salve o modelo Bicep de exemplo (localizado após a etapa 5) em um arquivo.

  2. Defina as variáveis a seguir no ambiente do shell que você planeja executar os az comandos.

    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. Crie um grupo de recursos para manter o recurso de cluster e a rede virtual do cluster e as identidades.

    az group create --name $RESOURCEGROUP --___location $LOCATION
    
  4. Para o provedor de recursos, verifique a ID do objeto da entidade de serviço de primeira parte para sua assinatura.

    ARO_RP_SP_OBJECT_ID=$(az ad sp list --display-name "Azure Red Hat OpenShift RP" --query '[0].id' -o tsv)
    
  5. Aplique o modelo 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
        (--parameters ___domain=$DOMAIN) \ #optional
        (--parameters pullSecret=$PULL_SECRET) # optional
    

Exemplo de modelo Bicep

Observação

Este artigo pressupõe que apenas sub-redes mestras e de trabalho estejam presentes. Se você configurou mais sub-redes de cluster no momento da instalação, precisará conceder o escopo de atribuição de função a essas sub-redes, para operadores que exigem isso.

As atribuições de função a seguir para sub-redes mestre e de trabalho pressupõem que não haja nenhum grupo de segurança de rede (NSG), tabela de rotas ou gateway NAT (Conversão de Endereço de Rede) anexado. Se você levar qualquer um desses recursos de rede para a instalação, precisará criar mais atribuições de função que concedam permissões de identidades de operador para esses recursos de rede extras. Para cada operador que requer uma atribuição de função para as sub-redes a seguir ou para a rede virtual, ele também requer uma atribuição de função para o recurso de rede extra.

@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}': {}
       }
   }
}

Limpeza

Para excluir um cluster de identidade gerenciada, execute o seguinte comando:

az aro delete -n $CLUSTER -g $RESOURCEGROUP

Observe que esse comando de exclusão não limpa as identidades gerenciadas atribuídas pelo cluster que foram criadas como parte da instalação. Você precisa excluir manualmente as identidades e as atribuições de função.