Exercício – Configurar pools de nós spot com o dimensionador automático de cluster em um cluster do AKS

Concluído

Os pools de nós de usuário spot permitem que você acesse a capacidade de computação não utilizada do Azure a preços mais baixos, com suporte para cenários de computação de alto desempenho.

No exercício anterior, você criou um pool de nós de usuário padrão, usou o dimensionador automático de cluster para gerenciar a criação de nós e dimensionou manualmente a contagem de nós.

A próxima etapa é adicionar um pool de nós de usuário spot com dimensionamento automático para reduzir os custos operacionais do cluster. O uso de cluster varia de acordo com os recursos necessários e não é previsível, portanto, você configura regras para capturar os picos e as quedas. A carga de trabalho é implantada com afinidade de nó habilitada para que o pod seja agendado em nós no pool de nós spot.

Criar um pool de nós spot

Você precisa criar um pool de nós separado que dê suporte ao serviço de processamento em lote. Esse pool de nós é um pool de nós spot que usa a política de remoção Excluir e um preço máximo de spot igual a -1.

  1. Execute o mesmo comando az aks nodepool add do exercício anterior para adicionar um novo pool de nós spot ao cluster. Você precisa alterar o nome do pool de nós e adicionar mais alguns parâmetros para identificar esse pool de nós como um pool de nós spot.

    Insira os seguintes valores para definir os parâmetros do pool de nós:

    • Nome: batchprocpl2
    • Prioridade: Spot
    • Política de remoção: Delete
    • Preço máximo de spot: -1

    Execute o seguinte comando para criar o pool de nós spot:

    az aks nodepool add \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $AKS_CLUSTER_NAME \
        --name batchprocpl2 \
        --enable-cluster-autoscaler \
        --max-count 3 \
        --min-count 1 \
        --priority Spot \
        --eviction-policy Delete \
        --spot-max-price -1 \
        --node-vm-size Standard_DS2_v2 \
        --no-wait
    

    Tenha em mente que essa solicitação pode falhar devido a restrições de capacidade na localização selecionada.

  2. Execute o comando az aks nodepool show para mostrar os detalhes do novo pool de nós spot para o serviço de processamento em lotes:

    az aks nodepool show \
        --resource-group $RESOURCE_GROUP \
        --cluster-name $AKS_CLUSTER_NAME \
        --name batchprocpl2
    

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

    {
    "agentPoolType": "VirtualMachineScaleSets",
    "availabilityZones": null,
    "count": 3,
    "enableAutoScaling": true,
    "enableNodePublicIp": false,
    "id": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourcegroups/rg-akscostsaving/providers/Microsoft.ContainerService/managedClusters/akscostsaving-17835/agentPools/batchprocpl2",
    "maxCount": 3,
    "maxPods": 110,
    "minCount": 1,
    "mode": "User",
    "name": "batchprocpl2",
    "nodeImageVersion": "AKSUbuntu-1604-2020.06.10",
    "nodeLabels": {
        "kubernetes.azure.com/scalesetpriority": "spot"
    },
    "nodeTaints": [
        "kubernetes.azure.com/scalesetpriority=spot:NoSchedule"
    ],
    "orchestratorVersion": "1.17.9",
    "osDiskSizeGb": 128,
    "osType": "Linux",
    "provisioningState": "Creating",
    "proximityPlacementGroupId": null,
    "resourceGroup": "akscostsavinggrp",
    "scaleSetEvictionPolicy": "Delete",
    "scaleSetPriority": "Spot",
    "spotMaxPrice": -1.0,
    "tags": null,
    "type": "Microsoft.ContainerService/managedClusters/agentPools",
    "upgradeSettings": {
        "maxSurge": null
    },
    "vmSize": "Standard_DS2_v2",
    "vnetSubnetId": null
    }
    

    Alguns valores desse resultado são distintamente diferentes do que você viu nos pools de nós anteriores. Vamos examinar esses itens:

    • O valor da propriedade enableAutoScaling está definido como true.

    • Os valores maxCount e minCount estão definidos.

    • A propriedade scaleSetEvictionPolicy está definida como Delete.

    • A propriedade scaleSetPriority está definida como Spot.

    • A propriedade spotMaxPrice está definida como -1.

    • nodeLabels e nodeTaints são aplicados a este pool de nós. Use esses valores para agendar cargas de trabalho nos nós deste pool de nós.

