Tutorial 2-4: Implementar uma carga de trabalho do Azure Kubernetes Service (AKS) no Azure Enclave

Este tutorial orienta-o na implementação de um cluster privado do Azure Kubernetes Service (AKS) no Azure Enclave. Cria-se um cluster AKS totalmente privado com encriptação gerida pelo cliente, integração de rede e padrões de acesso seguro.

Neste tutorial, aprenderás como:

  • Ativar as funcionalidades necessárias do Azure para o AKS privado
  • Validar os recursos necessários para o AKS
  • Implantar Cluster Privado AKS
  • Configurar a encriptação de chaves gerida pelo cliente
  • Criar endpoints comunitários para conectividade AKS
  • Associe múltiplos grupos de recursos à carga de trabalho do AKS
  • Acede ao cluster AKS e valide

Pré-requisitos

Importante

Este tutorial está alinhado com o comportamento do modelo Private AKS Cluster e requer os recursos criados pela implementação do AVE AKS Enclave no Tutorial 2-2.

Antes de começares

Compreender o AKS no Azure Enclave

O AKS no Azure Enclave fornece:

  • Cluster totalmente privado: servidor API acessível apenas através de endpoint privado
  • Isolamento de rede: Todo o tráfego mantém-se dentro dos limites do enclave
  • Encriptação gerida pelo cliente: Tanto o plano de controlo como o plano de dados encriptados com CMK
  • Limites de carga de trabalho seguros: recursos Kubernetes contidos nas políticas de segurança do enclave

Convenções de nomenclatura de recursos

Este tutorial usa nomes de exemplo. Use a convenção de nomes da sua organização:

  • Enclave: aks-enclave
  • Carga de trabalho: aks-workload
  • Grupo de recursos: rg-aks-cluster
  • Cluster do AKS: aks-prod-01

Ativar as funcionalidades necessárias do Azure

O AKS no Azure Enclave exige que funcionalidades específicas do Azure estejam ativadas na sua subscrição.

Ativar a funcionalidade EncryptionAtHost

Esta funcionalidade permite a encriptação ao nível do anfitrião da máquina virtual para os nós do AKS.

# Register the feature
az feature register --namespace Microsoft.Compute --name EncryptionAtHost

# Check registration status (may take 10-15 minutes)
az feature show --namespace Microsoft.Compute --name EncryptionAtHost

# Once registered, refresh the provider
az provider register --namespace Microsoft.Compute

Ativar Integração de Rede Virtual do API Server (Pré-visualização)

Esta funcionalidade permite que o servidor API do AKS seja integrado diretamente na sua rede virtual.

# Register the feature
az feature register --namespace Microsoft.ContainerService --name EnableAPIServerVnetIntegrationPreview

# Check registration status
az feature show --namespace Microsoft.ContainerService --name EnableAPIServerVnetIntegrationPreview

# Once registered, refresh the provider
az provider register --namespace Microsoft.ContainerService

Importante

Espere que ambas as funcionalidades apareçam "state": "Registered" antes de prosseguir. O registo normalmente demora entre 10 a 15 minutos.

Preparar a chave SSH (Opcional)

Note

A autenticação por chave SSH para acesso aos nós do AKS está a ser descontinuada. Este passo é atualmente obrigatório, mas será opcional em futuras versões de modelos. Se não precisares de acesso direto ao nó, podes saltar esta secção quando o modelo for atualizado.

Gerar par de chaves SSH

# Create .ssh directory if it doesn't exist
$sshDir = "$env:USERPROFILE\.ssh"
if (-not (Test-Path $sshDir)) {
    New-Item -ItemType Directory -Path $sshDir
}

# Generate SSH key pair
ssh-keygen -t rsa -b 4096 -f "$sshDir\aks-nodes" -N '""'

# Display the public key
Get-Content "$sshDir\aks-nodes.pub"

Armazenar a chave SSH no Key Vault

# Read the SSH public key
$sshPublicKey = Get-Content "$env:USERPROFILE\.ssh\aks-nodes.pub" -Raw

