Exercício – Configurar conjuntos de nós spot com o dimensionador automático de cluster num cluster do AKS

Concluído

Os pools de nós de usuário spot permitem que você acesse a capacidade de computação do Azure não utilizada 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 autoscaler de cluster para gerenciar a criação de nós e dimensionou a contagem de nós manualmente.

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 do cluster varia com base nos recursos necessários e não é previsível, portanto, você configura regras para capturar os picos e quedas. A carga de trabalho é implantada com a afinidade de nó habilitada para que o pod seja agendado em nós no pool de nós spot.

Criar um conjunto de nós spot

Você precisa criar um pool de nós separado que ofereça suporte ao serviço de processamento em lote. Este conjunto de nós é um conjunto de nós spot que utiliza a política de expulsão Eliminar e um preço máximo de spot de -1.

  1. Execute o mesmo comando az aks nodepool add que no exercício anterior para adicionar um novo conjunto 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 expulsão: Delete
    • Preço máximo do spot: -1

    Execute o comando seguinte para criar o conjunto 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 atenção que este pedido pode falhar, devido às restrições de capacidade na localização que selecionou.

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

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

    Veja a seguir 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 neste resultado são diferentes dos que viu em conjuntos de nós anteriores. Vamos rever estes 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.

    • Os valores nodeLabels e nodeTaints são aplicados a este conjunto de nós. Pode utilizar estes valores para agendar cargas de trabalho nos nós no conjunto de nós.

Configurar um espaço de nomes

  1. Execute o comando para criar um namespace chamado costsavings para o kubectl create namespace aplicativo. Vai utilizar este espaço de nomes para tornar mais fácil a seleção das cargas de trabalho.

    kubectl create namespace costsavings
    

    Aqui está a saída do comando anterior:

    namespace/costsavings created
    

Agendar um pod com a afinidade de nós spot

Você pode agendar um pod para ser executado em um nó local 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 à mancha e ao rótulo aplicados aos nós locais, o pod é programado nesses nós.

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

  1. Com o editor integrado, crie um ficheiro de manifesto para a implementação do Kubernetes denominado spot-node-deployment.yaml:

    code spot-node-deployment.yaml
    

    Gorjeta

    O Cloud Shell inclui um editor de ficheiros integrado. O editor do Cloud Shell suporta funcionalidades como o realce da linguagem, a paleta de comandos e um explorador de ficheiros. Para criação e edição de ficheiros simples, inicie o editor ao executar code . no terminal do Cloud Shell. Esta ação abre o editor com o diretório de trabalho ativo definido no terminal. Para abrir o ficheiro de manifesto diretamente para edição rápida, execute code spot-node-deployment.yaml. Este comando abre o editor sem o explorador de ficheiros.

  2. Cole o seguinte texto no ficheiro:

    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. Prima Ctrl+S para guardar o ficheiro e, em seguida, prima Ctrl+Q para fechar o editor.

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

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

    Aqui está a saída do comando anterior:

    pod/nginx created
    
  5. Você pode obter mais informações sobre o pod em execução usando o sinalizador ao executar kubectl get pods o -o wide comando. Neste caso, quer ver em que nó é que o pod está agendado. Certifique-se de que consulta os pods no espaço de nomes costsavings.

    kubectl get pods --namespace costsavings -o wide
    

    A saída deve ser semelhante à seguinte:

    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>
    

    Repare no nome do nó: aks-batchprocpl2-25254417-vmss000000. Este nó faz parte do conjunto de nós spot batchprocpl2 que criou anteriormente.