Implantar e configurar a identidade da carga de trabalho (versão prévia) em um cluster Serviço de Kubernetes do Azure (AKS)
O AKS (Serviço de Kubernetes do Azure) é um serviço de Kubernetes gerenciado que permite implantar e gerenciar clusters do Kubernetes rapidamente. Neste artigo, você irá:
- Implantar um cluster do AKS usando a CLI do Azure que inclui o Emissor do OpenID Connect e uma ID de Carga de Trabalho do Microsoft Entra
- Conceder acesso ao Azure Key Vault
- Criar uma ID de Carga de Trabalho do Microsoft Entra e uma conta de serviço do Kubernetes
- Configurar a identidade gerenciada para federação de token.
Este artigo pressupõe que você tenha uma compreensão básica dos conceitos do Kubernetes. Para obter mais informações, confira Principais conceitos do Kubernetes para o AKS (Serviço de Kubernetes do Azure). Se você não estiver familiarizado com a ID de Carga de Trabalho do Microsoft Entra, consulte o artigo visão geral a seguir.
Este artigo requer a versão 2.47.0 ou posterior da CLI do Azure. Se você está usando o Azure Cloud Shell, a versão mais recente já está instalada.
A identidade que você está usando para criar o cluster tem as permissões mínimas apropriadas. Para obter mais informações sobre o acesso e identidade do AKS, confiraOpções de acesso e identidade para o Serviço de Kubernetes do Azure (AKS).
Se tiver várias assinaturas do Azure, selecione a ID da assinatura adequada para cobrança dos recursos usando o comando az account.
Observação
Em vez de configurar todas as etapas manualmente, há outra implementação chamada Conector de serviço que ajudará você a configurar algumas etapas automaticamente e obter o mesmo resultado. Veja também: Tutorial: conectar-se à conta de armazenamento do Azure no Serviço de Kubernetes do Azure (AKS) com o conector de serviço usando a identidade da carga de trabalho.
Exportar variáveis de ambiente
Para ajudar a simplificar as etapas de configuração das identidades necessárias, as etapas abaixo definem as variáveis de ambiente para referência no cluster.
Execute os comandos a seguir para criar essas variáveis. Substitua os valores padrão por RESOURCE_GROUP
, LOCATION
, SERVICE_ACCOUNT_NAME
, SUBSCRIPTION
, USER_ASSIGNED_IDENTITY_NAME
e FEDERATED_IDENTITY_CREDENTIAL_NAME
.
export RESOURCE_GROUP="myResourceGroup"
export LOCATION="westcentralus"
export SERVICE_ACCOUNT_NAMESPACE="default"
export SERVICE_ACCOUNT_NAME="workload-identity-sa"
export SUBSCRIPTION="$(az account show --query id --output tsv)"
export USER_ASSIGNED_IDENTITY_NAME="myIdentity"
export FEDERATED_IDENTITY_CREDENTIAL_NAME="myFedIdentity"
Criar cluster AKS
Crie um cluster do AKS usando o comando az aks create com o parâmetro --enable-oidc-issuer
para usar o Emissor de OIDC. O exemplo a seguir cria um cluster nomeado myAKSCluster com um nó no myResourceGroup:
az aks create -g "${RESOURCE_GROUP}" -n myAKSCluster --enable-oidc-issuer --enable-workload-identity --generate-ssh-keys
Após alguns minutos, o comando será concluído e retornará informações no formato JSON sobre o cluster.
Observação
Quando você cria um cluster do AKS, um segundo grupo de recursos é criado automaticamente para armazenar os recursos do AKS. Para obter mais informações, confira Por que dois grupos de recursos são criados com o AKS?.
Atualizar um cluster de AKS existente
Você pode atualizar um cluster do AKS usando o comando az aks update com os parâmetros --enable-oidc-issuer
e --enable-workload-identity
para usar o emissor do OIDC e habilitar a identidade da carga de trabalho. O seguinte exemplo atualiza um cluster chamado myAKSCluster:
az aks update -g "${RESOURCE_GROUP}" -n myAKSCluster --enable-oidc-issuer --enable-workload-identity
Recuperar a URL do emissor de OIDC
Para obter a URL do Emissor OIDC e salvá-la em uma variável de ambiente, execute o comando a seguir. Substitua o valor padrão para os argumentos -n
, que é o nome do cluster:
export AKS_OIDC_ISSUER="$(az aks show -n myAKSCluster -g "${RESOURCE_GROUP}" --query "oidcIssuerProfile.issuerUrl" -o tsv)"
A variável 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á definido para usar a URL de base https://{region}.oic.prod-aks.azure.com/{tenant_id}/{uuid}
, em que o valor de {region}
corresponde ao local em que o cluster do AKS está implantado. O valor {uuid}
representa a chave OIDC.
Criar uma identidade gerenciada
Use o comando az account set da CLI do Azure para definir uma assinatura específica como a assinatura ativa atual. Em seguida, use o comando az identity create para criar uma identidade gerenciada.
az identity create --name "${USER_ASSIGNED_IDENTITY_NAME}" --resource-group "${RESOURCE_GROUP}" --location "${LOCATION}" --subscription "${SUBSCRIPTION}"
Em seguida, vamos criar uma variável para a ID de identidade gerenciada.
export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -o tsv)"
Criar uma conta de serviço do Kubernetes
Crie uma conta de serviço do Kubernetes e anote-a com a ID do cliente da identidade gerenciada criada na etapa anterior. Use o comando az aks get-credentials e substitua os valores pelo nome do cluster e o nome do grupo de recursos.
az aks get-credentials -n myAKSCluster -g "${RESOURCE_GROUP}"
Copie e cole a entrada de várias linhas a seguir na CLI do Azure.
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}"
EOF
A seguinte saída é semelhante à criação bem-sucedida da identidade:
serviceaccount/workload-identity-sa created
Estabelecer uma credencial de identidade federada
Use o comando az identity federated-credential create para criar a credencial de identidade federada entre a identidade gerenciada, o emissor da conta de serviço e o assunto.
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
Observação
Leva alguns segundos para que a credencial de identidade federada seja propagada após ser inicialmente adicionada. Se uma solicitação de token for feita imediatamente após a adição da credencial de identidade federada, isso poderá levar a uma falha por alguns minutos enquanto o cache for preenchido no diretório com os dados antigos. Para evitar esse problema, você pode adicionar um pequeno atraso depois de adicionar a credencial de identidade federada.
Implantar seu aplicativo
Quando você implanta seus pods de aplicativos, o manifesto deve fazer referência à conta de serviço criada na etapa Criar conta de serviço do Kubernetes. O manifesto a seguir mostra como referenciar à conta, especificamente às propriedades metadata\namespace e spec\serviceAccountName:
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:
name: your-pod
namespace: "${SERVICE_ACCOUNT_NAMESPACE}"
labels:
azure.workload.identity/use: "true" # Required, only the pods with this label can use workload identity
spec:
serviceAccountName: "${SERVICE_ACCOUNT_NAME}"
containers:
- image: <your image>
name: <containerName>
EOF
Importante
Verifique se os pods do aplicativo que usam a identidade da carga de trabalho adicionaram o rótulo azure.workload.identity/use: "true"
à especificação de pod, caso contrário, ocorrerá uma falha nos pods após a reinicialização deles.
Opcional: Conceder permissões para acessar o Azure Key Vault
Essa etapa será necessária se você precisar acessar segredos, chaves e certificados montados no Azure Key Vault de um pod. Execute as etapas a seguir para configurar o acesso com uma identidade gerenciada. Essas etapas pressupõem que você tenha um Azure Key Vault já criado e configurado em sua assinatura. Se você não tiver um, consulte Criar um Azure Key Vault usando a CLI do Azure.
Antes de prosseguir, você precisa das seguintes informações:
- Nome do Key Vault
- Grupo de recursos que mantém o Key Vault
Recupere essas informações usando o comando da CLI do Azure: az keyvault list.
Defina uma política de acesso para que a identidade gerenciada acesse segredos em seu Key Vault executando os seguintes comandos:
export KEYVAULT_RESOURCE_GROUP="myResourceGroup" export KEYVAULT_NAME="myKeyVault" export USER_ASSIGNED_CLIENT_ID="$(az identity show --resource-group "${RESOURCE_GROUP}" --name "${USER_ASSIGNED_IDENTITY_NAME}" --query 'clientId' -o tsv)" az keyvault set-policy --name "${KEYVAULT_NAME}" --secret-permissions get --spn "${USER_ASSIGNED_CLIENT_ID}"
Crie um segredo no Key Vault:
export KEYVAULT_SECRET_NAME="my-secret" az keyvault secret set --vault-name "${KEYVAULT_NAME}" \ --name "${KEYVAULT_SECRET_NAME}" \ --value "Hello\!"
Exporte a URL do Key Vault:
export KEYVAULT_URL="$(az keyvault show -g ${KEYVAULT_RESOURCE_GROUP} -n ${KEYVAULT_NAME} --query properties.vaultUri -o tsv)"
Implante um pod que faça referência à conta de serviço e à URL do Key Vault acima:
cat <<EOF | kubectl apply -f - apiVersion: v1 kind: Pod metadata: name: quick-start 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 EOF
Para verificar se todas as propriedades são injetadas corretamente pelo webhook, use o comando kubectl describe:
kubectl describe pod quick-start | grep "SECRET_NAME:"
Se for bem-sucedido, a saída deverá ser semelhante à seguinte:
SECRET_NAME: ${KEYVAULT_SECRET_NAME}
Para verificar se o POD consegue obter um token e acessar o recurso, utilize o comando kubectl logs:
kubectl logs quick-start
Se for bem-sucedido, a saída deverá ser semelhante à seguinte:
I0114 10:35:09.795900 1 main.go:63] "successfully got secret" secret="Hello\\!"
Desabilitar a identidade da carga de trabalho
Para desabilitar a ID de Carga de Trabalho do Microsoft Entra no cluster do AKS em que ela foi habilitada e configurada, execute o seguinte comando:
az aks update --resource-group "${RESOURCE_GROUP}" --name myAKSCluster --disable-workload-identity
Próximas etapas
Neste artigo, você implantou um cluster do Kubernetes e configurou-o para usar uma identidade de carga de trabalho em preparação para cargas de trabalho de aplicativo a serem autenticadas com essa credencial. Agora você está pronto para implantar seu aplicativo e configurá-lo para usar a identidade da carga de trabalho com a versão mais recente da biblioteca de clientes do Azure Identity. Se você não conseguir reescrever seu aplicativo para usar a versão mais recente da biblioteca de clientes, poderá configurar o pod do aplicativo para autenticar usando a identidade gerenciada com identidade de carga de trabalho como uma solução de migração de curto prazo.