Exercício - Configure vários nós e habilite a escala para zero em um cluster AKS

Concluído

O Serviço Kubernetes do Azure permite criar pools de nós diferentes para corresponder cargas de trabalho específicas aos nós em execução em cada pool de nós.

Lembre-se do exemplo de rastreamento de drones de que sua equipe desenvolveu um novo serviço de modelagem preditiva que processa informações de trajetória de voo em condições climáticas extremas e cria rotas de voo ideais. Este serviço requer suporte a máquina virtual (VM) baseada em GPU e é executado apenas em dias específicos durante a semana. A equipa quer garantir que não sejam usadas VMS quando o serviço não estiver a ser executado.

Aqui, você criará um cluster Kubernetes gerenciado pelo Serviço Kubernetes do Azure (AKS). Em seguida, você configurará o cluster para oferecer 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 de usuários com uma contagem dinâmica de nós. Finalmente, você dimensionará a contagem de nós para zero para reduzir o custo dos nós usados em seu cluster AKS.

Criar um novo grupo de recursos

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

  2. Você reutilizará os valores criados aqui ao longo de 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. Os recursos dos exercícios posteriores não estão disponíveis em todas as regiões. Por esta razão, recomendamos que utilize eastus como a sua região. Se você optar por usar um valor diferente, altere o valor de REGION_NAME.

    Execute os seguintes comandos para registrar suas variáveis:

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

    Dica

    Você pode usar o botão Copiar para copiar comandos para a área de transferência. Para colar, clique com o botão direito do mouse em uma nova linha no terminal do Cloud Shell e selecione Colarou 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 o seu AKS_CLUSTER_NAME. Ao longo dos exercícios, você usará esse valor posteriormente para limpeza e definições de configuração para seu cluster.

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

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

Criar o cluster AKS

Com o grupo de recursos criado, você pode criar clusters AKS dentro do grupo. O primeiro passo é obter a versão do Kubernetes na 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 do Kubernetes que não é visualizada. Armazene esse valor em uma variável Bash chamada VERSION. Para recuperar e armazenar o número da 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 AKS. O cluster é executado com dois nós no pool de nós do sistema. Este 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 permitem a configuração precisa do seu cluster Kubernetes. Há dois parâmetros importantes na configuração do suporte correto em seu cluster para dimensionamento e pools de vários nós:

    Parâmetro e valor Descrição
    --load-balancer-sku standard O suporte ao balanceador de carga padrão no AKS é basic. O balanceador de carga basic não é suportado quando o utilizador utiliza múltiplos conjuntos de nós. Defina o valor como standard.
    --vm-set-type VirtualMachineScaleSets Para usar os recursos de escala no AKS, são necessários conjuntos de dimensionamento de máquina virtual. Este parâmetro permite o suporte para conjuntos de escala.

    Observe que dois nós são configurados no pool de nós padrão usando o parâmetro --node-count 2. Lembre-se da descrição anterior de que os serviços essenciais do sistema são executados neste pool de nós do sistema. É importante que os clusters de produção usem pelo menos --node-count 3 para garantir a confiabilidade na operação. Estamos usando apenas dois nós aqui para considerações de custo neste exercício.

  3. Execute o comando az aks nodepool list para listar os pools de nós no seu 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
      }
    ]
    

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

Adicionar um pool de nós

  1. O seu cluster tem um único pool de nós. Adicione um segundo pool de nós executando o comando az aks nodepool add. Execute o comando nesta etapa para criar um pool de nós de usuário com três nós e o nome batchprocpl. Lembre-se que os nomes do conjunto de nós devem começar com uma letra minúscula e conter apenas caracteres alfanuméricos. Os nomes de pool de nós são limitados a 12 caracteres para pools de nós Linux e seis caracteres para pools de nós do 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 está definido como User e que o name é batchprocpl.

Ajustar a contagem de nós do grupo de nós para zero

Execute o comando az aks nodepool scale para dimensionar 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, porque a criação de nós 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 é definida como 0. Você pode confirmar 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 conectem. 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 seus 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 demandas de carga de trabalho diretamente, uma boa estratégia é:

  • Escalone manualmente a contagem de nós em grupos de nós.
  • Reduza a zero os pools de nós de utilizadores caros e baseados em NV.

Vejamos uma estratégia em que você precisa dimensionar nós, mas não controla a demanda diretamente.