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 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
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.
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"
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}"
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
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.
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.
- 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
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.
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
Você verá uma saída semelhante a este exemplo:
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
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 spotbatchprocpl2
que você criou anteriormente.
Precisa de ajuda? Confira nosso guia de solução de problemas ou forneça comentários específicos relatando um problema.