Exercício – Configurar vários nós e habilitar o dimensionamento para zero em um cluster do AKS

Concluído

O Serviço de Kubernetes do Azure permite que você crie diferentes pools de nós que correspondam a cargas de trabalho específicas para os nós em execução em cada pool de nós.

Lembre-se, do exemplo de rastreamento de drones, que sua equipe desenvolveu um novo serviço de modelagem preditiva que processa informações de caminho de voo em condições climáticas extremas e cria rotas de voo ideais. Esse serviço exige compatibilidade com VMs (máquinas virtuais) baseadas em GPU e só é executado em dias específicos durante a semana. A equipe deseja garantir que nenhuma VM seja usada quando o serviço não é executado.

Aqui, você criará um cluster do Kubernetes gerenciado pelo AKS (Serviço de Kubernetes do Azure). Em seguida, você configurará o cluster para dar suporte a vários pools de nós e permitirá que os clusters dimensionem os nós nos pools de nós. Em seguida, você adicionará um segundo pool de nós para dar suporte a cargas de trabalho do usuário com uma contagem dinâmica de nós. Por fim, você colocará em escala a contagem de nós para zero para reduzir o custo dos nós usados no cluster do AKS.

Criar um grupo de recursos

  1. Entre no Azure Cloud Shell usando a sua conta do Azure. Selecione a versão Bash do Cloud Shell.

  2. Você reutilizará os valores criados aqui em todos os exercícios deste módulo. Salve a saída para uso futuro.

  3. Escolha uma região para hospedar seu grupo de recursos. Recursos de exercícios posteriores não estão disponíveis em todas as regiões. Por esse motivo, recomendamos que você use eastus como sua região. Se você optar por usar um valor diferente, altere o valor de REGION_NAME.

    Execute os seguintes comandos para registrar as variáveis:

    REGION_NAME=eastus
    RESOURCE_GROUP=rg-akscostsaving
    AKS_CLUSTER_NAME=akscostsaving-$RANDOM
    

    Dica

    Use o botão Copiar para copiar os comandos para a área de transferência. Para colar o conteúdo, clique com o botão direito do mouse em uma nova linha no terminal do Cloud Shell e selecione Colar ou use o atalho de teclado Shift + Insert (⌘ + V no macOS).

    Você pode verificar cada valor executando o comando echo; por exemplo, echo $REGION_NAME.

  4. Anote seu AKS_CLUSTER_NAME. Ao longo dos exercícios, você usará esse valor mais tarde para limpar e definir as configurações do cluster.

    echo $AKS_CLUSTER_NAME
    
  5. Crie um grupo de recursos chamado rg-akscostsaving. Você implantará todos os recursos criados nesses exercícios neste grupo de recursos. Um só grupo de recursos facilitará a limpeza dos recursos depois que você concluir o módulo.

    az group create \
        --name $RESOURCE_GROUP \
        --location $REGION_NAME
    

Criar o cluster do AKS

Com o grupo de recursos criado, você pode criar clusters do AKS dentro do grupo. Sua primeira etapa é obter a versão do Kubernetes em sua região selecionada. Esta versão está definida para configurar o cluster.

  1. Para obter a versão do Kubernetes, execute o comando az aks get-versions. A consulta a seguir retorna uma versão não prévia do Kubernetes. Armazene esse valor em uma variável Bash chamada VERSION. Para recuperar e armazenar o número de versão, execute o seguinte comando:

    VERSION=$(az aks get-versions \
        --location $REGION_NAME \
        --query "values[?isPreview==null].version | [-1]" \
        --output tsv)
    echo $VERSION
    
  2. Execute o comando az aks create para criar o cluster do AKS. O cluster é executado com dois nós no pool de nós do sistema. Esse comando pode levar alguns minutos para ser concluído.

    az aks create \
        --resource-group $RESOURCE_GROUP \
        --name $AKS_CLUSTER_NAME \
        --location $REGION_NAME \
        --kubernetes-version $VERSION \
        --node-count 2 \
        --load-balancer-sku standard \
        --vm-set-type VirtualMachineScaleSets \
        --generate-ssh-keys
    

    O comando az aks create tem vários parâmetros que habilitam a configuração precisa do cluster do Kubernetes. Há dois parâmetros importantes na configuração do suporte correto no cluster para o dimensionamento e os vários pools de nós:

    Parâmetro e valor Descrição
    --load-balancer-sku standard A compatibilidade padrão do balanceador de carga no AKS é basic. O balanceador de carga basic não é compatível ao usar vários pools de nós. Defina o valor como standard.
    --vm-set-type VirtualMachineScaleSets São necessários conjuntos de dimensionamento de máquinas virtuais para usar os recursos de dimensionamento no AKS. Esse parâmetro habilita a compatibilidade com os conjuntos de dimensionamento.

    Observe que dois nós são configurados no pool de nós padrão usando o parâmetro --node-count 2. Lembre-se que, conforme discutido anteriormente, serviços essenciais do sistema são executados nesse pool de nós do sistema. É importante que os clusters de produção usem pelo menos --node-count 3 para ter confiabilidade na operação do cluster. Estamos usando apenas dois nós aqui para obter as considerações sobre custos neste exercício.

  3. Execute o comando az aks nodepool list para listar os pools de nós no novo cluster:

    az aks nodepool list --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER_NAME
    

    Aqui está um exemplo da saída do comando:

    [
      {
        "agentPoolType": "VirtualMachineScaleSets",
        "availabilityZones": null,
        "count": 2,
        "enableAutoScaling": null,
        "enableNodePublicIp": false,
        "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/nodepool1",
        "mode": "System",
        "name": "nodepool1",
        ...
        "type": "Microsoft.ContainerService/managedClusters/agentPools",
        "upgradeSettings": null,
        "vmSize": "Standard_DS2_v2",
        "vnetSubnetId": null
      }
    ]
    

    Observe que o pool de nós mode está definido como System e que name é atribuído automaticamente.

