Esta página explica como pode analisar e ajustar os pedidos de CPU e os pedidos de memória de um contentor num cluster do Google Kubernetes Engine (GKE) através da escala automática vertical de pods.
Pode dimensionar os recursos do contentor manualmente através da Google Cloud consola,
analisar os recursos com um objeto VerticalPodAutoscaler
ou
configurar o dimensionamento automático com o
dimensionamento automático vertical de pods.
Antes de começar
Antes de começar, certifique-se de que realizou as seguintes tarefas:
- Ative a API Google Kubernetes Engine. Ative a API Google Kubernetes Engine
- Se quiser usar a CLI gcloud para esta tarefa,
instale-a e, em seguida,
inicialize-a. Se instalou anteriormente a CLI gcloud, execute o comando
gcloud components update
para obter a versão mais recente. As versões anteriores da CLI gcloud podem não suportar a execução dos comandos neste documento.
Analise pedidos de recursos
O Vertical Pod Autoscaler analisa automaticamente os seus contentores e fornece pedidos de recursos sugeridos. Pode ver estes pedidos de recursos através daGoogle Cloud consola, do Cloud Monitoring ou da CLI do Google Cloud.
Consola
Para ver os pedidos de recursos sugeridos na Google Cloud consola, tem de ter uma carga de trabalho implementada existente com, pelo menos, 24 horas. Algumas sugestões podem não estar disponíveis ou ser relevantes para determinadas cargas de trabalho, como as criadas nas últimas 24 horas, os pods autónomos e as apps escritas em Java.
Aceda à página Workloads na Google Cloud consola.
Na lista de cargas de trabalho, clique no nome da carga de trabalho que quer dimensionar.
Clique em list Ações > Escalar > Editar pedidos de recursos.
A secção Dados de utilização de recursos de análise mostra dados de utilização do histórico que o controlador do redimensionador automático vertical de pods analisou para criar os pedidos de recursos sugeridos na secção Ajustar pedidos e limites de recursos.
Cloud Monitoring
Para ver os pedidos de recursos sugeridos no Cloud Monitoring, tem de ter uma carga de trabalho implementada.
Aceda à página Explorador de métricas na Google Cloud consola.
Clique em Configuração.
Expanda o menu Selecionar uma métrica.
No menu Recurso, selecione Kubernetes Scale.
No menu Categoria de métricas, selecione Ajustador automático.
No menu Métrica, selecione Bytes de pedidos por réplica recomendados e Núcleo de pedidos por réplica recomendado.
Clique em Aplicar.
CLI gcloud
Para ver os pedidos de recursos sugeridos, tem de criar um VerticalPodAutoscaler
objeto e uma implementação.
Para clusters Standard, ative a escala automática vertical de pods para o seu cluster. Para clusters do Autopilot, a escala automática vertical de pods está ativada por predefinição.
gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
Substitua
CLUSTER_NAME
pelo nome do seu cluster.Guarde 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
Este manifesto descreve um
Deployment
que não tem pedidos de CPU ou memória. O valorcontainers.name
demy-rec-deployment
especifica que todos os pods na implementação pertencem aoVerticalPodAutoscaler
.Aplique o manifesto ao cluster:
kubectl create -f my-rec-deployment.yaml
Guarde 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"
Este manifesto descreve um
VerticalPodAutoscaler
. O valorupdateMode
deOff
significa que, quando os pods são criados, o controlador da escala automática vertical de pods analisa as necessidades de CPU e memória dos contentores e regista essas recomendações no campostatus
do recurso. O controlador Vertical Pod Autoscaler não atualiza automaticamente os pedidos de recursos para contentores em execução.Aplique o manifesto ao cluster:
kubectl create -f my-rec-vpa.yaml
Após algum tempo, veja o
VerticalPodAutoscaler
:kubectl get vpa my-rec-vpa --output yaml
O resultado é semelhante ao seguinte:
... recommendation: containerRecommendations: - containerName: my-rec-container lowerBound: cpu: 25m memory: 262144k target: cpu: 25m memory: 262144k upperBound: cpu: 7931m memory: 8291500k ...
Este resultado mostra recomendações para pedidos de CPU e memória.
Defina manualmente os pedidos de recursos de pods
Pode definir pedidos de recursos de pods manualmente através da Google Cloud consola ou do kubectl. Use as seguintes práticas recomendadas para definir os pedidos e os limites de recursos do contentor:
- Memória: defina a mesma quantidade de memória para o pedido e o limite.
- CPU: para o pedido, especifique a CPU mínima necessária para garantir o funcionamento correto, de acordo com os seus próprios SLOs. Defina um limite de CPU ilimitado.
Consola
Aceda à página Workloads na Google Cloud consola.
Na lista de cargas de trabalho, clique no nome da carga de trabalho que quer dimensionar.
Clique em list Ações > Escalar > Editar pedidos de recursos.
- A secção Ajuste os pedidos e os limites de recursos mostra os pedidos atuais de CPU e memória para cada contentor, bem como os pedidos de CPU e memória sugeridos.
Clique em Aplicar sugestões mais recentes para ver os pedidos sugeridos para cada contentor.
Clique em Guardar alterações.
Clique em Confirm.
kubectl
Escalonar verticalmente a carga de trabalho com a mínima interrupção
A partir da
versão 1.33 do Kubernetes,
pode usar o comando
kubectl patch
para dimensionar verticalmente a sua carga de trabalho atualizando os recursos atribuídos a um contentor, sem recriar o pod. Para mais
informações, incluindo limitações, consulte a
documentação do Kubernetes para redimensionar recursos de CPU e memória.
Para usar o comando kubectl patch
, especifique o pedido de recurso atualizado na flag --patch
. Por exemplo, para dimensionar 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"}}}]}}'
Dimensione verticalmente a sua carga de trabalho
Para definir pedidos de recursos para um agrupamento, defina os valores requests.cpu e memory.cpu no manifesto de implementação. Neste exemplo, modifica manualmente a Implementação criada em Analisar pedidos de recursos com pedidos de recursos sugeridos.
Guarde 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
Este manifesto descreve uma implementação que tem dois pods. Cada pod tem um contentor que pede 25 milicpus e 256 mib de memória.
Aplique o manifesto ao cluster:
kubectl apply -f my-adjusted-deployment.yaml
Defina pedidos de recursos de pods automaticamente
A escala automática vertical de pods usa o objeto VerticalPodAutoscaler
para definir automaticamente pedidos de recursos em pods quando o updateMode
é Auto
. Pode configurar um VerticalPodAutoscaler
através da CLI gcloud ou da consolaGoogle Cloud .
Consola
Para definir pedidos de recursos automaticamente, tem de ter um cluster com a funcionalidade de escala automática vertical de pods ativada. Os clusters do Autopilot têm a funcionalidade de escala automática vertical de pods ativada por predefinição.
Ative a escala automática vertical de pods
Aceda à página do Google Kubernetes Engine na Google Cloud consola.
Na lista de clusters, clique no nome do cluster que quer modificar.
Na secção Automatização, clique em edit Editar para a opção Escala automática vertical de pods.
Selecione a caixa de verificação Ativar a escala automática vertical de pods.
Clique em Guardar alterações.
Configure a escala automática vertical de pods
Aceda à página Workloads na Google Cloud consola.
Na lista de cargas de trabalho, clique no nome da implementação para a qual quer configurar o ajuste automático vertical de pods.
Clique em list Ações > Escala automática > Escala automática vertical de pods.
Escolha um modo de ajuste de escala automático:
- Modo automático: a escala automática vertical de pods atualiza os pedidos de CPU e memória durante a vida útil de um pod.
- Modo inicial: a escala automática vertical de pods atribui pedidos de recursos apenas na criação de pods e nunca os altera posteriormente.
(Opcional) Defina políticas de contentores. Esta opção permite-lhe garantir que a recomendação nunca é definida acima ou abaixo de um pedido de recurso especificado.
- Clique em expand_more Adicionar política.
- Selecione Automático para Modo de edição do contentor.
- Em Recursos controlados, selecione os recursos nos quais quer dimensionar automaticamente o contentor.
- Clique em Adicionar regra para definir um ou mais intervalos mínimos ou máximos para os pedidos de recursos do contentor:
- Memória mín. permitida: a quantidade mínima de memória que o contentor deve ter sempre, em MiB.
- CPU mínima permitida: a quantidade mínima de CPU que o contentor deve ter sempre, em mCPU.
- Memória máxima permitida: a quantidade máxima de memória que o contentor deve ter sempre, em MiB.
- CPU máx. permitida: a quantidade máxima de CPU que o contentor deve ter sempre, em mCPU.
Clique em Concluído.
Clique em Guardar.
gcloud
Para definir pedidos de recursos automaticamente, tem de usar um cluster com a funcionalidade de escala automática vertical de pods ativada. Os clusters do Autopilot têm a funcionalidade ativada por predefinição.
Para clusters padrão, ative a escala automática vertical de pods para o seu cluster:
gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
Substitua
CLUSTER_NAME
pelo nome do seu cluster.Guarde 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"]
Este manifesto descreve uma implementação que tem dois pods. Cada pod tem um contentor que pede 100 miliCPU e 50 MiB de memória.
Aplique o manifesto ao cluster:
kubectl create -f my-auto-deployment.yaml
Apresente 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
Guarde 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 implementação denominadamy-deployment
pertence a esteVerticalPodAutoscaler
.updateMode: "Recreate"
: especifica que o controlador da escala automática vertical de pods pode eliminar um pod, ajustar os pedidos de CPU e memória e, em seguida, iniciar um novo pod. Este é o comportamento predefinido se não for especificado nenhum modo (também denominado modoAuto
). Também pode alterar o modo de atualização para um dos seguintes valores:updateMode: "Initial"
: a escala automática vertical de pods atribui pedidos de recursos apenas no momento da criação do pod.updateMode: "InPlaceOrRecreate"
(Pré-visualização): a escala automática vertical de pods tenta atualizar os recursos sem recriar o pod, recorrendo à 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
O resultado 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 sido alterados, aguarde mais um pouco e, em seguida, veja novamente os pods em execução.
Veja informações sobre um Vertical Pod Autoscaler
Para ver detalhes sobre um redimensionador automático vertical de pods, faça o seguinte:
Obtenha informações detalhadas acerca de um dos seus pods em execução:
kubectl get pod POD_NAME --output yaml
Substitua
POD_NAME
pelo nome de um dos seus Pods que obteve no passo anterior.O resultado é semelhante ao seguinte:
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 ...
Este resultado mostra que o controlador da escala automática vertical de pods tem um pedido de memória de 262144k e um pedido de CPU de 510 milicpus.
Receba informações detalhadas sobre o
VerticalPodAutoscaler
:kubectl get vpa my-vpa --output yaml
O resultado é semelhante ao seguinte:
... recommendation: containerRecommendations: - containerName: my-container lowerBound: cpu: 536m memory: 262144k target: cpu: 587m memory: 262144k upperBound: cpu: 27854m memory: "545693548"
Este resultado mostra recomendações para pedidos de CPU e memória, e inclui as seguintes propriedades:
target
: especifica que, para o contentor ser executado de forma ideal,deve pedir 587 milicpus e 262 144 kilobytes de memória.lowerBound
eupperBound
: a escala automática vertical de pods usa estas propriedades para decidir se deve eliminar um pod e substituí-lo por um novo pod. Se um pod tiver pedidos inferiores ao limite inferior ou superiores ao limite superior, o redimensionador automático vertical de pods elimina o pod e substitui-o por um pod que cumpre o atributo de destino.
Desative contentores específicos
Pode desativar a opção de dimensionamento automático de pods vertical para contentores específicos através da CLI gcloud ou da consola Google Cloud .
Consola
Para desativar a escala automática vertical de pods para contentores específicos, tem de ter um cluster com a funcionalidade de escala automática vertical de pods ativada. Os clusters do Autopilot têm a funcionalidade de escala automática vertical de pods ativada por predefinição.
Ative a escala automática vertical de pods
Aceda à página do Google Kubernetes Engine na Google Cloud consola.
Na lista de clusters, clique no nome do cluster que quer modificar.
Na secção Automatização, clique em edit Editar para a opção Escala automática vertical de pods.
Selecione a caixa de verificação Ativar a escala automática vertical de pods.
Clique em Guardar alterações.
Configure a escala automática vertical de pods
Aceda à página Workloads na Google Cloud consola.
Na lista de cargas de trabalho, clique no nome da implementação para a qual quer configurar o ajuste automático vertical de pods.
Clique em list Ações > Escala automática > Escala automática vertical de pods.
Escolha um modo de ajuste de escala automático:
- Modo automático: a escala automática vertical de pods atualiza os pedidos de CPU e memória durante a vida útil de um pod.
- Modo inicial: a escala automática vertical de pods atribui pedidos de recursos apenas na criação de pods e nunca os altera posteriormente.
Clique em expand_more Adicionar política.
Selecione o contentor que quer desativar.
Para Editar modo de contentor, selecione Desativado.
Clique em Concluído.
Clique em Guardar.
gcloud
Para desativar a escala automática vertical de pods para contentores específicos, siga os passos abaixo:
Guarde 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"
Este manifesto descreve um
VerticalPodAutoscaler
. O valormode: "Off"
desativa as recomendações para o contentormy-opt-sidecar
.Aplique o manifesto ao cluster:
kubectl apply -f my-opt-vpa.yaml
Guarde 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 redimensionador automático vertical de pods:
kubectl get vpa my-opt-vpa --output yaml
O resultado mostra recomendações para pedidos de CPU e memória:
... recommendation: containerRecommendations: - containerName: my-opt-container ...
Neste resultado, existem apenas recomendações para um contentor. Não existem recomendações para
my-opt-sidecar
.A escala automática vertical de pods nunca atualiza os recursos em contentores desativados. Se aguardar alguns minutos, o pod é recriado, mas apenas um contentor tem pedidos de recursos atualizados.
Identifique cargas de trabalho sem pedidos ou limites de recursos
Pode querer identificar cargas de trabalho sem limites e pedidos de recursos configurados porque o GKE recomenda definir limites e pedidos de recursos para todas as cargas de trabalho como uma prática recomendada para evitar o encerramento abrupto de pods sob pressão de recursos de nós e melhorar a precisão da atribuição de custos. A definição de pods BestEffort ou pods com memória Burstable pode originar problemas de fiabilidade quando um nó sofre pressão de memória. Use as seguintes práticas recomendadas para definir os pedidos e os limites de recursos do contentor:
- Memória: defina a mesma quantidade de memória para o pedido e o limite.
- CPU: para o pedido, especifique a CPU mínima necessária para garantir o funcionamento correto, de acordo com os seus próprios SLOs. Defina um limite de CPU ilimitado.
O GKE gera estatísticas e recomendações para cargas de trabalho em execução sem pedidos e limites de recursos.
A tabela seguinte descreve os cenários de configuração de recursos que o GKE deteta e os critérios para cada cenário.
Subtipo de estatísticas | Cenário de definições em falta | Detalhes |
---|---|---|
REQUEST_OR_LIMIT_NOT_SET |
Nenhum pedido nem limite de memória configurado.
(MEMORY_REQUEST_AND_LIMIT_NOT_SET )
|
Os pods estão a ser executados sem pedidos de memória e limites definidos para os respetivos contentores. O GKE não pode limitar a utilização de memória e pode terminar abruptamente esses pods se um nó sofrer pressão de memória, o que pode causar problemas de fiabilidade. |
REQUEST_OR_LIMIT_NOT_SET |
Não existem limites de memória configurados.
(MEMORY_LIMIT_NOT_SET )
|
Os pods estão a ser executados sem limites de memória definidos para os respetivos contentores. O GKE não pode limitar a utilização de memória e pode terminar abruptamente esses pods se um nó sofrer pressão de memória e a utilização de memória dos pods exceder os pedidos, o que pode causar problemas de fiabilidade. Deve definir a mesma quantidade de memória para pedidos e limites para evitar que os agrupamentos usem mais memória do que a pedida. |
REQUEST_OR_LIMIT_NOT_SET |
Nenhum pedido e limite de CPU configurados.
(CPU_REQUEST_AND_LIMIT_NOT_SET )
|
Os pods estão a ser executados sem pedidos de CPU e limites definidos para contentores. Isto aumenta as probabilidades de esgotamento dos recursos dos nós, torna os pods mais propensos a serem limitados quando a utilização da CPU do nó está perto do limite e pode causar problemas de desempenho. |
Para mais informações sobre estas estatísticas, siga as instruções para ver estatísticas e recomendações.
Verifique manualmente os pedidos e os limites de recursos
Pode querer rever manualmente os pedidos e os limites de recursos em falta e que têm de ser especificados para uma determinada carga de trabalho, de modo a poder atualizar a configuração conforme recomendado.
Para rever ou atualizar a configuração de pedidos e limites de recursos para uma carga de trabalho especificada, faça o seguinte:
Aceda à página Workloads na Google Cloud consola.
Na lista de cargas de trabalho, clique no nome da carga de trabalho que quer inspecionar.
Clique em list Ações > Dimensionar > Editar pedidos de recursos.
- A secção Ajuste os pedidos e os limites de recursos mostra os pedidos atuais de CPU e memória para cada contentor.
O que se segue?
- Saiba mais acerca do dimensionamento automático vertical de pods.
- Saiba mais sobre as práticas recomendadas para executar aplicações Kubernetes otimizadas em termos de custos no GKE.
- Saiba como otimizar a sua utilização do GKE com estatísticas e recomendações.