Nesta página, explicamos como analisar e ajustar as solicitações de CPU e as solicitações de memória de um contêiner em um Google Kubernetes Engine (GKE) usando escalonamento automático de pods verticais.
É possível escalonar recursos de contêiner manualmente usando o console Google Cloud ,
analisar recursos usando um objeto VerticalPodAutoscaler
ou
configurar o escalonamento automático usando o
escalonamento automático vertical de pods.
Antes de começar
Antes de começar, verifique se você realizou as tarefas a seguir:
- Ativar a API Google Kubernetes Engine. Ativar a API Google Kubernetes Engine
- Se você quiser usar a CLI do Google Cloud para essa tarefa,
instale e inicialize a
gcloud CLI. Se você instalou a CLI gcloud anteriormente, instale a versão
mais recente executando o comando
gcloud components update
. Talvez as versões anteriores da CLI gcloud não sejam compatíveis com a execução dos comandos neste documento.
Analisar solicitações de recursos
O escalonador automático vertical de pods analisa automaticamente seus contêineres e fornece solicitações de recursos sugeridas. É possível ver essas solicitações de recursos usando o console doGoogle Cloud , o Cloud Monitoring ou a Google Cloud CLI.
Console
Para ver as solicitações de recursos sugeridas no console Google Cloud , você precisa ter uma carga de trabalho implantada com pelo menos 24 horas de uso. Algumas sugestões podem não estar disponíveis ou ser relevantes para determinadas cargas de trabalho, como as criadas nas últimas 24 horas, pods independentes e apps escritos em Java.
Acesse a página Cargas de trabalho no console Google Cloud .
Na lista de cargas de trabalho, clique no nome da carga de trabalho que você quer escalonar.
Clique em list Ações > Escalonar > Editar solicitações de recursos.
A seção Analisar dados de utilização de recursos mostra dados históricos de uso que o controlador do Escalonador automático vertical de pods analisou para criar as solicitações de recursos sugeridas na seção Ajustar solicitações e limites de recursos.
Cloud Monitoring
Para ver as solicitações de recursos sugeridas no Cloud Monitoring, você precisa implantar uma carga de trabalho atual.
Acesse a página do Metrics Explorer no console Google Cloud .
Clique em Configuração.
Abra o menu Selecionar uma métrica.
No menu Recurso, selecione Escalonar do Kubernetes.
No menu Categoria da métrica, selecione Escalonador automático.
No menu Métrica, selecione Recomendado por bytes de solicitação de réplica e Recomendado por núcleo de solicitação de réplica.
Clique em Aplicar.
CLI da gcloud
Para ver as solicitações de recursos sugeridas, crie um objeto VerticalPodAutoscaler
e uma implantação.
Para clusters padrão, ative o escalonamento automático vertical de pods no cluster. Para clusters do Autopilot, o escalonamento automático vertical de pods é ativado por padrão.
gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
Substitua
CLUSTER_NAME
pelo nome do cluster.Salve o seguinte manifesto como
my-rec-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: my-rec-deployment spec: replicas: 2 selector: matchLabels: app: my-rec-deployment template: metadata: labels: app: my-rec-deployment spec: containers: - name: my-rec-container image: nginx
Esse manifesto descreve um
Deployment
que não tem solicitações de CPU ou memória. O valorcontainers.name
demy-rec-deployment
especifica que todos os pods na implantação pertencem aVerticalPodAutoscaler
.Aplique o manifesto ao cluster:
kubectl create -f my-rec-deployment.yaml
Salve o seguinte manifesto como
my-rec-vpa.yaml
:apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: my-rec-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: my-rec-deployment updatePolicy: updateMode: "Off"
Esse manifesto descreve uma
VerticalPodAutoscaler
. O valorupdateMode
deOff
significa que, quando os pods são criados, o controlador de escalonador automático vertical de pods analisa as necessidades de CPU e memória dos contêineres e registra essas recomendações no campostatus
do recurso. O controlador do escalonador automático vertical de pods não atualiza automaticamente as solicitações de recursos para executar contêineres.Aplique o manifesto ao cluster:
kubectl create -f my-rec-vpa.yaml
Depois de algum tempo, visualize o
VerticalPodAutoscaler
:kubectl get vpa my-rec-vpa --output yaml
A saída será assim:
... recommendation: containerRecommendations: - containerName: my-rec-container lowerBound: cpu: 25m memory: 262144k target: cpu: 25m memory: 262144k upperBound: cpu: 7931m memory: 8291500k ...
O resultado mostra recomendações para solicitações de CPU e memória.
Definir solicitações de recursos de pods manualmente
É possível definir solicitações de recursos de pods manualmente usando o console Google Cloud ou o kubectl. Use as seguintes práticas recomendadas para definir limites e solicitações de recursos do contêiner:
- Memória: defina a mesma quantidade de memória para a solicitação e o limite.
- CPU: para a solicitação, especifique a CPU mínima necessária para garantir a operação correta, de acordo com seus próprios SLOs. Defina um limite de CPU sem restrições.
Console
Acesse a página Cargas de trabalho no console Google Cloud .
Na lista de cargas de trabalho, clique no nome da carga de trabalho que você quer escalonar.
Clique em list Ações > Escalonar > Editar solicitações de recursos.
- A seção Ajustar solicitações e limites de recursos mostra as solicitações atuais de CPU e memória para cada contêiner, além das solicitações sugeridas de CPU e memória.
Clique em Aplicar sugestões mais recentes para visualizar as solicitações sugeridas para cada contêiner.
Clique em Save Changes.
Clique em Confirmar.
kubectl
Escalonar verticalmente sua carga de trabalho com o mínimo de interrupção
A partir da
versão 1.33 do Kubernetes,
é possível usar o comando
kubectl patch
para escalonar verticalmente sua carga de trabalho atualizando os
recursos atribuídos a um contêiner, sem recriar o pod. Para mais informações, incluindo limitações, consulte a
documentação do Kubernetes sobre como redimensionar recursos de CPU e memória.
Para usar o comando kubectl patch
, especifique a solicitação de recurso atualizada na sinalização
--patch
. Por exemplo, para escalonar my-app
para 800 mCPUs, execute o
seguinte comando:
kubectl patch pod my-app --subresource resize --patch \
'{"spec":{"containers":[{"name":"pause", "resources":{"requests":{"cpu":"800m"}, "limits":{"cpu":"800m"}}}]}}'
Escalonar verticalmente sua carga de trabalho
Para definir solicitações de recursos para um pod, defina os valores de "request.cpu" e "memory.cpu" no manifesto de implantação. Neste exemplo, você modifica manualmente a implantação criada em Analisar solicitações de recursos com solicitações de recursos sugeridas.
Salve o seguinte manifesto de exemplo como
my-adjusted-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: my-rec-deployment spec: replicas: 2 selector: matchLabels: app: my-rec-deployment template: metadata: labels: app: my-rec-deployment spec: containers: - name: my-rec-container image: nginx resources: requests: cpu: 25m memory: 256Mi
Esse manifesto descreve uma implantação com dois pods. Cada pod tem um contêiner que solicita 25 milliCPU e 256 MiB de memória.
Aplique o manifesto ao cluster:
kubectl apply -f my-adjusted-deployment.yaml
Definir solicitações de recursos de pods automaticamente
O escalonamento automático vertical de pods usa o objeto VerticalPodAutoscaler
para
definir automaticamente as solicitações de recursos nos pods quando updateMode
é Auto
. É
possível configurar um VerticalPodAutoscaler
usando a CLI gcloud ou o
console doGoogle Cloud .
Console
Para definir solicitações de recursos automaticamente, é necessário ter um cluster com o recurso de escalonamento automático vertical de pods ativado. Os clusters do Autopilot têm o recurso de escalonamento automático vertical de pods ativado por padrão.
Ativar o Escalonamento automático vertical de pods
Acesse a página Google Kubernetes Engine no Google Cloud console.
Na lista de clusters, clique no nome do cluster que você quer modificar.
Na seção Automação, clique em edit Editar na opção Escalonamento automático vertical de pods.
Marque a caixa de seleção Ativar o escalonamento automático vertical de pods.
Clique em Salvar alterações.
Configurar o escalonamento automático vertical de pods
Acesse a página Cargas de trabalho no Google Cloud console.
Na lista de cargas de trabalho, clique no nome da implantação em que você quer configurar o escalonamento automático vertical de pods.
Clique em list Ações > Escalonamento automático > Escalonamento automático vertical de pods.
Escolha um modo de escalonamento automático:
- Modo automático: o escalonamento automático vertical de pods atualiza as solicitações de CPU e memória durante a vida útil de um pod.
- Modo inicial: o escalonamento automático vertical de pods atribui solicitações de recursos apenas na criação do pod e nunca as altera posteriormente.
(Opcional) Defina políticas de contêiner. Com essa opção, você garante que a recomendação nunca seja definida acima ou abaixo de uma solicitação de recurso especificada.
- Clique em expand_more Adicionar política.
- Selecione Automático para Editar o modo de contêiner.
- Em Recursos controlados, selecione em quais recursos você quer fazer o escalonamento automático do contêiner.
- Clique em Adicionar regra para definir um ou mais intervalos mínimos ou máximos para as solicitações de recursos do contêiner:
- Memória mínima permitida: a quantidade mínima de memória que o contêiner precisa ter sempre, em MiB.
- CPU mínima permitida: a quantidade mínima de CPU que o contêiner precisa ter sempre, em mCPU.
- Memória permitida máxima: a quantidade máxima de memória que o contêiner precisa ter sempre, em MiB.
- Máximo permitido de CPU: a quantidade máxima de CPU que o contêiner precisa ter sempre, em mCPU.
Clique em Concluído.
Clique em Salvar.
gcloud
Para definir solicitações de recursos automaticamente, use um cluster com o recurso de escalonamento automático vertical de pods ativado. Os clusters do Autopilot têm o recurso ativado por padrão.
Para clusters padrão, ative o escalonamento automático vertical de pods no cluster:
gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
Substitua
CLUSTER_NAME
pelo nome do cluster.Salve o seguinte manifesto como
my-auto-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: my-auto-deployment spec: replicas: 2 selector: matchLabels: app: my-auto-deployment template: metadata: labels: app: my-auto-deployment spec: containers: - name: my-container image: registry.k8s.io/ubuntu-slim:0.14 resources: requests: cpu: 100m memory: 50Mi command: ["/bin/sh"] args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]
Esse manifesto descreve uma implantação com dois pods. Cada pod tem um contêiner que solicita 100 milliCPU e 50 MiB de memória.
Aplique o manifesto ao cluster:
kubectl create -f my-auto-deployment.yaml
Liste os pods em execução:
kubectl get pods
A saída mostra os nomes dos pods em
my-deployment
:NAME READY STATUS RESTARTS AGE my-auto-deployment-cbcdd49fb-d6bf9 1/1 Running 0 8s my-auto-deployment-cbcdd49fb-th288 1/1 Running 0 8s
Salve o seguinte manifesto como
my-vpa.yaml
:apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: my-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: my-auto-deployment updatePolicy: updateMode: "Recreate"
Este manifesto descreve um
VerticalPodAutoscaler
com as seguintes propriedades:targetRef.name
: especifica que qualquer pod controlado por uma implantação chamadamy-deployment
pertence a esseVerticalPodAutoscaler
.updateMode: "Recreate"
: especifica que o controlador do escalonador automático vertical de pods pode excluir um pod, ajustar as solicitações de CPU e memória e, em seguida, iniciar um novo pod. Esse é o comportamento padrão se nenhum modo for especificado (também chamado de modoAuto
). Você também pode mudar o modo de atualização para um dos seguintes valores:updateMode: "Initial"
: o escalonamento automático vertical de pods atribui solicitações de recursos apenas no momento da criação do pod.updateMode: "InPlaceOrRecreate"
(prévia): o escalonamento automático vertical de pods tenta atualizar os recursos sem recriar o pod, voltando à recriação se necessário.
Aplique o manifesto ao cluster:
kubectl create -f my-vpa.yaml
Aguarde alguns minutos e veja os pods em execução novamente:
kubectl get pods
A resposta mostra que os nomes dos pods foram alterados:
NAME READY STATUS RESTARTS AGE my-auto-deployment-89dc45f48-5bzqp 1/1 Running 0 8s my-auto-deployment-89dc45f48-scm66 1/1 Running 0 8s
Se os nomes dos pods não tiverem mudado, aguarde um pouco mais e veja os pods em execução novamente.
Ver informações sobre um escalonador automático vertical de pods
Para ver detalhes sobre um escalonador automático vertical de pods, faça o seguinte:
Receba informações detalhadas sobre um dos seus pods em execução:
kubectl get pod POD_NAME --output yaml
Substitua
POD_NAME
pelo nome de um dos pods que você recuperou na etapa anterior.O resultado será assim:
apiVersion: v1 kind: Pod metadata: annotations: vpaUpdates: 'Pod resources updated by my-vpa: container 0: cpu capped to node capacity, memory capped to node capacity, cpu request, memory request' ... spec: containers: ... resources: requests: cpu: 510m memory: 262144k ...
Esta saída mostra que o controlador do escalonador automático vertical de pods tem uma solicitação de memória de 262144k e uma solicitação de CPU de 510 miliCPU.
Veja informações detalhadas sobre
VerticalPodAutoscaler
:kubectl get vpa my-vpa --output yaml
O resultado será assim:
... recommendation: containerRecommendations: - containerName: my-container lowerBound: cpu: 536m memory: 262144k target: cpu: 587m memory: 262144k upperBound: cpu: 27854m memory: "545693548"
Esta saída mostra recomendações para solicitações de CPU e memória e inclui as seguintes propriedades:
target
: especifica essa informação para que o contêiner seja executado de maneira ideal, precisa solicitar 587 milliCPU e 26.2144 kilobytes de memória.lowerBound
eupperBound
: o escalonamento automático vertical de pods usa essas propriedades para decidir se quer excluir um pod e substituí-lo por um novo pod. Se um pod tiver solicitações abaixo do limite inferior ou acima do superior, o escalonador automático vertical de pods excluirá o pod e o substituirá por um que atenda ao atributo de destino.
Desativar contêineres específicos
É possível desativar contêineres específicos do escalonamento automático vertical de pods usando a CLI gcloud ou o console Google Cloud .
Console
Para desativar contêineres específicos do escalonamento automático vertical de pods, é necessário ter um cluster com o recurso de escalonamento automático vertical de pods ativado. Os clusters do Autopilot têm o recurso de escalonamento automático vertical de pods ativado por padrão.
Ativar o Escalonamento automático vertical de pods
Acesse a página Google Kubernetes Engine no Google Cloud console.
Na lista de clusters, clique no nome do cluster que você quer modificar.
Na seção Automação, clique em edit Editar na opção Escalonamento automático vertical de pods.
Marque a caixa de seleção Ativar o escalonamento automático vertical de pods.
Clique em Salvar alterações.
Configurar o escalonamento automático vertical de pods
Acesse a página Cargas de trabalho no Google Cloud console.
Na lista de cargas de trabalho, clique no nome da implantação em que você quer configurar o escalonamento automático vertical de pods.
Clique em list Ações > Escalonamento automático > Escalonamento automático vertical de pods.
Escolha um modo de escalonamento automático:
- Modo automático: o escalonamento automático vertical de pods atualiza as solicitações de CPU e memória durante a vida útil de um pod.
- Modo inicial: o escalonamento automático vertical de pods atribui solicitações de recursos apenas na criação do pod e nunca as altera posteriormente.
Clique em expand_more Adicionar política.
Selecione o contêiner que você quer desativar.
Em Editar modo do contêiner, selecione Desativado.
Clique em Concluído.
Clique em Salvar.
gcloud
Para desativar contêineres específicos do escalonamento automático vertical de pods, execute as seguintes etapas:
Salve o seguinte manifesto como
my-opt-vpa.yaml
:apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: my-opt-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: my-opt-deployment updatePolicy: updateMode: "Recreate" resourcePolicy: containerPolicies: - containerName: my-opt-sidecar mode: "Off"
Esse manifesto descreve uma
VerticalPodAutoscaler
. O valormode: "Off"
desativa as recomendações do contêinermy-opt-sidecar
.Aplique o manifesto ao cluster:
kubectl apply -f my-opt-vpa.yaml
Salve o seguinte manifesto como
my-opt-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: my-opt-deployment spec: replicas: 1 selector: matchLabels: app: my-opt-deployment template: metadata: labels: app: my-opt-deployment spec: containers: - name: my-opt-container image: nginx - name: my-opt-sidecar image: busybox command: ["sh","-c","while true; do echo Doing sidecar stuff!; sleep 60; done"]
Aplique o manifesto ao cluster:
kubectl apply -f my-opt-deployment.yaml
Após algum tempo, veja o escalonador automático vertical de pods:
kubectl get vpa my-opt-vpa --output yaml
O resultado mostra recomendações para solicitações de CPU e memória:
... recommendation: containerRecommendations: - containerName: my-opt-container ...
Nesta saída, há apenas recomendações para um contêiner. Não há recomendações para
my-opt-sidecar
.O escalonador automático vertical de pods nunca atualiza recursos em contêineres desativados. Depois de alguns minutos, o Pod é recriado, mas apenas um contêiner tem as solicitações de recurso atualizadas.
Identificar cargas de trabalho sem solicitações ou limites de recursos
É recomendável identificar cargas de trabalho sem solicitações e limites de recursos configurados porque o GKE recomenda definir solicitações e limites de recursos para todas as cargas de trabalho como uma prática recomendada para evitar o encerramento abrupto do pod sob pressão de recursos do nó e melhorar a precisão da alocação de custos. Definir pods BestEffort ou pods com memória Burstable pode causar problemas de confiabilidade quando um nó sofre pressão de memória. Use as seguintes práticas recomendadas para definir limites e solicitações de recursos do contêiner:
- Memória: defina a mesma quantidade de memória para a solicitação e o limite.
- CPU: para a solicitação, especifique a CPU mínima necessária para garantir a operação correta, de acordo com seus próprios SLOs. Defina um limite de CPU sem restrições.
O GKE gera insights e recomendações para cargas de trabalho executadas sem solicitações e limites de recursos.
A tabela a seguir descreve os cenários de configuração de recursos que o GKE detecta e os critérios para cada um deles.
Subtipo de insight | Cenário de configurações ausentes | Detalhes |
---|---|---|
REQUEST_OR_LIMIT_NOT_SET |
Nenhuma solicitação e limite de memória configurados.
(MEMORY_REQUEST_AND_LIMIT_NOT_SET )
|
Os pods estão sendo executados sem solicitações nem limites de memória definidos para os contêineres. O GKE não pode limitar o uso da memória e pode encerrar abruptamente esses pods se um nó sofrer pressão de memória, o que pode causar problemas de confiabilidade. |
REQUEST_OR_LIMIT_NOT_SET |
Nenhum limite de memória configurado.
(MEMORY_LIMIT_NOT_SET )
|
Os pods estão sendo executados sem limites de memória definidos para os contêineres. O GKE não pode limitar o uso da memória e pode encerrar abruptamente esses pods se um nó sofrer pressão de memória e o uso de memória dos pods exceder as solicitações, o que pode causar problemas de confiabilidade. Defina a mesma quantidade de memória para solicitações e limites para evitar que os pods usem mais memória do que o solicitado. |
REQUEST_OR_LIMIT_NOT_SET |
Nenhuma solicitação e limite de CPU configurados.
(CPU_REQUEST_AND_LIMIT_NOT_SET )
|
Os pods estão sendo executados sem solicitações e limites de CPU definidos para os contêineres. Isso aumenta as chances de esgotamento dos recursos do nó, eleva a probabilidade de limitação dos pods quando o uso da CPU do nó está próximo do limite e pode causar problemas de desempenho. |
Para mais informações sobre esses insights, siga as instruções para ver insights e recomendações.
Verificar manualmente solicitações e limites de recursos
Talvez seja necessário revisar manualmente quais solicitações e limites de recursos estão faltando e precisam ser especificados para uma determinada carga de trabalho. Assim, é possível atualizar a configuração conforme recomendado.
Para revisar ou atualizar a configuração de solicitações e limites de recursos de uma carga de trabalho específica, faça o seguinte:
Acesse a página Cargas de trabalho no console Google Cloud .
Na lista de cargas de trabalho, clique no nome da carga de trabalho que você quer inspecionar.
Clique em list Ações > Escalonar > Editar solicitações de recursos.
- A seção Ajustar solicitações e limites de recursos mostra as solicitações atuais de CPU e memória para cada contêiner.
A seguir
- Saiba mais sobre o Escalonamento automático vertical de pods.
- Saiba mais sobre Práticas recomendadas para executar aplicativos econômicos do Kubernetes no GKE
- Saiba como otimizar o uso do GKE com insights e recomendações.