Criar um cluster do Serviço Kubernetes do Azure (AKS) que usa zonas de disponibilidade

Este artigo mostra como criar um cluster AKS e distribuir os componentes do nó pelas zonas de disponibilidade.

Antes de começar

Modelos e zonas de disponibilidade do Azure Resource Manager

Lembre-se dos seguintes detalhes ao criar um cluster AKS com zonas de disponibilidade usando um modelo do Azure Resource Manager:

  • Se você definir explicitamente um valor nulo em um modelo, por exemplo, "availabilityZones": null, o modelo tratará a propriedade como se ela não existisse. Isso significa que seu cluster não é implantado em uma zona de disponibilidade.
  • Se você não incluir a "availabilityZones": propriedade no modelo, o cluster não será implantado em uma zona de disponibilidade.
  • Não é possível atualizar as configurações de zonas de disponibilidade em um cluster existente, pois o comportamento é diferente quando você atualiza um cluster AKS com modelos do Azure Resource Manager. Se você definir explicitamente um valor nulo em seu modelo para zonas de disponibilidade e atualizar seu cluster, ele não atualizará seu cluster para zonas de disponibilidade. No entanto, se você omitir a propriedade de zonas de disponibilidade com sintaxe como "availabilityZones": [], a implantação tentará desabilitar as zonas de disponibilidade no cluster AKS existente e falhará.

Criar um cluster AKS entre zonas de disponibilidade

Quando você cria um cluster usando o az aks create comando, o parâmetro especifica as --zones zonas de disponibilidade nas quais implantar nós de agente. As zonas de disponibilidade nas quais os componentes do plano de controle gerenciado são implantados não são controladas por esse parâmetro. Eles são distribuídos automaticamente por todas as zonas de disponibilidade (se presentes) na região durante a implantação do cluster.

Os comandos de exemplo a seguir mostram como criar um grupo de recursos e um cluster AKS com um total de três nós. Um nó de agente na zona 1, um em 2 e, em seguida, um em 3.

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

    az group create --name $RESOURCE_GROUP --location $LOCATION
    
  2. Crie um cluster AKS usando o az aks create comando com o --zones parâmetro.

    az aks create \
        --resource-group $RESOURCE_GROUP \
        --name $CLUSTER_NAME \
        --generate-ssh-keys \
        --vm-set-type VirtualMachineScaleSets \
        --load-balancer-sku standard \
        --node-count 3 \
        --zones 1 2 3
    

    A criação do cluster do AKS demora alguns minutos.

    Ao decidir a que zona um novo nó deve pertencer, um pool de nós AKS especificado usa um balanceamento de zona de melhor esforço oferecido pelos Conjuntos de Escala de Máquina Virtual do Azure subjacentes. O pool de nós AKS é "equilibrado" quando cada zona tem o mesmo número de VMs ou +- uma VM em todas as outras zonas para o conjunto de escala.

Verificar a distribuição de nós entre zonas

Quando o cluster estiver pronto, liste em qual zona de disponibilidade os nós do agente no conjunto de escala estão.

  1. Obtenha as credenciais do cluster AKS usando o az aks get-credentials comando:

    az aks get-credentials --resource-group $RESOURCE_GROUP --name $CLUSTER_NAME
    
  2. Liste os nós no cluster usando o kubectl describe comando e filtre o topology.kubernetes.io/zone valor.

    kubectl describe nodes | grep -e "Name:" -e "topology.kubernetes.io/zone"
    

    O exemplo de saída a seguir mostra os três nós distribuídos pela região especificada e zonas de disponibilidade, como eastus2-1 para a primeira zona de disponibilidade e eastus2-2 para a segunda zona de disponibilidade:

    Name:       aks-nodepool1-28993262-vmss000000
                topology.kubernetes.io/zone=eastus2-1
    Name:       aks-nodepool1-28993262-vmss000001
                topology.kubernetes.io/zone=eastus2-2
    Name:       aks-nodepool1-28993262-vmss000002
                topology.kubernetes.io/zone=eastus2-3
    

À medida que você adiciona mais nós a um pool de agentes, a plataforma Azure distribui automaticamente as VMs subjacentes pelas zonas de disponibilidade especificadas.

