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 do usuário do tipo spot permitem que você acesse a capacidade de computação não utilizada do Azure com preços menores, mas ainda dão suporte a 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.

Aqui, você adicionará um pool de nós do usuário spot com dimensionamento automático para reduzir os custos operacionais do cluster, em um cenário em que o uso ainda varia mas não é tão previsível. Você também implantará uma carga de trabalho com a afinidade de nó habilitada para que o pod seja agendado em nós no pool de nós spot.

Habilitar versão prévia dos recursos na sua assinatura

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

    Cuidado

    Este exercício usa a versão prévia dos recursos. Depois que você habilitar a versão prévia de alguns recursos no Azure, os padrões poderão ser usados para todos os clusters do AKS (Serviço de Kubernetes do Azure) criados na assinatura. Teste a versão prévia dos recursos em assinaturas que não sejam de produção a fim de evitar efeitos colaterais imprevistos nas implantações de produção.

  2. Registre o sinalizador spotpoolpreview executando o comando az feature register. Esse comando usa dois parâmetros: o namespace (que identifica o provedor de recursos com o qual você está registrando o recurso) e o nome (que identifica o recurso, em si).

    az feature register --namespace "Microsoft.ContainerService" --name "spotpoolpreview"
    
  3. Verifique se o registro foi bem-sucedido consultando a tabela da lista de recursos. Execute o comando az feature list para executar a consulta. O registro do recurso pode levar vários minutos para ser concluído, portanto, você precisará verificar o resultado periodicamente.

    az feature list -o table --query "[?contains(name, 'Microsoft.ContainerService/spotpoolpreview')].{Name:name,State:properties.state}"
    
  4. Quando o registro do recurso for concluído, execute o comando az provider register com o parâmetro --namespace para atualizar o registro:

    az provider register --namespace Microsoft.ContainerService
    

Instalar as extensões de versão prévia da CLI do Azure

  1. Para trabalhar com essa versão prévia, você deve usar a extensão de versão prévia da CLI do Azure para o AKS, aks-preview. Instale a versão 0.4.0 da extensão de versão prévia da CLI do Azure executando o comando az extension add:

    az extension add --name aks-preview
    

    Verifique a versão instalada da extensão se você já tiver instalado a versão prévia. Execute o comando az extension show para consultar a versão da extensão:

    az extension show --name aks-preview --query [version]
    

    Atualize a extensão executando o comando az extension update se você tiver instalado a extensão anteriormente e precisar atualizá-la para uma versão mais recente:

    az extension update --name aks-preview
    

Criar um pool de nós spot

É recomendável criar um pool de nós separado que seja compatível com o serviço de processamento em lotes. 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ê precisará alterar o nome do pool de nós e adicionar alguns outros 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
    

    Você verá uma confirmação indicando que o namespace foi criado:

    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
    

    Você verá uma saída semelhante a este exemplo:

    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
    

    Você verá uma saída semelhante a este exemplo:

    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.