# Store in Key Vault as a secret
az keyvault secret set `
    --vault-name "kv-ave-shared-<uniqueid>" `
    --name "aks-ssh-public-key" `
    --value $sshPublicKey

Implantar cluster privado AKS

Agora implemente o cluster AKS com encriptação e monitorização completas.

Utilizar o modelo de catálogo de serviço

  1. Na sua carga de trabalho AKS, selecione + Adicionar um Serviço Azure.
  2. Procure e selecione Cluster AKS Privado.
  3. Configurar a implementação:

Aba Básico

  • Nome do Cluster AKS: aks-prod-01
  • Versão Kubernetes: Selecionar a versão estável mais recente (por exemplo, 1.32)

Monitorização

  • Nome da Área de Trabalho do Log Analytics: Selecione o destino dos registos do seu enclave ou comunidade.

Encryption

  • Nome do Conjunto de Encriptação de Disco: Introduza o nome que usou no Tutorial 2-2.
  • Nome da Chave de Encriptação: Insira o nome da chave do seu cofre de chaves.
  • Key Vault: Selecione o seu key vault com esse nome de chave.

Acesso

  • Nome de Identidade do AKS: Introduza o nome que usou no Tutorial 2-2.
  • Nome do Grupo de Recursos de Identidade AKS: Atualize o nome do grupo de recursos para corresponder à localização da sua identidade.

Rede

  • Nome da Sub-rede AKS: Introduza o nome da sua sub-rede AKS
  • Nome da Sub-rede do Pool de Agentes: Introduza o nome da sub-rede do seu pool de agentes
  • CIDR para Tráfego de Serviço: 172.16.0.0/16
  • Endereço IP do serviço DNS Kubernetes: 172.16.0.10

Configuração da Sub-rede:

  • Sub-rede de nós: Selecione aksSubnet no seu enclave
  • Subrede do Servidor API: Selecione agentSubnet do seu enclave
  • Sub-rede do ponto final privado: Selecione AzureVirtualEnclaveSubnet no seu enclave

Conjunto de nós

Selecione Next para ignorar este separador neste tutorial.

Etiquetas

  • Ambiente: Production
  • Carga de trabalho: AKS
  • Gerido por: Azure Enclave
  1. Selecione Avaliar + Criar.
  2. Revise todas as definições cuidadosamente.
  3. Selecione Criar.

Note

O cluster AKS cria automaticamente um grupo de recursos geridos.

Criar endpoints comunitários para conectividade AKS

O AKS requer conectividade de saída a vários serviços Azure. Crie endpoints comunitários para estes requisitos.

Note

Se criaste endpoints comunitários do AKS no Tutorial 2-1, verifica se estes incluem todos os FQDNs necessários.

Configurar o endpoint da comunidade

  1. Vai à tua comunidade (por exemplo, cmt-fabrikam).

  2. Selecione Endpoints da comunidade>+ Criar ou edite os existentes ce-aks-services.

  3. Certifique-se de que estas regras existem:

    Regra 1: Registo de Contentores da Microsoft

    • Nome: mcr
    • Destino: mcr.microsoft.com,*.data.mcr.microsoft.com
    • Protocolo: HTTPS
    • Porto: 443

    Regra 2: Gestão do AKS

    • Nome: aks-management
    • Destino: *.hcp.<region>.azmk8s.io,<region>.dp.kubernetesconfiguration.azure.com
    • Protocolo: HTTPS
    • Porto: 443

    Regra 3: Azure Management

    • Nome: azure-management
    • Destino: management.azure.com,login.microsoftonline.com
    • Protocolo: HTTPS
    • Porto: 443

    Regra 4: Repositório de Pacotes

    • Nome: packages
    • Destino: packages.microsoft.com,acs-mirror.azureedge.net,azure.archive.ubuntu.com
    • Protocolo: HTTPS
    • Porto: 443

    Regra 5: Azure Monitor (se ativado)

    • Nome: monitoring
    • Destino: *.ods.opinsights.azure.com,*.oms.opinsights.azure.com,dc.services.visualstudio.com
    • Protocolo: HTTPS
    • Porto: 443
  4. Selecione Rever + criar e depois Criar ou Guardar.

Configurar as regras de saída do NSG

Adicione regras de segurança de saída ao seu NSG para permitir tráfego AKS.

  1. Navegue para grupos >nsg-aks-nodes.
  2. Selecione regras de segurança de saída>+ Adicionar.
  3. Adicionar regra para tráfego de saída HTTPS:
    • Fonte: VirtualNetwork
    • Destino: Internet
    • Porto de destino: 443
    • Protocolo: TCP
    • Ação: Allow
    • Prioridade: 1000
    • Nome: Allow_HTTPS_Outbound

Associar grupos de recursos do AKS à carga de trabalho

O AKS cria um grupo de recursos geridos (MRG) para a infraestrutura do cluster. Associe tanto o grupo de recursos de utilizadores como o MRG à sua carga de trabalho.

Utilização do portal Azure

  1. Navegue até ao seu serviço Azure Enclave no portal Azure.
  2. Selecione a sua Comunidade (por exemplo, cmt-fabrikam).
  3. Selecione Enclaves e abra o seu enclave AKS (por exemplo, ve-aks).
  4. Selecione Cargas de Trabalho e abra a sua carga de trabalho do AKS (por exemplo, wl-aks).
  5. Na visão geral da carga de trabalho, selecione Propriedades ou Grupos de Recursos Ligados.
  6. Selecionar + Adicionar grupo de recursos.
  7. Adicionar o grupo de recursos de utilizadores:
    • Selecionar Subscrição: A sua subscrição
    • Selecionar grupo de recursos:rg-aks-cluster
    • Selecione Adicionar
  8. Selecionar + Adicionar grupo de recursos novamente.
  9. Adicione o grupo de recursos geridos do AKS:
    • O nome RG gerido segue o padrão: MC_rg-aks-cluster_aks-prod-01_<region>
    • Selecionar Subscrição: A sua subscrição
    • Grupo de Recursos Selecionados: O grupo de recursos geridos pelo AKS
    • Selecione Adicionar
  10. Verifique se ambos os grupos de recursos aparecem na lista de grupos de recursos ligados da carga de trabalho.

Dica

Para encontrar o nome do grupo de recursos geridos do AKS, navegue até ao seu cluster AKS no portal e verifique a propriedade do grupo de recursos Node na página de Visão Geral.

Aceder ao cluster AKS

Acede ao cluster privado AKS através de uma VM de administração ou Azure Bastion dentro do enclave.

Liga-te à VM de administração

  1. Liga-te à tua VM de administração via Azure Bastion ou RDP.
  2. Certifique-se de que a VM de administração tem a CLI do Azure instalada.
  3. Iniciar sessão no Azure:
az login

Obter credenciais AKS

# Get cluster credentials
az aks get-credentials `
    --resource-group rg-aks-cluster `
    --name aks-prod-01 `
    --admin