Adicionar um pool de nós

  1. O cluster tem um só pool de nós. Adicione um segundo pool de nós executando o comando az aks nodepool add. Execute o comando dessa etapa para criar um pool de nós do usuário com três nós e o nome batchprocpl. Tenha em mente que os nomes de pool de nós devem começar com letra minúscula e conter apenas caracteres alfanuméricos. Os nomes dos pools de nós são limitados a 12 caracteres no Linux e a seis caracteres no Windows.

    Execute o seguinte comando:

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $AKS_CLUSTER_NAME \
        --name batchprocpl \
        --node-count 2
    
  2. Execute o comando az aks nodepool list para listar o novo pool de nós no novo cluster:

    az aks nodepool list --resource-group $RESOURCE_GROUP --cluster-name $AKS_CLUSTER_NAME
    

    Aqui está um exemplo da saída do comando:

    [
      {
        "agentPoolType": "VirtualMachineScaleSets",
        "availabilityZones": null,
        "count": 2,
        "enableAutoScaling": null,
        "enableNodePublicIp": false,
        "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl",
        "mode": "User",
        "name": "batchprocpl",
        ...
        "type": "Microsoft.ContainerService/managedClusters/agentPools",
        "upgradeSettings": {
          "maxSurge": null
        },
        "vmSize": "Standard_DS2_v2",
        "vnetSubnetId": null
      },
      {
        "agentPoolType": "VirtualMachineScaleSets",
        "availabilityZones": null,
        "count": 2,
        "enableAutoScaling": null,
        "enableNodePublicIp": false,
        "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/nodepool1",
        "mode": "System",
        "name": "nodepool1",
        ...
        "type": "Microsoft.ContainerService/managedClusters/agentPools",
        "upgradeSettings": null,
        "vmSize": "Standard_DS2_v2",
        "vnetSubnetId": null
      }
    ]
    

    Observe que o mode do novo pool de nós é definido como User e que o name é batchprocpl.

Dimensionar a contagem de nós do pool de nós para zero

Execute o comando az aks nodepool scale para dimensionar os nós em um pool de nós manualmente.

Execute o comando az aks nodepool scale e use o parâmetro --node-count para definir o valor da contagem de nós como 0.

Aqui está um exemplo do comando:

az aks nodepool scale \
    --resource-group $RESOURCE_GROUP \
    --cluster-name $AKS_CLUSTER_NAME \
    --name batchprocpl \
    --node-count 0

Aqui está um exemplo da saída do comando:

{
  "agentPoolType": "VirtualMachineScaleSets",
  "availabilityZones": null,
  "count": 0,
  "enableAutoScaling": null,
  "enableNodePublicIp": false,
  "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl",
  "maxCount": null,
  "maxPods": 110,
  "minCount": null,
  "mode": "User",
  "name": "batchprocpl",
  "nodeImageVersion": "AKSUbuntu-1604-2020.06.10",
  "nodeLabels": null,
  "nodeTaints": null,
  "orchestratorVersion": "1.17.9",
  "osDiskSizeGb": 128,
  "osType": "Linux",
  "provisioningState": "Succeeded",
  "proximityPlacementGroupId": null,
  "resourceGroup": "rg-akscostsaving",
  "scaleSetEvictionPolicy": null,
  "scaleSetPriority": null,
  "spotMaxPrice": null,
  "tags": null,
  "type": "Microsoft.ContainerService/managedClusters/agentPools",
  "upgradeSettings": {
    "maxSurge": null
  },
  "vmSize": "Standard_DS2_v2",
  "vnetSubnetId": null
}

Observe que o valor do parâmetro do pool de nós count está definido como 0 e que o valor enableAutoScaling está definido como null. Para agendar cargas de trabalho, você precisa aumentar a contagem de nós para esse pool de nós manualmente, pois a criação do nó não acontece automaticamente por padrão.

Configurar o contexto do Kubernetes

Na saída do comando anterior, a contagem do pool de nós está definida como 0. Confirme os nós disponíveis no cluster executando o comando kubectl get nodes.

  1. Execute kubectl para interagir com o servidor de API do cluster. Você precisa configurar um contexto de cluster do Kubernetes para permitir que kubectl se conecte. O contexto contém o endereço do cluster, um usuário e um namespace. Execute o comando az aks get-credentials para configurar o contexto do Kubernetes no Cloud Shell.

    Recupere as credenciais do cluster executando este comando:

    az aks get-credentials \
        --resource-group $RESOURCE_GROUP \
        --name $AKS_CLUSTER_NAME
    

    Aqui está um exemplo da saída do comando.

    Merged "akscostsaving-17835" as current context in /home/user/.kube/config
    
  2. Liste os nós nos pools de nós.

    kubectl get nodes
    

    Aqui está um exemplo da saída do comando:

    NAME                                STATUS   ROLES   AGE   VERSION
    aks-nodepool1-37990379-vmss000000   Ready    agent   32m   v1.17.9
    aks-nodepool1-37990379-vmss000001   Ready    agent   32m   v1.17.9
    

    Observe que, embora o comando az aks nodepool list liste dois pools de nós, há apenas dois nós disponíveis no cluster e ambos são de nodepool1.

Para otimizar os custos no AKS quando você gerencia as demandas de carga de trabalho diretamente, uma boa estratégia é:

  • Dimensionar manualmente a contagem de nós nos pools de nós.
  • Dimensionar os pools de nós do usuário caros e baseados em NV para zero.

Vamos examinar uma estratégia em que você precisa escalar os nós, mas não controlar a demanda diretamente.