Usar o Autoscaler de Pod Vertical no Serviço Kubernetes do Azure (AKS)
Este artigo mostra como usar o Vertical Pod Autoscaler (VPA) em seu cluster do Serviço Kubernetes do Azure (AKS). O VPA ajusta automaticamente as solicitações de CPU e memória para seus pods para corresponder aos padrões de uso de suas cargas de trabalho. Esse recurso ajuda a otimizar o desempenho de seus aplicativos e reduzir o custo de execução de suas cargas de trabalho no AKS.
Para obter mais informações, consulte a visão geral do Vertical Pod Autoscaler.
Antes de começar
Se você tiver um cluster AKS existente, verifique se ele está executando o Kubernetes versão 1.24 ou superior.
Você precisa da CLI do Azure versão 2.52.0 ou posterior instalada e configurada. Executar
az --version
para localizar a versão. Se precisar de instalar ou atualizar, veja Install Azure CLI (Instalar o Azure CLI).Se estiver habilitando o VPA em um cluster existente, verifique se
kubectl
está instalado e configurado para se conectar ao cluster AKS usando oaz aks get-credentials
comando.az aks get-credentials --name <cluster-name> --resource-group <resource-group-name>
Implantar o Vertical Pod Autoscaler em um novo cluster
Crie um novo cluster AKS com o VPA ativado usando o
az aks create
comando com o--enable-vpa
sinalizador.az aks create --name <cluster-name> --resource-group <resource-group-name> --enable-vpa --generate-ssh-keys
Após alguns minutos, o comando conclui e retorna informações formatadas em JSON sobre o cluster.
Atualizar um cluster existente para usar o Vertical Pod Autoscaler
Atualize um cluster existente para usar o VPA usando o
az aks update
comando com o--enable-vpa
sinalizador.az aks update --name <cluster-name> --resource-group <resource-group-name> --enable-vpa
Após alguns minutos, o comando conclui e retorna informações formatadas em JSON sobre o cluster.
Desativar o Autoscaler de Pod Vertical em um cluster existente
Desative o VPA em um cluster existente usando o
az aks update
comando com o--disable-vpa
sinalizador.az aks update --name <cluster-name> --resource-group <resource-group-name> --disable-vpa
Após alguns minutos, o comando conclui e retorna informações formatadas em JSON sobre o cluster.
Teste a instalação do Pod Autoscaler Vertical
No exemplo a seguir, criamos uma implantação com dois pods, cada um executando um único contêiner que solicita 100 milinúcleos e tenta utilizar um pouco acima de 500 milinúcleos. Também criamos uma configuração de VPA apontando para a implantação. O VPA observa o comportamento dos pods e, após cerca de cinco minutos, atualiza os pods para solicitar 500 milinúcleos.
Crie um arquivo nomeado
hamster.yaml
e copie no seguinte manifesto do exemplo Vertical Pod Autoscaler do repositório GitHub kubernetes/autoscaler :apiVersion: "autoscaling.k8s.io/v1" kind: VerticalPodAutoscaler metadata: name: hamster-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: hamster resourcePolicy: containerPolicies: - containerName: '*' minAllowed: cpu: 100m memory: 50Mi maxAllowed: cpu: 1 memory: 500Mi controlledResources: ["cpu", "memory"] --- apiVersion: apps/v1 kind: Deployment metadata: name: hamster spec: selector: matchLabels: app: hamster replicas: 2 template: metadata: labels: app: hamster spec: securityContext: runAsNonRoot: true runAsUser: 65534 containers: - name: hamster image: registry.k8s.io/ubuntu-slim:0.1 resources: requests: cpu: 100m memory: 50Mi command: ["/bin/sh"] args: - "-c" - "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"
Implante o
hamster.yaml
exemplo do Vertical Pod Autoscaler usando okubectl apply
comando.kubectl apply -f hamster.yaml
Após alguns minutos, o comando conclui e retorna informações formatadas em JSON sobre o cluster.
Visualize os pods em execução usando o
kubectl get
comando.kubectl get pods -l app=hamster
Sua saída deve ser semelhante à saída de exemplo a seguir:
hamster-78f9dcdd4c-hf7gk 1/1 Running 0 24s hamster-78f9dcdd4c-j9mc7 1/1 Running 0 24s
Visualize as reservas de CPU e memória em um dos pods usando o
kubectl describe
comando. Certifique-se de substituir<example-pod>
por um dos IDs de pod retornados na sua saída da etapa anterior.kubectl describe pod hamster-<example-pod>
Sua saída deve ser semelhante à saída de exemplo a seguir:
hamster: Container ID: containerd:// Image: k8s.gcr.io/ubuntu-slim:0.1 Image ID: sha256: Port: <none> Host Port: <none> Command: /bin/sh Args: -c while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done State: Running Started: Wed, 28 Sep 2022 15:06:14 -0400 Ready: True Restart Count: 0 Requests: cpu: 100m memory: 50Mi Environment: <none>
O pod tem 100 milicpu e 50 Mibibytes de memória reservados neste exemplo. Para este aplicativo de exemplo, o pod precisa de menos de 100 milicpu para ser executado, portanto, não há capacidade de CPU disponível. Os pods também reservam menos memória do que o necessário. A implantação vpa-recommender do Vertical Pod Autoscaler analisa os pods que hospedam o aplicativo hamster para ver se os requisitos de CPU e memória são apropriados. Se forem necessários ajustes, o vpa-updater reinicia os pods com valores atualizados.
Monitore os pods usando o
kubectl get
comando.kubectl get --watch pods -l app=hamster
Quando o novo pod de hamster é iniciado, você pode visualizar as reservas atualizadas de CPU e memória usando o
kubectl describe
comando. Certifique-se de substituir<example-pod>
por um dos IDs de pod retornados na sua saída da etapa anterior.kubectl describe pod hamster-<example-pod>
Sua saída deve ser semelhante à saída de exemplo a seguir:
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none>
Na saída anterior, você pode ver que a reserva de CPU aumentou para 587 milicpu, o que é mais de cinco vezes o valor original. A memória aumentou para 262.144 Kilobytes, o que representa cerca de 250 Mibibytes, ou cinco vezes o valor original. Este pod estava com poucos recursos, e o Vertical Pod Autoscaler corrigiu a estimativa com um valor muito mais apropriado.
Veja as recomendações atualizadas do VPA usando o
kubectl describe
comando para descrever as informações do recurso hamster-vpa.kubectl describe vpa/hamster-vpa
Sua saída deve ser semelhante à saída de exemplo a seguir:
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none>
Definir solicitações de Autoscaler de Pod Vertical
O VerticalPodAutoscaler
objeto define automaticamente as solicitações de recursos em pods com um updateMode
de Auto
. Você pode definir um valor diferente dependendo de seus requisitos e testes. Neste exemplo, criamos e testamos um manifesto de implantação com dois pods, cada um executando um contêiner que solicita 100 miliCPU e 50 MiB de memória, e define o updateMode
como Recreate
.
Crie um arquivo nomeado
azure-autodeploy.yaml
e copie no seguinte manifesto:apiVersion: apps/v1 kind: Deployment metadata: name: vpa-auto-deployment spec: replicas: 2 selector: matchLabels: app: vpa-auto-deployment template: metadata: labels: app: vpa-auto-deployment spec: containers: - name: mycontainer image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine resources: requests: cpu: 100m memory: 50Mi command: ["/bin/sh"] args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]
Crie o pod usando o
kubectl create
comando.kubectl create -f azure-autodeploy.yaml
Após alguns minutos, o comando conclui e retorna informações formatadas em JSON sobre o cluster.
Visualize os pods em execução usando o
kubectl get
comando.kubectl get pods
Sua saída deve ser semelhante à saída de exemplo a seguir:
NAME READY STATUS RESTARTS AGE vpa-auto-deployment-54465fb978-kchc5 1/1 Running 0 52s vpa-auto-deployment-54465fb978-nhtmj 1/1 Running 0 52s
Crie um arquivo nomeado
azure-vpa-auto.yaml
e copie no seguinte manifesto:apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: vpa-auto spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: vpa-auto-deployment updatePolicy: updateMode: "Recreate"
O
targetRef.name
valor especifica que qualquer pod controlado por uma implantação chamadavpa-auto-deployment
pertence aoVerticalPodAutoscaler
. OupdateMode
valor de significa que o controlador Vertical Pod Autoscaler pode excluir um pod, ajustar as solicitações deRecreate
CPU e memória e, em seguida, criar um novo pod.Aplique o manifesto ao cluster usando o
kubectl apply
comando.kubectl create -f azure-vpa-auto.yaml
Aguarde alguns minutos e, em seguida, visualize os pods em execução usando o
kubectl get
comando.kubectl get pods
Sua saída deve ser semelhante à saída de exemplo a seguir:
NAME READY STATUS RESTARTS AGE vpa-auto-deployment-54465fb978-qbhc4 1/1 Running 0 2m49s vpa-auto-deployment-54465fb978-vbj68 1/1 Running 0 109s
Obtenha informações detalhadas sobre um dos seus pods de execução usando o
kubectl get
comando. Certifique-se de substituir<pod-name>
pelo nome de um dos seus pods da sua saída anterior.kubectl get pod <pod-name> --output yaml
Sua saída deve ser semelhante à saída de exemplo a seguir, que mostra que o controlador VPA aumentou a solicitação de memória para 262144k e a solicitação de CPU para 25 miliCPU:
apiVersion: v1 kind: Pod metadata: annotations: vpaObservedContainers: mycontainer vpaUpdates: 'Pod resources updated by vpa-auto: container 0: cpu request, memory request' creationTimestamp: "2022-09-29T16:44:37Z" generateName: vpa-auto-deployment-54465fb978- labels: app: vpa-auto-deployment spec: containers: - args: - -c - while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done command: - /bin/sh image: mcr.microsoft.com/oss/nginx/nginx:1.15.5-alpine imagePullPolicy: IfNotPresent name: mycontainer resources: requests: cpu: 25m memory: 262144k
Obtenha informações detalhadas sobre o Vertical Pod Autoscaler e suas recomendações para CPU e memória usando o
kubectl get
comando.kubectl get vpa vpa-auto --output yaml
Sua saída deve ser semelhante à saída de exemplo a seguir:
recommendation: containerRecommendations: - containerName: mycontainer lowerBound: cpu: 25m memory: 262144k target: cpu: 25m memory: 262144k uncappedTarget: cpu: 25m memory: 262144k upperBound: cpu: 230m memory: 262144k
Neste exemplo, os resultados no
target
atributo especificam que não é necessário alterar a CPU ou o destino de memória para que o contêiner seja executado de forma ideal. No entanto, os resultados podem variar dependendo do aplicativo e de sua utilização de recursos.O Vertical Pod Autoscaler usa os
lowerBound
atributos eupperBound
para decidir se deseja excluir um pod e substituí-lo por um novo pod. Se um pod tiver solicitações menores que o limite inferior ou maiores que o limite superior, o Vertical Pod Autoscaler excluirá o pod e o substituirá por um pod que atenda ao atributo de destino.
Recomendação Extra para Vertical Pod Autoscaler
O Recomendador fornece recomendações para o uso de recursos com base no consumo de recursos em tempo real. O AKS implanta um Recommender quando um cluster habilita o VPA. Você pode implantar um Recomendado personalizado ou um Recomendado extra com a mesma imagem do padrão. A vantagem de ter um Recomendado personalizado é que você pode personalizar sua lógica de recomendação. Com um Recomendador extra, você pode particionar VPAs para usar diferentes Recomendadores.
No exemplo a seguir, criamos um Recommender extra, aplicamos a um clivo AKS existente e configuramos o objeto VPA para usar o Recommender extra.
Crie um arquivo nomeado
extra_recommender.yaml
e copie no seguinte manifesto:apiVersion: apps/v1 kind: Deployment metadata: name: extra-recommender namespace: kube-system spec: replicas: 1 selector: matchLabels: app: extra-recommender template: metadata: labels: app: extra-recommender spec: serviceAccountName: vpa-recommender securityContext: runAsNonRoot: true runAsUser: 65534 containers: - name: recommender image: registry.k8s.io/autoscaling/vpa-recommender:0.13.0 imagePullPolicy: Always args: - --recommender-name=extra-recommender resources: limits: cpu: 200m memory: 1000Mi requests: cpu: 50m memory: 500Mi ports: - name: prometheus containerPort: 8942
Implante o
extra-recomender.yaml
exemplo do Vertical Pod Autoscaler usando okubectl apply
comando.kubectl apply -f extra-recommender.yaml
Após alguns minutos, o comando conclui e retorna informações formatadas em JSON sobre o cluster.
Crie um arquivo nomeado
hamster-extra-recommender.yaml
e copie no seguinte manifesto:apiVersion: "autoscaling.k8s.io/v1" kind: VerticalPodAutoscaler metadata: name: hamster-vpa spec: recommenders: - name: 'extra-recommender' targetRef: apiVersion: "apps/v1" kind: Deployment name: hamster updatePolicy: updateMode: "Auto" resourcePolicy: containerPolicies: - containerName: '*' minAllowed: cpu: 100m memory: 50Mi maxAllowed: cpu: 1 memory: 500Mi controlledResources: ["cpu", "memory"] --- apiVersion: apps/v1 kind: Deployment metadata: name: hamster spec: selector: matchLabels: app: hamster replicas: 2 template: metadata: labels: app: hamster spec: securityContext: runAsNonRoot: true runAsUser: 65534 # nobody containers: - name: hamster image: k8s.gcr.io/ubuntu-slim:0.1 resources: requests: cpu: 100m memory: 50Mi command: ["/bin/sh"] args: - "-c" - "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"
Se
memory
não estiver especificado nocontrolledResources
, o Recomendado não responderá a eventos OOM. Neste exemplo, definimos apenas a CPU emcontrolledValues
.controlledValues
Permite que você escolha se deseja atualizar as solicitações de recursos do contêiner usando aRequestsOnly
opção ou por solicitações de recursos e limites usando aRequestsAndLimits
opção. O valor predefinido éRequestsAndLimits
. Se você usar a opção, asRequestsAndLimits
solicitações serão calculadas com base no uso real e os limites serão calculados com base na taxa de solicitação e limite do pod atual.Por exemplo, se você começar com um pod que solicita 2 CPUs e limita a 4 CPUs, o VPA sempre define o limite para ser o dobro das solicitações. O mesmo princípio se aplica à Memória. Quando você usa o
RequestsAndLimits
modo, ele pode servir como um modelo para suas solicitações e limites iniciais de recursos do aplicativo.Você pode simplificar o objeto VPA usando
Auto
recomendações de modo e computação para CPU e memória.Implante o
hamster-extra-recomender.yaml
exemplo usando okubectl apply
comando.kubectl apply -f hamster-extra-recommender.yaml
Monitore seus pods usando o
[kubectl get
comando ]kubectl-get .kubectl get --watch pods -l app=hamster
Quando o novo pod de hamster for iniciado, visualize as reservas atualizadas de CPU e memória usando o
kubectl describe
comando. Certifique-se de substituir<example-pod>
por um dos seus IDs de pod.kubectl describe pod hamster-<example-pod>
Sua saída deve ser semelhante à saída de exemplo a seguir:
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none>
Veja as recomendações atualizadas do VPA usando o
kubectl describe
comando.kubectl describe vpa/hamster-vpa
Sua saída deve ser semelhante à saída de exemplo a seguir:
State: Running Started: Wed, 28 Sep 2022 15:09:51 -0400 Ready: True Restart Count: 0 Requests: cpu: 587m memory: 262144k Environment: <none> Spec: recommenders: Name: customized-recommender
Solucionar problemas do Vertical Pod Autoscaler
Se você encontrar problemas com o Vertical Pod Autoscaler, poderá solucionar problemas dos componentes do sistema e da definição de recursos personalizados para identificar o problema.
Verifique se todos os componentes do sistema estão em execução usando o seguinte comando:
kubectl --namespace=kube-system get pods|grep vpa
Sua saída deve listar três pods: recomendador, atualizador e controlador de admissão, todos com um status de
Running
.Para cada um dos pods retornados na saída anterior, verifique se os componentes do sistema estão registrando erros usando o seguinte comando:
kubectl --namespace=kube-system logs [pod name] | grep -e '^E[0-9]\{4\}'
Verifique se a definição de recurso personalizada foi criada usando o seguinte comando:
kubectl get customresourcedefinition | grep verticalpodautoscalers
Próximos passos
Para saber mais sobre o objeto VPA, consulte a referência da API do Vertical Pod Autoscaler.
Azure Kubernetes Service