# Verify connection
kubectl get nodes

A saída esperada mostra os nós no estado Ready:

NAME                                STATUS   ROLES   AGE   VERSION
aks-systempool-12345678-vmss000000  Ready    agent   5m    v1.29.5
aks-systempool-12345678-vmss000001  Ready    agent   5m    v1.29.5
aks-systempool-12345678-vmss000002  Ready    agent   5m    v1.29.5

Implementar carga de trabalho de teste

Implemente uma aplicação de exemplo para validar o cluster.

Criar namespace

kubectl create namespace test-app

Implementar aplicação de exemplo

# Save as test-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: test-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: mcr.microsoft.com/oss/nginx/nginx:1.25.3
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  namespace: test-app
spec:
  type: LoadBalancer
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
# Apply the deployment
kubectl apply -f test-deployment.yaml

# Check deployment status
kubectl get deployments -n test-app
kubectl get pods -n test-app
kubectl get services -n test-app

Validar a implementação

Realize uma validação abrangente do seu cluster AKS.

Verificar a integridade do cluster

# Check node status
kubectl get nodes -o wide

# Check system pods
kubectl get pods -n kube-system

# Check node conditions
kubectl describe nodes | grep -A 5 Conditions

Verificar a encriptação

# Check if encryption at host is enabled
az aks show --resource-group rg-aks-cluster --name aks-prod-01 --query "securityProfile.enableEncryptionAtHost"

# Check disk encryption set
az aks show --resource-group rg-aks-cluster --name aks-prod-01 --query "diskEncryptionSetId"

Valide a conectividade de rede

# Test DNS resolution
kubectl run -it --rm debug --image=mcr.microsoft.com/dotnet/runtime-deps:6.0 --restart=Never -- nslookup kubernetes.default

# Test internet connectivity through community endpoints
kubectl run -it --rm debug --image=curlimages/curl --restart=Never -- curl -I https://mcr.microsoft.com

# Check service connectivity
kubectl get services -A

Verifique a monitorização e os registos

# Check if Container Insights is enabled
az aks show --resource-group rg-aks-cluster --name aks-prod-01 --query "addonProfiles.omsagent.enabled"

