Partilhar via


Usar uma identidade gerenciada no Serviço Kubernetes do Azure (AKS)

Os clusters do Serviço Kubernetes do Azure (AKS) exigem uma identidade para acessar recursos do Azure, como balanceadores de carga e discos gerenciados. A identidade pode ser uma identidade gerenciada ou uma entidade de serviço.

Este artigo fornece detalhes sobre como habilitar os seguintes tipos de identidade gerenciada em um cluster AKS novo ou existente:

  • Identidade gerida atribuída pelo sistema
  • Traga sua própria identidade gerenciada atribuída pelo usuário
  • Identidade gerenciada pré-criada do Kubelet

Descrição geral

Quando você implanta um cluster AKS, uma identidade gerenciada atribuída ao sistema é criada automaticamente e gerenciada pela plataforma Azure, portanto, não exige que você provisione ou gire nenhum segredo. Para obter mais informações, consulte identidades gerenciadas para recursos do Azure.

O AKS não cria automaticamente uma entidade de serviço, então você precisa criar uma. Os clusters que usam uma entidade de serviço eventualmente expiram, e a entidade de serviço deve ser renovada para evitar afetar a autenticação de cluster com a identidade. O gerenciamento de entidades de serviço adiciona complexidade, por isso é mais fácil usar identidades gerenciadas. Os mesmos requisitos de permissão se aplicam a entidades de serviço e identidades gerenciadas. As identidades gerenciadas usam autenticação baseada em certificado. As credenciais de cada identidade gerenciada têm uma expiração de 90 dias e são roladas após 45 dias.

O AKS usa tipos de identidade gerenciada atribuídos pelo sistema e pelo usuário, e essas identidades são imutáveis. Esses tipos de identidade não devem ser confundidos com uma identidade do Microsoft Entra Workload, que se destina ao uso por um aplicativo em execução em um pod.

Importante

A identidade gerenciada por pod do Microsoft Entra de código aberto (visualização) no Serviço Kubernetes do Azure foi preterida em 24/10/2022 e o projeto arquivado em setembro de 2023. Para obter mais informações, consulte o aviso de descontinuação. O complemento AKS Managed começa a ser descontinuado em setembro de 2024.

Recomendamos que você primeiro revise a visão geral do Microsoft Entra Workload ID . A autenticação de ID de Carga de Trabalho do Entra substitui a identidade gerenciada pelo pod do Microsoft Entra (visualização) e é o método recomendado para permitir que um aplicativo em execução em um pod se autentique em relação a outros serviços do Azure que oferecem suporte a ele.

Antes de começar

  • Verifique se você tem a CLI do Azure versão 2.23.0 ou posterior instalada. Executar az --version para localizar a versão. Se precisar de instalar ou atualizar, veja Install Azure CLI (Instalar o Azure CLI).

  • Para usar uma identidade gerenciada kubelet pré-criada, você precisa da CLI do Azure versão 2.26.0 ou posterior instalada.

  • Para atualizar a identidade gerenciada em um cluster existente, você precisa da CLI do Azure versão 2.49.0 ou posterior instalada.

Limitações

  • Não há suporte para locatários que movem ou migram um cluster gerenciado habilitado para identidade.
  • Se o cluster tiver a identidade gerenciada pelo pod do Microsoft Entra (aad-pod-identity) habilitada, os pods NMI (Node-Managed Identity) modificarão os iptables dos nós para intercetar chamadas para o ponto de extremidade IMDS (Instance Metadata) do Azure. Essa configuração significa que qualquer solicitação feita ao ponto de extremidade de metadados é intercetada pelo NMI, mesmo que o pod não use aad-pod-identity. AzurePodIdentityException CRD pode ser configurado para informar aad-pod-identity sobre quaisquer solicitações para o ponto de extremidade de metadados originadas de um pod que corresponda a rótulos definidos em CRD devem ser intermediadas por proxy sem qualquer processamento no NMI. Os pods do sistema com kubernetes.azure.com/managedby: aks rótulo no namespace kube-system devem ser excluídos configurando aad-pod-identity o CRD AzurePodIdentityException.
  • O AKS não suporta o uso de uma identidade gerenciada atribuída ao sistema ao usar uma zona DNS privada personalizada.

Resumo das identidades gerenciadas

O AKS usa várias identidades gerenciadas para serviços e complementos integrados.

