Exercício – Configurar pools de nós spot com o dimensionador automático de cluster em um cluster do AKS
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.
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.
- Nome:
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 comotrue
.Os valores
maxCount
eminCount
estão definidos.A propriedade
scaleSetEvictionPolicy
está definida comoDelete
.A propriedade
scaleSetPriority
está definida comoSpot
.A propriedade
spotMaxPrice
está definida como-1
.nodeLabels
enodeTaints
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
Execute o comando
kubectl create namespace
para criar um namespace chamadocostsavings
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.
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, executecode spot-node-deployment.yaml
. Esse comando abre o editor sem o explorador de arquivos.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"
Pressione Ctrl+S para salvar o arquivo e, em seguida, pressione Ctrl+Q para fechar o editor.
Execute o comando
kubectl apply
para aplicar a configuração e implantar o aplicativo no namespacecostsavings
:kubectl apply \ --namespace costsavings \ -f spot-node-deployment.yaml
Aqui está a saída JSON do comando anterior:
pod/nginx created
Busque mais informações sobre o pod em execução usando o sinalizador
-o wide
ao executar o comandokubectl get pods
. Nesse caso, é recomendável que você veja em qual nó o pod está agendado. Lembre-se de consultar os pods no namespacecostsavings
.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 spotbatchprocpl2
que você criou anteriormente.