# Query logs in Log Analytics
az monitor log-analytics query `
    --workspace <workspace-id> `
    --analytics-query "ContainerLog | where TimeGenerated > ago(1h) | limit 10"

Verificar a conformidade do Azure Policy

# Check Azure Policy add-on status
kubectl get pods -n kube-system | grep azure-policy

# View policy violations (if any)
kubectl get constrainttemplates
kubectl get constraints

Configurar o acesso kubectl para outros utilizadores

Conceda a outros utilizadores acesso ao cluster AKS.

Utilização do Azure RBAC

# Assign Azure Kubernetes Service Cluster User Role
az role assignment create `
    --assignee user@contoso.com `
    --role "Azure Kubernetes Service Cluster User Role" `
    --scope "/subscriptions/<subscription-id>/resourceGroups/rg-aks-cluster/providers/Microsoft.ContainerService/managedClusters/aks-prod-01"

# For admin access
az role assignment create `
    --assignee user@contoso.com `
    --role "Azure Kubernetes Service Cluster Admin Role" `
    --scope "/subscriptions/<subscription-id>/resourceGroups/rg-aks-cluster/providers/Microsoft.ContainerService/managedClusters/aks-prod-01"

Utilização do Kubernetes RBAC

# Create role binding for namespace access
kubectl create rolebinding user-viewer `
    --clusterrole=view `
    --user=user@contoso.com `
    --namespace=test-app

Solução de problemas comuns

Falhas na criação de clusters

Sintoma: Falha na implementação do cluster AKS

Soluções:

  • Verificar se as feature flags estão registadas: EncryptionAtHost, EnableAPIServerVnetIntegrationPreview
  • Verifique se os tamanhos das sub-redes são adequados ao número de nós e à densidade de pods
  • Verificar que o conjunto de encriptação do disco e a identidade gerida têm as permissões adequadas
  • Consulte o registo de atividade para mensagens de erro específicas

Nós não estão prontos

Sintoma: Os nós apresentam o estado NotReady

Soluções:

  • Verifique se a subrede do nó tem conectividade de saída para os pontos finais necessários
  • Verifique se os endpoints da comunidade incluem todos os FQDNs obrigatórios do AKS
  • Verifique se as regras NSG permitem tráfego de saída na porta 443
  • Reveja os registos do nó: kubectl describe node <node-name>

Os pods não conseguem obter imagens

Sintoma: Pods bloqueados em ImagePullBackOff

Soluções:

  • Verifique se o endpoint da comunidade inclui mcr.microsoft.com e *.data.mcr.microsoft.com
  • Check NSG permite HTTPS de saída (porta 443)
  • Certifique-se de que a resolução DNS funciona: nslookup mcr.microsoft.com no pod
  • Reveja os segredos para obter imagens se estiver a usar registos privados

Não consigo ligar-me ao servidor API

Sintoma: kubectl os comandos falham devido a tempo limite de ligação

Soluções:

  • Verifica se estás numa VM de administração ou recurso com conectividade ao enclave
  • Verifique se a zona DNS privada está ligada à rede virtual
  • Verificar configuração da sub-rede do servidor API
  • Teste a resolução de DNS: nslookup <cluster-fqdn>

Monitorização não funciona

Sintoma: Sem logs ou métricas no Azure Monitor

Soluções:

  • O addon Verify Container Insights está ativado
  • Confirmar que os endpoints da comunidade incluem monitorização de FQDNs
  • O espaço de trabalho do Verify Log Analytics está acessível a partir do cluster
  • Verifique se os pods omsagent estão em execução: kubectl get pods -n kube-system | grep omsagent

Limpeza de recursos

Para evitar cobranças contínuas, apague os recursos quando já não forem necessários.

Excluir cluster AKS

# Delete AKS cluster (also deletes managed resource group)
az aks delete --resource-group rg-aks-cluster --name aks-prod-01 --yes --no-wait

# Delete user resource group
az group delete --name rg-aks-cluster --yes --no-wait

# Delete infrastructure resource group
az group delete --name rg-aks-infrastructure --yes --no-wait

Warning

Eliminar o cluster AKS remove permanentemente todas as cargas de trabalho e dados. Certifica-te de que tens backups se necessário.

Passos seguintes

Completaste a série de tutoriais para implementar cargas de trabalho do Azure Virtual Desktop e AKS no Azure Enclave!