Identidade Nome Caso de utilização Permissões padrão Traga a sua própria identidade
Plano de controlo Nome do cluster AKS Usado por componentes do plano de controle AKS para gerenciar recursos de cluster, incluindo balanceadores de carga de entrada e IPs públicos gerenciados pelo AKS, Autoscaler de Cluster, Disco do Azure, Arquivo, drivers CSI de Blob. Função de colaborador para o grupo de recursos Nó Suportado
Kubelet AKS Cluster-agentpool de nomes Autenticação com o Azure Container Registry (ACR). N/A (para kubernetes v1.15+) Suportado
Suplemento AzureNPM Não é necessária identidade. N/A Não
Suplemento Monitoramento de rede AzureCNI Não é necessária identidade. N/A Não
Suplemento azure-policy (gatekeeper) Não é necessária identidade. N/A Não
Suplemento azure-policy Não é necessária identidade. N/A Não
Suplemento Calico Não é necessária identidade. N/A Não
Suplemento Dashboard Não é necessária identidade. N/A Não
Suplemento roteamento de aplicativos Gerencia o DNS do Azure e os certificados do Azure Key Vault Segredos do Cofre da Chave Função de utilizador para o Cofre da Chave, função de Colaborador da Zona DNZ para zonas DNS, função de Colaborador da Zona DNS Privada para zonas DNS privadas Não
Suplemento HTTPApplicationRouting Gerencia os recursos de rede necessários. Função de leitor para grupo de recursos de nó, função de colaborador para zona DNS Não
Suplemento Gateway de aplicativo de ingresso Gerencia os recursos de rede necessários. Função de colaborador para o grupo de recursos do nó Não
Suplemento omsagent Usado para enviar métricas AKS para o Azure Monitor. Função de Publicador de Métricas de Monitoramento Não
Suplemento Nó virtual (ACIConnector) Gerencia os recursos de rede necessários para as Instâncias de Contêiner do Azure (ACI). Função de colaborador para o grupo de recursos do nó Não
Suplemento Análise de custos Usado para coletar dados de alocação de custos
Identidade da carga de trabalho ID da carga de trabalho do Microsoft Entra Permite que os aplicativos acessem recursos de nuvem com segurança com o ID de carga de trabalho do Microsoft Entra. N/A Não

Habilitar identidades gerenciadas em um novo cluster AKS

Nota

O AKS cria uma identidade kubelet atribuída pelo usuário no grupo de recursos do nó se você não especificar sua própria identidade gerenciada pelo kubelet.

Nota

Se o cluster já estiver usando a identidade gerenciada e a identidade tiver sido alterada, por exemplo, você atualizar o tipo de identidade do cluster de atribuído pelo sistema para atribuído pelo usuário, haverá um atraso para que os componentes do plano de controle alternem para a nova identidade. Os componentes do plano de controle continuam usando a identidade antiga até que seu token expire. Depois que o token é atualizado, eles mudam para a nova identidade. Este processo pode demorar várias horas.

  1. Crie um grupo de recursos do Azure usando o az group create comando.

    az group create --name myResourceGroup --location westus2
    
  2. Crie um cluster AKS usando o az aks create comando.

    az aks create -g myResourceGroup -n myManagedCluster --enable-managed-identity
    
  3. Obtenha credenciais para acessar o cluster usando o az aks get-credentials comando.

    az aks get-credentials --resource-group myResourceGroup --name myManagedCluster
    

Habilitar identidades gerenciadas em um cluster AKS existente

Para atualizar seu cluster AKS existente que está usando uma entidade de serviço para usar uma identidade gerenciada atribuída ao sistema, execute o az aks update comando.

az aks update -g myResourceGroup -n myManagedCluster --enable-managed-identity

Depois de atualizar o cluster, o plano de controle e os pods usam a identidade gerenciada. O Kubelet continua usando uma entidade de serviço até que você atualize seu agentpool. Você pode usar o az aks nodepool upgrade --resource-group myResourceGroup --cluster-name myAKSCluster --name mynodepool --node-image-only comando em seus nós para atualizar para uma identidade gerenciada. Uma atualização do pool de nós causa tempo de inatividade para o cluster AKS, pois os nós nos pools de nós são isolados/drenados e recriados.

Nota

Lembre-se das seguintes informações ao atualizar o cluster:

  • Uma atualização só funciona se houver uma atualização VHD para consumir. Se você estiver executando o VHD mais recente, precisará esperar até que o próximo VHD esteja disponível para executar a atualização.

  • A CLI do Azure garante que a permissão do seu addon seja definida corretamente após a migração. Se você não estiver usando a CLI do Azure para executar a operação de migração, precisará manipular a permissão da identidade do complemento sozinho. Para obter um exemplo usando um modelo do Azure Resource Manager (ARM), consulte Atribuir funções do Azure usando modelos ARM.

  • Se o cluster estava usando --attach-acr para extrair imagens do Registro de Contêiner do Azure, você precisará executar o az aks update --resource-group myResourceGroup --name myAKSCluster --attach-acr <ACR resource ID> comando depois de atualizar o cluster para permitir que o kubelet recém-criado usado para identidade gerenciada obtenha a permissão para extrair do ACR. Caso contrário, você não poderá extrair do ACR após a atualização.

