Compartilhar via


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

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

Antes de começar

Modelos de Azure Resource Manager e zonas de disponibilidade

Tenha os seguintes detalhes em mente ao criar um cluster do 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 o cluster não é implantado em uma zona de disponibilidade.
  • Se você não incluir a propriedade "availabilityZones": no modelo, o cluster não será implantado em uma zona de disponibilidade.
  • Você não pode atualizar as configurações para zonas de disponibilidade em um cluster existente, pois o comportamento é diferente quando você atualiza um cluster do AKS com modelos do Azure Resource Manager. Se você definir explicitamente um valor nulo em seu modelo para zonas de disponibilidade e atualizar o cluster, isso não atualizará o 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 do AKS existente e falhará.

Criar um cluster do AKS entre zonas de disponibilidade

Quando você cria um cluster usando o comando az aks create, o parâmetro --zones especifica as zonas de disponibilidade nas quais implantar nós do 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. São distribuídos automaticamente em todas as zonas de disponibilidade (se houver) 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 do AKS com um total de três nós. Um nó de agente na zona 1, um em 2 e um em 3.

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

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

    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
    

    Leva alguns minutos para o cluster do AKS ser criado.

    Ao decidir a qual zona um novo nó deve pertencer, um pool de nós do AKS especificado usa um melhor balanceamento de zona de esforço oferecido pelos Conjuntos de Dimensionamento de Máquinas Virtuais do Azure subjacentes. O pool de nós do AKS é “balanceado” quando cada zona tem o mesmo número de VMs ou +- uma VM em todas as outras zonas para o conjunto de dimensionamento.

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

Quando o cluster estiver pronto, liste a zona de disponibilidade em que os nós de agente no conjunto de dimensionamento estão.

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

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

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

    A saída de exemplo 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 nós a um pool de agentes, a plataforma do Azure distribui automaticamente as VMs subjacentes entre as zonas de disponibilidade especificadas.

Com as versões do Kubernetes 1.17.0 e posteriores, o AKS usa o rótulo topology.kubernetes.io/zone e o failure-domain.beta.kubernetes.io/zone preterido. Você pode obter o mesmo resultado executando o comando kubectl describe nodes 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 é semelhante à saída com mais detalhes:

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 de pods entre zonas

Conforme documentado em Well-Known Labels, Annotations and Taints, o Kubernetes usa o rótulo de topology.kubernetes.io/zone para distribuir automaticamente os pods em um serviço ou controlador de replicação entre as 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 o cluster do AKS de 3 para 5 nós usando o comando az aks scale com o --node-count definido 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 de pod entre as zonas usando o seguinte comando kubectl describe:

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

    A saída de exemplo 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 um aplicativo NGINX com três réplicas usando os seguintes comandos kubectl create deployment e kubectl scale:

    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 de pod entre as zonas usando o seguinte comando kubectl describe:

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

    A saída de exemplo 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á em execução no nó 0, localizado na zona de disponibilidade eastus2-1. O segundo pod está em execução no nó 2, que corresponde a eastus2-3 e o terceiro no nó 4, em eastus2-2. Sem nenhuma configuração adicional, o Kubernetes distribui os pods corretamente entre todas as três zonas de disponibilidade.

Próximas etapas

Esse artigo descreveu como criar um cluster do AKS usando zonas de disponibilidade. Para mais considerações sobre clusters altamente disponíveis, confira Melhores práticas para a continuidade dos negócios e recuperação de desastres no AKS.