Configurar um namespace

  1. Execute o comando kubectl create namespace para criar um namespace chamado costsavings para o aplicativo. Você usará esse namespace para facilitar a seleção das cargas de trabalho.

    kubectl create namespace costsavings
    

    Aqui está a saída JSON do comando anterior:

    namespace/costsavings created
    

Agendar um pod com a afinidade de nó spot

Você pode agendar um pod para ser executado em um nó spot adicionando uma tolerância e uma afinidade ao arquivo de manifesto de implantação do pod. Quando a tolerância e a afinidade do nó correspondem ao taint e ao rótulo aplicados aos nós spot, o pod é agendado nesses nós.

Os nós em um pool de nós spot recebem um taint igual akubernetes.azure.com/scalesetpriority=spot:NoSchedule e um rótulo igual a kubernetes.azure.com/scalesetpriority=spot. Use as informações neste par de chave-valor na seção tolerations e affinity do arquivo de manifesto YAML de suas cargas de trabalho. Com o segundo pool de processamento em lotes configurado como um pool de nós spot, agora você pode criar um arquivo de implantação para agendar cargas de trabalho a serem executadas nele.

  1. Crie um arquivo de manifesto para a implantação do Kubernetes chamado spot-node-deployment.yaml usando o editor integrado:

    code spot-node-deployment.yaml
    

    Dica

    O Cloud Shell inclui um editor de arquivos integrado. O editor do Cloud Shell é compatível com recursos como o realce de idioma, a paleta de comandos e um explorador de arquivos. Para criação e edição de arquivo simples, inicie o editor executando code . no terminal do Cloud Shell. Essa ação abre o editor com o diretório de trabalho ativo definido no terminal. Para abrir o arquivo de manifesto diretamente para edição rápida, execute code spot-node-deployment.yaml. Esse comando abre o editor sem o explorador de arquivos.

  2. Cole o seguinte texto no arquivo:

    apiVersion: v1
    kind: Pod
    metadata:
      name: nginx
      labels:
        env: test
    spec:
      containers:
      - name: nginx
        image: nginx
        imagePullPolicy: IfNotPresent
      tolerations:
      - key: "kubernetes.azure.com/scalesetpriority"
        operator: "Equal"
        value: "spot"
        effect: "NoSchedule"
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: "kubernetes.azure.com/scalesetpriority"
                operator: In
                values:
                - "spot"
    
  3. Pressione Ctrl+S para salvar o arquivo e, em seguida, pressione Ctrl+Q para fechar o editor.

  4. Execute o comando kubectl apply para aplicar a configuração e implantar o aplicativo no namespace costsavings:

    kubectl apply \
    --namespace costsavings \
    -f spot-node-deployment.yaml
    

    Aqui está a saída JSON do comando anterior:

    pod/nginx created
    
  5. Busque mais informações sobre o pod em execução usando o sinalizador -o wide ao executar o comando kubectl get pods. Nesse caso, é recomendável que você veja em qual nó o pod está agendado. Lembre-se de consultar os pods no namespace costsavings.

    kubectl get pods --namespace costsavings -o wide
    

    O resultado deve ser assim:

    NAME    READY   STATUS    RESTARTS   AGE   IP           NODE                                   NOMINATED NODE   READINESS GATES
    nginx   1/1     Running   0          43s   10.244.3.3   aks-batchprocpl2-25254417-vmss000000   <none>           <none>
    

    Observe o nome do nó, aks-batchprocpl2-25254417-vmss000000. Esse nó faz parte do pool de nós spot batchprocpl2 que você criou anteriormente.