Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Neste artigo, aprende como implementar e configurar um cluster Azure Kubernetes Service (AKS) com ID de carga de trabalho Microsoft Entra. Os passos deste artigo incluem:
- Crie um novo cluster AKS ou atualize um cluster AKS existente usando a CLI do Azure ou Terraform com o emissor OpenID Connect (OIDC) e o ID de carga de trabalho Microsoft Entra ativado.
- Crie uma identidade de carga de trabalho e uma conta de serviço Kubernetes.
- Configure a identidade gerenciada para federação de tokens.
- Implante a carga de trabalho e verifique a autenticação através da identidade da carga de trabalho.
- Opcionalmente, conceda a um pod no cluster acesso a segredos num cofre de chaves do Azure.
Pré-requisitos
- Se não tiver uma conta Azure, crie uma conta free antes de começar.
- Este artigo requer a versão 2.47.0 ou posterior da CLI do Azure. Se estiver a usar Azure Cloud Shell, a versão mais recente já está instalada. Executar
az --versionpara localizar a versão. Se precisares de instalar ou atualizar, vê Install CLI do Azure. - Verifique se a identidade que você está usando para criar seu cluster tem as permissões mínimas apropriadas. Para mais informações, consulte Acesso e opções de identidade para Azure Kubernetes Service (AKS).
- Se tiver várias subscrições Azure, selecione o ID de subscrição apropriado onde os recursos devem ser faturados usando o comando
az account set.
- Terraform instalado localmente. Para instruções de instalação, consulte Instalar Terraform.
Nota
Você pode usar o Service Connector para ajudá-lo a configurar algumas etapas automaticamente. Para mais informações, consulte Tutorial: Ligue à Azure conta de armazenamento em Azure Kubernetes Service (AKS) com o Service Connector usando ID de carga de trabalho Microsoft Entra.
Criar o ficheiro de configuração do Terraform
Os ficheiros de configuração do Terraform definem a infraestrutura que o Terraform cria e gere.
Crie um ficheiro chamado
main.tfe adicione o seguinte código para definir a versão do Terraform e especificar o fornecedor Azure:terraform { required_version = ">= 1.5.0" required_providers { azurerm = { source = "hashicorp/azurerm" version = "~> 4.0" } kubernetes = { source = "hashicorp/kubernetes" version = "~> 2.30" } random = { source = "hashicorp/random" version = "~> 3.6" } } } provider "azurerm" { features {} subscription_id = var.subscription_id } data "azurerm_client_config" "current" {}Adicione o seguinte código para
main.tfdefinir variáveis reutilizáveis e gerar nomes únicos para todos os recursos:resource "random_string" "suffix" { length = 6 upper = false special = false numeric = true } locals { suffix = random_string.suffix.result resource_group_name = "rg-aks-wi-${local.suffix}" cluster_name = "akswi${local.suffix}" managed_identity_name = "uami-wi-${local.suffix}" federated_credential_name = "fic-wi-${local.suffix}" key_vault_name = lower(substr("kvwi${local.suffix}", 0, 24)) secret_name = "secret-${local.suffix}" service_account_name = "workload-sa-${local.suffix}" service_account_namespace = "default" workload_identity_subject = "system:serviceaccount:${local.service_account_namespace}:${local.service_account_name}" }
Criar um grupo de recursos
Crie um grupo de recursos usando o comando az group create.
export RANDOM_ID="$(openssl rand -hex 3)"
export RESOURCE_GROUP="myResourceGroup$RANDOM_ID"
export LOCATION="<your-preferred-region>"
az group create --name "${RESOURCE_GROUP}" --location "${LOCATION}"
Adicione o código seguinte a main.tf para criar um grupo de recursos Azure. Atualize o valor location para corresponder à sua região de Azure preferida.
resource "azurerm_resource_group" "this" {
name = local.resource_group_name
location = "eastus"
}
Ativar o emissor OIDC e o ID de carga de trabalho Microsoft Entra num cluster AKS
Pode ativar o emissor OIDC e o ID de carga de trabalho Microsoft Entra num cluster AKS novo ou existente.
Crie um cluster AKS usando o comando az aks create com o parâmetro --enable-oidc-issuer para ativar o emissor OIDC e o parâmetro --enable-workload-identity para ativar ID de carga de trabalho Microsoft Entra. O exemplo a seguir cria um cluster com um único nó:
export CLUSTER_NAME="myAKSCluster$RANDOM_ID"
az aks create \
--resource-group "${RESOURCE_GROUP}" \
--name "${CLUSTER_NAME}" \
--enable-oidc-issuer \
--enable-workload-identity \
--generate-ssh-keys
Após alguns minutos, o comando conclui e retorna informações formatadas em JSON sobre o cluster.
Adicione o seguinte código a main.tf para criar um cluster AKS com emissor OIDC e ID de carga de trabalho Microsoft Entra ativados:
resource "azurerm_kubernetes_cluster" "this" {
name = local.cluster_name
location = azurerm_resource_group.this.location
resource_group_name = azurerm_resource_group.this.name
dns_prefix = local.cluster_name
oidc_issuer_enabled = true
workload_identity_enabled = true
role_based_access_control_enabled = true
default_node_pool {
name = "system"
node_count = 1
vm_size = "Standard_B4ms"
}
identity {
type = "SystemAssigned"
}
}
Recuperar o URL do emissor OIDC
Obtenha o URL do emissor OIDC usando o az aks show comando e guarde-o numa variável ambiental.
export AKS_OIDC_ISSUER="$(az aks show --name "${CLUSTER_NAME}" \
--resource-group "${RESOURCE_GROUP}" \
--query "oidcIssuerProfile.issuerUrl" \
--output tsv)"
A variável de ambiente deve conter a URL do emissor, semelhante ao exemplo a seguir:
https://eastus.oic.prod-aks.azure.com/00000000-0000-0000-0000-000000000000/11111111-1111-1111-1111-111111111111/
Por padrão, o emissor está configurado para usar a URL base https://{region}.oic.prod-aks.azure.com/{tenant_id}/{uuid}, onde o valor de {region} corresponde ao local no qual o cluster AKS está implantado. O valor {uuid} representa a chave OIDC, que é um GUID gerado aleatoriamente e imutável para cada cluster.
Adicione o seguinte código em main.tf para recuperar a URL do emissor OIDC:
output "oidc_issuer_url" {
value = azurerm_kubernetes_cluster.this.oidc_issuer_url
}
Criar uma identidade gerenciada
Obtenha o ID da subscrição e guarde-o numa variável de ambiente usando o
az account showcomando.export SUBSCRIPTION="$(az account show --query id --output tsv)"Crie uma identidade gerenciada atribuída pelo usuário usando o
az identity createcomando.export USER_ASSIGNED_IDENTITY_NAME="myIdentity$RANDOM_ID" az identity create \ --name "${USER_ASSIGNED_IDENTITY_NAME}" \ --resource-group "${RESOURCE_GROUP}" \ --location "${LOCATION}" \ --subscription "${SUBSCRIPTION}"O exemplo de saída a seguir mostra a criação bem-sucedida de uma identidade gerenciada:
{ "clientId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/myResourceGroupxxxxxx/providers/Microsoft.ManagedIdentity/userAssignedIdentities/myIdentityxxxxxx", "location": "eastus", "name": "myIdentityxxxxxx", "principalId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "resourceGroup": "myResourceGroupxxxxxx", "systemData": null, "tags": {}, "tenantId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "type": "Microsoft.ManagedIdentity/userAssignedIdentities" }Obtenha o ID do cliente da identidade gerida e guarde-o numa variável de ambiente usando o
az identity showcomando.export USER_ASSIGNED_CLIENT_ID="$(az identity show \ --resource-group "${RESOURCE_GROUP}" \ --name "${USER_ASSIGNED_IDENTITY_NAME}" \ --query 'clientId' \ --output tsv)"
Adicione o seguinte código ao main.tf para criar uma identidade gerida:
resource "azurerm_user_assigned_identity" "this" {
name = local.managed_identity_name
location = azurerm_resource_group.this.location
resource_group_name = azurerm_resource_group.this.name
}
Criar uma conta de serviço do Kubernetes
Conecte-se ao cluster AKS usando o
az aks get-credentialscomando.az aks get-credentials --name "${CLUSTER_NAME}" --resource-group "${RESOURCE_GROUP}"Crie uma conta de serviço Kubernetes e anote-a com o ID do cliente da identidade gerida aplicando o seguinte manifesto usando o
kubectl applycomando.export SERVICE_ACCOUNT_NAME="workload-identity-sa$RANDOM_ID" export SERVICE_ACCOUNT_NAMESPACE="default" cat <<EOF | kubectl apply -f - apiVersion: v1 kind: ServiceAccount metadata: annotations: azure.workload.identity/client-id: "${USER_ASSIGNED_CLIENT_ID}" name: "${SERVICE_ACCOUNT_NAME}" namespace: "${SERVICE_ACCOUNT_NAMESPACE}" EOFO seguinte resultado demonstra a criação bem-sucedida da identidade de carga de trabalho.
serviceaccount/workload-identity-sa created
Adicione o seguinte código em
main.tfpara configurar o acesso ao Kubernetes e permitir a criação de recursos Kubernetes:data "azurerm_kubernetes_cluster" "this" { name = azurerm_kubernetes_cluster.this.name resource_group_name = azurerm_resource_group.this.name } provider "kubernetes" { host = data.azurerm_kubernetes_cluster.this.kube_config[0].host client_certificate = base64decode(data.azurerm_kubernetes_cluster.this.kube_config[0].client_certificate) client_key = base64decode(data.azurerm_kubernetes_cluster.this.kube_config[0].client_key) cluster_ca_certificate = base64decode(data.azurerm_kubernetes_cluster.this.kube_config[0].cluster_ca_certificate) }Adicione o seguinte código dentro de
main.tfpara criar uma conta de serviço Kubernetes e anotá-la com o Client ID da identidade gerida.resource "kubernetes_service_account" "this" { metadata { name = local.service_account_name namespace = local.service_account_namespace annotations = { "azure.workload.identity/client-id" = azurerm_user_assigned_identity.this.client_id } } }
Criar a credencial de identidade federada
Crie uma credencial de identidade federada entre a identidade gerida, o emissor da conta de serviço e o sujeito que utiliza o az identity federated-credential create comando.
export FEDERATED_IDENTITY_CREDENTIAL_NAME="myFedIdentity$RANDOM_ID"
az identity federated-credential create \
--name ${FEDERATED_IDENTITY_CREDENTIAL_NAME} \
--identity-name "${USER_ASSIGNED_IDENTITY_NAME}" \
--resource-group "${RESOURCE_GROUP}" \
--issuer "${AKS_OIDC_ISSUER}" \
--subject system:serviceaccount:"${SERVICE_ACCOUNT_NAMESPACE}":"${SERVICE_ACCOUNT_NAME}" \
--audience api://AzureADTokenExchange
Nota
Leva alguns segundos para que a credencial de identidade federada se propague depois de adicionada. Se uma solicitação de token for feita imediatamente após a adição da credencial de identidade federada, a solicitação poderá falhar até que o cache seja atualizado. Para evitar esse problema, você pode adicionar um pequeno atraso após adicionar a credencial de identidade federada.
Adicione o seguinte código em main.tf para criar uma credencial federada de identidade entre a identidade gerida, o emissor da conta de serviço e o sujeito:
resource "azurerm_federated_identity_credential" "this" {
name = local.federated_credential_name
resource_group_name = azurerm_resource_group.this.name
parent_id = azurerm_user_assigned_identity.this.id
issuer = azurerm_kubernetes_cluster.this.oidc_issuer_url
subject = local.workload_identity_subject
audience = ["api://AzureADTokenExchange"]
}
Para mais informações sobre credenciais de identidade federada em Microsoft Entra, consulte Visão geral das credenciais de identidade federada em Microsoft Entra ID.
Crie um cofre de chaves com autorização Azure RBAC
O exemplo seguinte mostra como usar o modelo de permissões de controlo de acesso baseado em papéis do Azure (Azure RBAC) para conceder ao pod acesso ao cofre de chaves. Para mais informações sobre o modelo de permissões Azure RBAC para Azure Key Vault, consulte Conceder permissão a candidaturas para aceder a um Azure key vault utilizando Azure RBAC.
Crie um cofre de chaves com proteção contra purgas e autorização Azure RBAC ativada usando o comando
az keyvault create. Também podes usar um cofre de chaves existente se estiver configurado tanto para proteção contra purgas como para autorização Azure RBAC.export KEYVAULT_NAME="keyvault-workload-id$RANDOM_ID" # Ensure the key vault name is between 3-24 characters az keyvault create \ --name "${KEYVAULT_NAME}" \ --resource-group "${RESOURCE_GROUP}" \ --location "${LOCATION}" \ --enable-purge-protection \ --enable-rbac-authorizationObtenha o ID do recurso do cofre da chave e guarde-o numa variável de ambiente usando o
az keyvault showcomando.export KEYVAULT_RESOURCE_ID=$(az keyvault show --resource-group "${RESOURCE_GROUP}" \ --name "${KEYVAULT_NAME}" \ --query id \ --output tsv)
Adicione o seguinte código a main.tf para criar um cofre de chaves com autorização Azure RBAC:
resource "azurerm_key_vault" "this" {
name = local.key_vault_name
location = azurerm_resource_group.this.location
resource_group_name = azurerm_resource_group.this.name
tenant_id = data.azurerm_client_config.current.tenant_id
sku_name = "standard"
rbac_authorization_enabled = true
}
Atribuir permissões RBAC para gestão de cofres de chaves
Obtenha o ID do objeto do chamador e guarde-o numa variável de ambiente usando o
az ad signed-in-user showcomando.export CALLER_OBJECT_ID=$(az ad signed-in-user show --query id -o tsv)Atribui-te o papel de Azure RBAC Key Vault Secrets Officer para poderes criar um segredo no novo key vault usando o comando
az role assignment create.az role assignment create --assignee "${CALLER_OBJECT_ID}" \ --role "Key Vault Secrets Officer" \ --scope "${KEYVAULT_RESOURCE_ID}"
Adicione o seguinte código a main.tf para se atribuir a si próprio a função de Key Vault Secrets Officer do Azure RBAC de forma a poder criar um segredo no novo cofre de chaves e atribuir a função de Key Vault Secrets User à identidade gerida atribuída pelo utilizador:
resource "azurerm_role_assignment" "user" {
scope = azurerm_key_vault.this.id
role_definition_name = "Key Vault Secrets Officer"
principal_id = data.azurerm_client_config.current.object_id
}
resource "azurerm_role_assignment" "identity" {
scope = azurerm_key_vault.this.id
role_definition_name = "Key Vault Secrets User"
principal_id = azurerm_user_assigned_identity.this.principal_id
}
Criar e configurar o acesso secreto
Crie um segredo no cofre de chaves usando o
az keyvault secret setcomando.export KEYVAULT_SECRET_NAME="my-secret$RANDOM_ID" az keyvault secret set \ --vault-name "${KEYVAULT_NAME}" \ --name "${KEYVAULT_SECRET_NAME}" \ --value "Hello\!"Obtenha o ID principal da identidade gerida atribuída pelo utilizador e guarde-a numa variável de ambiente usando o
az identity showcomando.export IDENTITY_PRINCIPAL_ID=$(az identity show \ --name "${USER_ASSIGNED_IDENTITY_NAME}" \ --resource-group "${RESOURCE_GROUP}" \ --query principalId \ --output tsv)Atribuir a função Key Vault Secrets User à identidade gerida atribuída a utilizador, usando o comando
az role assignment create. Este passo dá à identidade gerida permissão para ler segredos do cofre de chaves.az role assignment create \ --assignee-object-id "${IDENTITY_PRINCIPAL_ID}" \ --role "Key Vault Secrets User" \ --scope "${KEYVAULT_RESOURCE_ID}" \ --assignee-principal-type ServicePrincipalCrie uma variável de ambiente para o URL do cofre de chaves usando o
az keyvault showcomando.export KEYVAULT_URL="$(az keyvault show \ --resource-group "${RESOURCE_GROUP}" \ --name ${KEYVAULT_NAME} \ --query properties.vaultUri \ --output tsv)"
Adicione o seguinte código em main.tf para criar um segredo no cofre de chaves:
resource "azurerm_key_vault_secret" "this" {
name = local.secret_name
value = "Hello from Key Vault"
key_vault_id = azurerm_key_vault.this.id
}
Implementar um pod de verificação e testar o acesso
Implemente um pod para verificar se a identidade da carga de trabalho pode aceder ao segredo no cofre de chaves. O exemplo seguinte utiliza a imagem
ghcr.io/azure/azure-workload-identity/msal-go, que contém uma aplicação de exemplo que recupera um segredo de Azure Key Vault usando ID de carga de trabalho Microsoft Entra:kubectl apply -f - <<EOF apiVersion: v1 kind: Pod metadata: name: sample-workload-identity-key-vault namespace: ${SERVICE_ACCOUNT_NAMESPACE} labels: azure.workload.identity/use: "true" spec: serviceAccountName: ${SERVICE_ACCOUNT_NAME} containers: - image: ghcr.io/azure/azure-workload-identity/msal-go name: oidc env: - name: KEYVAULT_URL value: ${KEYVAULT_URL} - name: SECRET_NAME value: ${KEYVAULT_SECRET_NAME} nodeSelector: kubernetes.io/os: linux EOFAguarde que o pod esteja no estado
Readyusando o comandokubectl wait.kubectl wait --namespace ${SERVICE_ACCOUNT_NAMESPACE} --for=condition=Ready pod/sample-workload-identity-key-vault --timeout=120sVerifica se a
SECRET_NAMEvariável de ambiente está definida no pod usando okubectl describecomando.kubectl describe pod sample-workload-identity-key-vault | grep "SECRET_NAME:"Se for bem-sucedida, a saída deve ser semelhante ao exemplo a seguir:
SECRET_NAME: ${KEYVAULT_SECRET_NAME}Verifica se os pods conseguem obter um token e aceder ao recurso usando o
kubectl logscomando.kubectl logs sample-workload-identity-key-vaultSe for bem-sucedida, a saída deve ser semelhante ao exemplo a seguir:
I0114 10:35:09.795900 1 main.go:63] "successfully got secret" secret="Hello\\!"Importante
As atribuições de funções RBAC no Azure podem demorar até 10 minutos a propagar-se. Se o pod não conseguir acessar o segredo, talvez seja necessário aguardar a propagação da atribuição de função. Para mais informações, consulte Troubleshoot Azure RBAC.
Desative o ID de carga de trabalho Microsoft Entra num cluster AKS
Desative ID de carga de trabalho Microsoft Entra no cluster AKS onde foi ativado e configurado, atualize o cluster AKS usando o comando az aks update com o parâmetro --disable-workload-identity.
az aks update \
--resource-group "${RESOURCE_GROUP}" \
--name "${CLUSTER_NAME}" \
--disable-workload-identity
Implantar um pod de verificação
Adicione o seguinte código em main.tf para implementar um pod de verificação que utilize a identidade da carga de trabalho para aceder ao secreto no Key Vault:
resource "kubernetes_pod" "test" {
metadata {
name = "workload-identity-test"
namespace = local.service_account_namespace
labels = {
"azure.workload.identity/use" = "true"
}
}
spec {
service_account_name = kubernetes_service_account.this.metadata[0].name
container {
name = "test"
image = "ghcr.io/azure/azure-workload-identity/msal-go"
env {
name = "KEYVAULT_URL"
value = azurerm_key_vault.this.vault_uri
}
env {
name = "SECRET_NAME"
value = azurerm_key_vault_secret.this.name
}
}
}
}
Inicializar Terraform
Inicialize o Terraform no diretório que contém o seu main.tf ficheiro usando o terraform init comando. Este comando descarrega o fornecedor Azure necessário para gerir os recursos do Azure com o Terraform.
terraform init
Criar um plano de execução do Terraform
Crie um plano de execução Terraform usando o terraform plan comando. Este comando mostra-te os recursos que o Terraform irá criar ou modificar na tua subscrição do Azure.
terraform plan
Aplicar a configuração Terraform
Após rever e confirmar o plano de execução, aplique a configuração do Terraform usando o terraform apply comando. Este comando cria ou modifica os recursos definidos no seu ficheiro main.tf na sua subscrição Azure.
terraform apply
Verificar a implantação
Conecte-se ao cluster AKS usando o
az aks get-credentialscomando.az aks get-credentials --name <cluster-name> --resource-group <resource-group>Verifica o estado do pod de verificação usando o
kubectl get podscomando.Quando o pod atingir um
Readyestado, verifique se consegue aceder ao segredo do cofre de chaves verificando os registos do pod usando okubectl logscomando.kubectl logs workload-identity-test
Conteúdo relacionado
Neste artigo, implementou um cluster Kubernetes e configurou-o para usar o ID de carga de trabalho Microsoft Entra em preparação para que as cargas de trabalho da aplicação se autenticassem com essa credencial. Agora está pronto para implementar a sua aplicação e configurá-la para usar a identidade da carga de trabalho com a versão mais recente da biblioteca cliente Azure Identity. Se não for possível reescrever seu aplicativo para usar a versão mais recente da biblioteca do cliente, você poderá configurar seu pod de aplicativo para autenticar usando identidade gerenciada com identidade de carga de trabalho como uma solução de migração de curto prazo.
A integração Service Connector ajuda a simplificar a configuração da ligação para cargas de trabalho AKS e serviços de suporte Azure. Gerem de forma segura a autenticação e configurações de rede, seguindo as melhores práticas para a ligação aos serviços do Azure. Para mais informações, consulte Connect to Azure OpenAI em Foundry Models em AKS usando Microsoft Entra Workload Identity e a introdução do Service Connector.