Exercício – Configurar vários nós e permitir o dimensionamento para zero num cluster do AKS

Concluído

O Azure Kubernetes Service permite-lhe criar vários conjuntos de nós para corresponder cargas de trabalho específicas aos nós executados em cada conjunto.

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 o suporte de máquinas virtuais (VMs) baseadas em GPU e só é executado em dias específicos durante a semana. A equipa quer certificar-se de que não são utilizadas VMs quando o serviço não estão a ser executado.

Aqui, irá criar um cluster do Kubernetes gerido do Azure Kubernetes Service (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. Inicie sessão no Azure Cloud Shell com a 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 de exercícios posteriores não estão disponíveis em todas as regiões. Por esta razão, 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 registar as variáveis:

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

    Gorjeta

    Pode utilizar 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 Colar, ou use o atalho de teclado Shift+Insert (⌘+V no macOS).

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

  4. Anote o seu AKS_CLUSTER_NAMEarquivo . 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 denominado 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 terminar 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 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 az aks get-versions comando. A consulta a seguir retorna uma versão do Kubernetes que não é visualizada. Armazene esse valor em uma variável Bash chamada VERSION. Execute o seguinte comando para obter e guardar o número da versão:

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

    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 uma configuração precisa do cluster do Kubernetes. Existem dois parâmetros importantes para configurar o suporte correto no cluster para o dimensionamento e os vários conjuntos de nós:

    Parâmetro e valor Description
    --load-balancer-sku standard O suporte do balanceador de carga predefinido no AKS é basic. O balanceador de carga basic não é suportado quando são utilizados vários conjuntos de nós. Defina o valor como standard.
    --vm-set-type VirtualMachineScaleSets São necessários conjuntos de dimensionamento de máquinas virtuais para utilizar as funcionalidades de dimensionamento no AKS. Este parâmetro ativa o suporte para os conjuntos de dimensionamento.

    Repare que estão configurados dois nós no conjunto de nós predefinido ao utilizar 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 utilizem, pelo menos, --node-count 3 clusters para efeitos de fiabilidade nas respetivas operações. Neste exercício, estamos a utilizar apenas dois nós para considerações sobre o custo.

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

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

    Veja a seguir 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 está mode definido como System e que o name é atribuído automaticamente.

Adicionar um conjunto de nós

  1. O cluster tem um único conjunto de nós. Adicione um segundo pool de nós executando o az aks nodepool add comando. Execute o comando nesta etapa para criar um pool de nós de usuário com três nós e o nome batchprocpl. Tenha em atenção que os nomes dos conjuntos de nós têm de começar com letra minúscula e conter apenas carateres alfanuméricos. Os nomes dos conjuntos de nós estão limitados a 12 carateres para os conjuntos de nós do Linux e seis carateres para os conjuntos 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 conjunto de nós no novo cluster:

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

    Veja a seguir 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
      }
    ]
    

    Repare que mode do novo conjunto de nós está definido como User e que o name é batchprocpl.

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

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

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

Veja a seguir um exemplo do comando:

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

Veja a seguir 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 count de nós está definido como 0 e que o enableAutoScaling valor 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 de conjunto de nós está definida como 0. Pode confirmar os nós disponíveis no cluster ao executar o comando kubectl get nodes.

  1. Execute kubectl para interagir com o servidor de API do cluster. Tem de configurar um contexto de cluster do Kubernetes para permitir que o kubectl se ligue. O contexto contém o endereço do cluster, um utilizador e um espaço de nomes. Execute o comando para configurar o az aks get-credentials contexto do Kubernetes no Cloud Shell.

    Obtenha as credenciais do cluster ao executar este comando:

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

    Veja a seguir um exemplo da saída do comando.

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

    kubectl get nodes
    

    Veja a seguir 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
    

    Repare que, embora o comando az aks nodepool list liste dois conjuntos de nós, existem apenas dois nós disponíveis no cluster e ambos são provenientes de nodepool1.

Uma boa estratégia para otimizar os custos no AKS quando gere as exigências de carga de trabalho diretamente consiste em:

  • Dimensionar manualmente a contagem de nós nos conjuntos de nós.
  • Dimensionamento dispendioso, conjuntos de nós de utilizador baseados em NV definidos como zero.

Vamos analisar uma estratégia em que tem de dimensionar nós, mas não controla diretamente a procura.