Com as versões 1.17.0 e posteriores do Kubernetes, o AKS usa o topology.kubernetes.io/zone rótulo e o preterido failure-domain.beta.kubernetes.io/zone. Você pode obter o mesmo resultado executando o kubectl describe nodes comando no exemplo anterior usando o seguinte comando:

kubectl get nodes -o custom-columns=NAME:'{.metadata.name}',REGION:'{.metadata.labels.topology\.kubernetes\.io/region}',ZONE:'{metadata.labels.topology\.kubernetes\.io/zone}'

O exemplo a seguir se assemelha à saída com detalhes mais detalhados:

NAME                                REGION   ZONE
aks-nodepool1-34917322-vmss000000   eastus   eastus-1
aks-nodepool1-34917322-vmss000001   eastus   eastus-2
aks-nodepool1-34917322-vmss000002   eastus   eastus-3

Verificar a distribuição do pod entre zonas

Conforme documentado em Rótulos, anotações e manchas conhecidos, o Kubernetes usa o topology.kubernetes.io/zone rótulo para distribuir automaticamente pods em um controlador ou serviço de replicação nas diferentes zonas disponíveis. Neste exemplo, você testa o rótulo e dimensiona seu cluster de 3 para 5 nós para verificar se o pod se espalha corretamente.

  1. Dimensione seu cluster AKS de 3 para 5 nós usando o az aks scale comando com o --node-count conjunto como 5.

    az aks scale \
        --resource-group $RESOURCE_GROUP \
        --name $CLUSTER_NAME \
        --node-count 5
    
  2. Quando a operação de escala for concluída, verifique a distribuição do pod nas zonas usando o seguinte kubectl describe comando:

    kubectl describe nodes | grep -e "Name:" -e "topology.kubernetes.io/zone"
    

    O exemplo de saída a seguir mostra os cinco nós distribuídos pela região especificada e zonas de disponibilidade, como eastus2-1 para a primeira zona de disponibilidade e eastus2-2 para a segunda zona de disponibilidade:

    Name:       aks-nodepool1-28993262-vmss000000
                topology.kubernetes.io/zone=eastus2-1
    Name:       aks-nodepool1-28993262-vmss000001
                topology.kubernetes.io/zone=eastus2-2
    Name:       aks-nodepool1-28993262-vmss000002
                topology.kubernetes.io/zone=eastus2-3
    Name:       aks-nodepool1-28993262-vmss000003
                topology.kubernetes.io/zone=eastus2-1
    Name:       aks-nodepool1-28993262-vmss000004
                topology.kubernetes.io/zone=eastus2-2
    
  3. Implante kubectl scale um aplicativo NGINX com três réplicas usando os seguintes kubectl create deployment comandos:

    kubectl create deployment nginx --image=mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine
    kubectl scale deployment nginx --replicas=3
    
  4. Verifique a distribuição do pod nas zonas usando o seguinte kubectl describe comando:

    kubectl describe pod | grep -e "^Name:" -e "^Node:"
    

    O exemplo de saída a seguir mostra os três pods distribuídos pela região especificada e zonas de disponibilidade, como eastus2-1 para a primeira zona de disponibilidade e eastus2-2 para a segunda zona de disponibilidade:

    Name:         nginx-6db489d4b7-ktdwg
    Node:         aks-nodepool1-28993262-vmss000000/10.240.0.4
    Name:         nginx-6db489d4b7-v7zvj
    Node:         aks-nodepool1-28993262-vmss000002/10.240.0.6
    Name:         nginx-6db489d4b7-xz6wj
    Node:         aks-nodepool1-28993262-vmss000004/10.240.0.8
    

    Como você pode ver na saída anterior, o primeiro pod está sendo executado no nó 0 localizado na zona eastus2-1de disponibilidade. O segundo pod está sendo executado no nó 2, correspondente a eastus2-3, e o terceiro no nó 4, em eastus2-2. Sem qualquer configuração extra, o Kubernetes distribui os pods corretamente pelas três zonas de disponibilidade.

Próximos passos

Este artigo descreveu como criar um cluster AKS usando zonas de disponibilidade. Para obter mais considerações sobre clusters altamente disponíveis, consulte Práticas recomendadas para continuidade de negócios e recuperação de desastres no AKS.