Adicionar atribuição de função para identidade gerenciada

Quando você cria e usa sua própria rede virtual, anexa discos do Azure, endereço IP estático, tabela de rotas ou identidade kubelet atribuída pelo usuário onde os recursos estão fora do grupo de recursos do nó de trabalho, a CLI do Azure adiciona a atribuição de função automaticamente. Se você estiver usando um modelo ARM ou outro método, precisará usar a ID Principal da identidade gerenciada pelo cluster para executar uma atribuição de função.

Se você não estiver usando a CLI do Azure, mas estiver usando sua própria rede virtual, anexar discos do Azure, endereço IP estático, tabela de rotas ou identidade kubelet atribuída pelo usuário que esteja fora do grupo de recursos do nó de trabalho, recomendamos usar a identidade gerenciada atribuída pelo usuário para o plano de controle. Para que o plano de controle use uma identidade gerenciada atribuída ao sistema, não é possível obter a ID de identidade antes de criar o cluster, o que atrasa a atribuição de função de entrar em vigor.

Obter o ID principal da identidade gerenciada

  • Obtenha o ID principal da identidade existente usando o az identity show comando.

    az identity show --ids <identity-resource-id>
    

    Sua saída deve ser semelhante à saída de exemplo a seguir:

    {
      "clientId": "<client-id>",
      "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity",
      "location": "eastus",
      "name": "myIdentity",
      "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    

Adicionar atribuição de função

Para uma rede virtual, disco do Azure anexado, endereço IP estático ou tabela de rotas fora do grupo de recursos do nó de trabalho padrão, você precisa atribuir a Contributor função no grupo de recursos personalizado.

  • Atribua a Contributor função no grupo de recursos personalizado usando o az role assignment create comando.

    az role assignment create --assignee <control-plane-identity-principal-id> --role "Contributor" --scope "<custom-resource-group-resource-id>"
    

Para uma identidade kubelet atribuída pelo usuário fora do grupo de recursos do nó de trabalho padrão, você precisa atribuir a função de Operador de Identidade Gerenciada na identidade kubelet para identidade gerenciada do plano de controle.

  • Atribua a Managed Identity Operator função na identidade kubelet usando o az role assignment create comando.

    az role assignment create --assignee  <control-plane-identity-principal-id> --role "Managed Identity Operator" --scope "<kubelet-identity-resource-id>"
    

Nota

Pode levar até 60 minutos para que as permissões concedidas à identidade gerenciada do cluster sejam preenchidas.

Traga sua própria identidade gerenciada

Criar um cluster usando a identidade gerenciada atribuída pelo usuário

Uma identidade gerenciada personalizada atribuída pelo usuário para o plano de controle permite o acesso à identidade existente antes da criação do cluster. Esse recurso permite cenários como o uso de uma VNet personalizada ou outboundType de UDR com uma identidade gerenciada pré-criada.

Nota

As regiões USDOD Central, USDOD East e USGov Iowa na nuvem do Azure US Government não são suportadas.

O AKS cria uma identidade kubelet atribuída pelo usuário no grupo de recursos do nó se você não especificar sua própria identidade gerenciada pelo kubelet.

  • Se você não tiver uma identidade gerenciada, crie uma usando o az identity create comando.

    az identity create --name myIdentity --resource-group myResourceGroup
    

    Sua saída deve ser semelhante à saída de exemplo a seguir:

    {                                  
      "clientId": "<client-id>",
      "clientSecretUrl": "<clientSecretUrl>",
      "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity", 
      "location": "westus2",
      "name": "myIdentity",
      "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",                       
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    

Nota

Pode levar até 60 minutos para que as permissões concedidas à identidade gerenciada do cluster sejam preenchidas.

  • Antes de criar o cluster, adicione a atribuição de função para identidade gerenciada usando o az role assignment create comando.

  • Crie o cluster com identidade gerenciada atribuída pelo usuário.

    az aks create \
        --resource-group myResourceGroup \
        --name myManagedCluster \
        --network-plugin azure \
        --vnet-subnet-id <subnet-id> \
        --dns-service-ip 10.2.0.10 \
        --service-cidr 10.2.0.0/24 \
        --enable-managed-identity \
        --assign-identity <identity-resource-id>
    

Atualizar identidade gerenciada em um cluster existente

Nota

A migração de uma identidade gerenciada para o plano de controle, de atribuída pelo sistema para atribuída pelo usuário, não causa nenhum tempo de inatividade para o plano de controle e os pools de agentes. Enquanto isso, os componentes do plano de controle continuam usando a antiga identidade atribuída ao sistema por várias horas até a próxima atualização de token.

  • Se você não tiver uma identidade gerenciada, crie uma usando o az identity create comando.

    az identity create --name myIdentity --resource-group myResourceGroup
    

    Sua saída deve ser semelhante à saída de exemplo a seguir:

    {                                  
      "clientId": "<client-id>",
      "clientSecretUrl": "<clientSecretUrl>",
      "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity", 
      "location": "westus2",
      "name": "myIdentity",
      "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",                       
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    
  • Depois de criar a identidade gerenciada personalizada atribuída pelo usuário para o plano de controle, adicione a atribuição de função para a identidade gerenciada usando o az role assignment create comando.

  • Atualize seu cluster com suas identidades existentes usando o az aks update comando. Certifique-se de fornecer a ID de recurso da identidade gerenciada para o plano de controle incluindo o assign-identity argumento.

    az aks update \
        --resource-group myResourceGroup \
        --name myManagedCluster \
        --enable-managed-identity \
        --assign-identity <identity-resource-id> 
    

    Sua saída para uma atualização de cluster bem-sucedida usando sua própria identidade gerenciada kubelet deve ser semelhante à saída de exemplo a seguir:

      "identity": {
        "principalId": null,
        "tenantId": null,
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/<subscriptionid>/resourcegroups/resourcegroups/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity": {
            "clientId": "<client-id>",
            "principalId": "<principal-id>"
          }
        }
      },
    

Use uma identidade gerenciada kubelet pré-criada

Uma identidade kubelet permite o acesso à identidade existente antes da criação do cluster. Esse recurso permite cenários como conexão com ACR com uma identidade gerenciada pré-criada.

Limitações de identidade kubelet pré-criadas

  • Só funciona com um cluster gerenciado atribuído pelo usuário.
  • As regiões Leste da China e Norte da China no Microsoft Azure operadas pela 21Vianet não são suportadas.

Criar identidades gerenciadas atribuídas pelo usuário

Identidade gerenciada do plano de controle

  • Se você não tiver uma identidade gerenciada para o plano de controle, crie uma usando o az identity create.

    az identity create --name myIdentity --resource-group myResourceGroup
    

    Sua saída deve ser semelhante à saída de exemplo a seguir:

    {                                  
      "clientId": "<client-id>",
      "clientSecretUrl": "<clientSecretUrl>",
      "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity", 
      "location": "westus2",
      "name": "myIdentity",
      "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",                       
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    

identidade gerenciada kubelet

  • Se você não tiver uma identidade gerenciada pelo kubelet, crie uma usando o az identity create comando.

    az identity create --name myKubeletIdentity --resource-group myResourceGroup
    

    Sua saída deve ser semelhante à saída de exemplo a seguir:

    {
      "clientId": "<client-id>",
      "clientSecretUrl": "<clientSecretUrl>",
      "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myKubeletIdentity", 
      "location": "westus2",
      "name": "myKubeletIdentity",
      "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",                       
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    

Criar um cluster usando a identidade kubelet atribuída pelo usuário

Agora você pode criar seu cluster AKS com suas identidades existentes. Certifique-se de fornecer o ID de recurso da identidade gerenciada para o plano de controle incluindo o assign-identity argumento e a identidade gerenciada kubelet usando o assign-kubelet-identity argumento.

  • Crie um cluster AKS com suas identidades existentes usando o az aks create comando.

    az aks create \
        --resource-group myResourceGroup \
        --name myManagedCluster \
        --network-plugin azure \
        --vnet-subnet-id <subnet-id> \
        --dns-service-ip 10.2.0.10 \
        --service-cidr 10.2.0.0/24 \
        --enable-managed-identity \
        --assign-identity <identity-resource-id> \
        --assign-kubelet-identity <kubelet-identity-resource-id>
    

    Uma criação de cluster AKS bem-sucedida usando sua própria identidade gerenciada kubelet deve ser semelhante à seguinte saída de exemplo:

      "identity": {
        "principalId": null,
        "tenantId": null,
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/<subscriptionid>/resourcegroups/resourcegroups/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity": {
            "clientId": "<client-id>",
            "principalId": "<principal-id>"
          }
        }
      },
      "identityProfile": {
        "kubeletidentity": {
          "clientId": "<client-id>",
          "objectId": "<object-id>",
          "resourceId": "/subscriptions/<subscriptionid>/resourcegroups/resourcegroups/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myKubeletIdentity"
        }
      },
    

Atualizar um cluster existente usando a identidade kubelet

Aviso

A atualização da identidade gerenciada kubelet atualiza os pools de nós, o que causa tempo de inatividade para o cluster AKS à medida que os nós nos pools de nós são isolados/drenados e recriados.

Nota

Se o cluster estava usando --attach-acr para extrair imagens do Registro de Contêiner do Azure, você precisará executar o az aks update --resource-group myResourceGroup --name myAKSCluster --attach-acr <ACR Resource ID> comando depois de atualizar o cluster para permitir que o kubelet recém-criado usado para identidade gerenciada obtenha a permissão para extrair do ACR. Caso contrário, você não poderá extrair do ACR após a atualização.

Obtenha a identidade gerenciada do plano de controle atual para seu cluster AKS

  1. Confirme se o cluster AKS está usando a identidade gerenciada atribuída pelo usuário usando o az aks show comando.

    az aks show -g <RGName> -n <ClusterName> --query "servicePrincipalProfile"
    

    Se o cluster estiver usando uma identidade gerenciada, a saída será exibida clientId com um valor msi. Um cluster usando uma entidade de serviço mostra uma ID de objeto. Por exemplo:

    {
      "clientId": "msi"
    }
    
  2. Depois de confirmar que o cluster está usando uma identidade gerenciada, localize o ID de recurso da identidade gerenciada usando o az aks show comando.

    az aks show -g <RGName> -n <ClusterName> --query "identity"
    

    Para uma identidade gerenciada atribuída pelo usuário, sua saída deve ser semelhante à saída de exemplo a seguir:

    {
      "principalId": null,
      "tenantId": null,
      "type": "UserAssigned",
      "userAssignedIdentities": <identity-resource-id>
          "clientId": "<client-id>",
          "principalId": "<principal-id>"
    },
    

Atualize seu cluster com a identidade kubelet

  1. Se você não tiver uma identidade gerenciada pelo kubelet, crie uma usando o az identity create comando.

    az identity create --name myKubeletIdentity --resource-group myResourceGroup
    

    Sua saída deve ser semelhante à saída de exemplo a seguir:

    {
      "clientId": "<client-id>",
      "clientSecretUrl": "<clientSecretUrl>",
      "id": "/subscriptions/<subscriptionid>/resourcegroups/myResourceGroup/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myKubeletIdentity",
      "location": "westus2",
      "name": "myKubeletIdentity",
      "principalId": "<principal-id>",
      "resourceGroup": "myResourceGroup",                       
      "tags": {},
      "tenantId": "<tenant-id>",
      "type": "Microsoft.ManagedIdentity/userAssignedIdentities"
    }
    
  2. Atualize seu cluster com suas identidades existentes usando o az aks update comando. Certifique-se de fornecer o ID de recurso da identidade gerenciada para o plano de controle incluindo o assign-identity argumento e a identidade gerenciada kubelet para assign-kubelet-identity argumento.

    az aks update \
        --resource-group myResourceGroup \
        --name myManagedCluster \
        --enable-managed-identity \
        --assign-identity <identity-resource-id> \
        --assign-kubelet-identity <kubelet-identity-resource-id>
    

    Sua saída para uma atualização de cluster bem-sucedida usando sua própria identidade gerenciada kubelet deve ser semelhante à saída de exemplo a seguir:

      "identity": {
        "principalId": null,
        "tenantId": null,
        "type": "UserAssigned",
        "userAssignedIdentities": {
          "/subscriptions/<subscriptionid>/resourcegroups/resourcegroups/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentity": {
            "clientId": "<client-id>",
            "principalId": "<principal-id>"
          }
        }
      },
      "identityProfile": {
        "kubeletidentity": {
          "clientId": "<client-id>",
          "objectId": "<object-id>",
          "resourceId": "/subscriptions/<subscriptionid>/resourcegroups/resourcegroups/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myKubeletIdentity"
        }
      },
    

Próximos passos

  • Use os modelos do Azure Resource Manager para criar um cluster gerenciado habilitado para identidade.
  • Saiba como [usar kubelogin][kubelogin-authentication] para todos os métodos de autenticação Microsoft Entra suportados no AKS.