Escala automática vertical de pods

Esta página explica como pode analisar e otimizar a atribuição de recursos para melhorar a eficiência da carga de trabalho no Google Kubernetes Engine (GKE) através da escala automática vertical de pods. Ao analisar a utilização de recursos da sua carga de trabalho ao longo do tempo, pode receber recomendações de otimização e ajustar automaticamente os pedidos de CPU e memória, bem como os limites para contentores nos pods.

Nesta página, vai saber como funciona o dimensionamento automático de pods vertical, as respetivas vantagens e limitações, as práticas recomendadas para a sua utilização e aceder às referências da API para o recurso personalizado VerticalPodAutoscaler e os tipos relacionados.

Esta página destina-se a operadores e programadores que aprovisionam e configuram recursos na nuvem, implementam cargas de trabalho e gerem o dimensionamento de aplicações. Para saber mais sobre as funções comuns, consulte o artigo Funções e tarefas comuns do utilizador do GKE.

Antes de ler esta página, certifique-se de que está familiarizado com os pedidos e os limites de recursos no Kubernetes.

Para necessidades de escalabilidade rápida em resposta a uma utilização repentina de recursos, use o redimensionador automático horizontal de pods.

Para saber as práticas recomendadas para o dimensionamento automático, consulte o artigo Práticas recomendadas para executar aplicações Kubernetes otimizadas em termos de custos no GKE.

Como funciona a escala automática vertical de pods

A escala automática vertical de pods permite-lhe analisar e definir os recursos de CPU e memória necessários pelos pods. Em vez de ter de configurar os pedidos e os limites da CPU atualizados e os pedidos e os limites de memória para os contentores nos seus pods, pode configurar a escala automática vertical de pods para fornecer valores recomendados para os pedidos e os limites da CPU e da memória que pode usar para atualizar manualmente os seus pods. Em alternativa, pode configurar a escala automática vertical de pods para atualizar automaticamente os valores.

A escala automática vertical de pods está ativada por predefinição nos clusters do Autopilot.

Modos de escala automática vertical de pods

Pode configurar a forma como o dimensionamento automático de pods vertical aplica alterações de recursos através da aplicação de diferentes modos de atualização.

Modo Auto (Recreate)

No modo Recreate, a escala automática vertical de pods despeja um pod se precisar de alterar os pedidos de recursos do pod. A remoção é necessária porque, devido às limitações do Kubernetes nas versões anteriores à 1.33, a única forma de modificar os pedidos de recursos de um pod em execução é recriá-lo.

Para limitar a quantidade de recriações de pods, use um orçamento de interrupção de pods. Para garantir que o cluster consegue processar os novos tamanhos das cargas de trabalho, use o dimensionamento automático do cluster e o aprovisionamento automático de nós.

A escala automática vertical de pods notifica o redimensionador automático de clusters antes da atualização e fornece os recursos necessários para a carga de trabalho redimensionada antes de recriar a carga de trabalho, de modo a minimizar o tempo de interrupção.

Modo Initial

Com a Initial ativada, a escala automática vertical de pods só atribui pedidos de recursos no momento da criação do pod e nunca os altera posteriormente.

Modo InPlaceOrRecreate

O modo InPlaceOrRecreate tem como objetivo reduzir a interrupção do serviço tentando atualizar os recursos do pod sem recriar o pod. Embora este modo não garanta zero interrupções, pode ajudar a reduzir as interrupções, ao mesmo tempo que beneficia do ajuste automático vertical de pods.

Para usar o modo InPlaceOrRecreate, defina o campo spec.updatePolicy.updateMode como "InPlaceOrRecreate" no objeto VerticalPodAutoscaler.

Se o ajuste de escala automático vertical do pod determinar que uma atualização no local não é possível, reverte para o comportamento do modo Auto, que remove e recria o pod para aplicar as alterações.

O modo InPlaceOrRecreate está disponível com a versão 1.34.0-gke.1709000 do Kubernetes e posterior.

Para mais detalhes sobre o comportamento e as limitações existentes do modo InPlaceOrRecreate, consulte o anúncio do Kubernetes sobre as atualizações no local.

Vantagens

A escala automática vertical de pods oferece as seguintes vantagens:

  • Definir os pedidos e os limites de recursos certos para as suas cargas de trabalho melhora a estabilidade e a rentabilidade. Se os tamanhos dos recursos do pod forem inferiores aos necessários para as suas cargas de trabalho, a sua aplicação pode ser limitada ou falhar devido a erros de falta de memória. Se os tamanhos dos recursos forem demasiado grandes, tem desperdício e, por isso, faturas mais elevadas.
  • Os nós do cluster são usados de forma eficiente porque os pods usam exatamente o que precisam.
  • Os pods são agendados em nós que têm os recursos adequados disponíveis.
  • Não tem de executar tarefas de testes de referência demoradas para determinar os valores corretos para pedidos de CPU e memória.
  • Tempo de manutenção reduzido, uma vez que o dimensionador automático pode ajustar os pedidos de CPU e memória ao longo do tempo sem qualquer ação da sua parte.

A escala automática vertical de pods do GKE oferece as seguintes vantagens em relação ao redimensionador automático de código aberto do Kubernetes:

  • Tem em conta o tamanho máximo do nó e as quotas de recursos ao determinar o objetivo da recomendação.
  • Notifica o redimensionador automático de clusters para ajustar a capacidade do cluster.
  • Usa dados do histórico, fornecendo métricas recolhidas antes de ativar o Vertical Pod Autoscaler.
  • Executa pods de escala automática vertical de pods como processos do plano de controlo, em vez de implementações nos seus nós de trabalho.

Limitações

  • Para usar a escala automática vertical de pods com a escala automática horizontal de pods, use a escala automática de pods multidimensional. Também pode usar a escala automática vertical de pods com a escala automática horizontal de pods em métricas personalizadas e externas.
  • A escala automática vertical de pods não está pronta para utilização com cargas de trabalho baseadas na JVM devido à visibilidade limitada da utilização real de memória da carga de trabalho.
  • A escala automática vertical de pods tem uma predefinição de duas réplicas mínimas para as implementações substituírem os pods por valores de recursos revistos. Na versão 1.22 e posteriores do GKE, pode substituir esta definição especificando um valor para minReplicas no campo PodUpdatePolicy.
  • Se usar o modo de atualização InPlaceOrRecreate da escala automática vertical de pods e não for possível fazer uma atualização no local (por exemplo, quando aumenta a escala do pod para além da capacidade do nó), a escala automática vertical de pods despeja e recria o pod para aplicar a recomendação. A remoção e a recriação ocorrem mesmo para os pods que têm um resizePolicy definido na respetiva especificação para evitar recriações.

Práticas recomendadas

  • Para evitar interrupções na atualização do cluster, recomendamos que mantenha o número de objetos VerticalPodAutoscaler por cluster abaixo de 1000.
  • A escala automática vertical de pods funciona melhor com cargas de trabalho homogéneas de execução prolongada.

Referência da API

Esta é a referência da API v1. Recomendamos vivamente a utilização desta versão da API.

VerticalPodAutoscaler v1 autoscaling.k8s.io

Campos

TypeMeta

Grupo, versão e tipo da API.

metadata

ObjectMeta

Metadados de objetos padrão.

spec

VerticalPodAutoscalerSpec

O comportamento pretendido do VerticalPodAutoscaler.

status

VerticalPodAutoscalerStatus

O estado observado mais recentemente do VerticalPodAutoscaler.

VerticalPodAutoscalerSpec v1 autoscaling.k8s.io

Campos
targetRef

CrossVersionObjectReference

Referência ao controlador que gere o conjunto de pods para o autoscaler controlar, por exemplo, uma implementação ou um StatefulSet. Pode apontar um VerticalPodAutoscaler para qualquer controlador que tenha um subrecurso Scale. Normalmente, o VerticalPodAutoscaler obtém o conjunto de pods do ScaleStatus do controlador. Para alguns controladores conhecidos, por exemplo, o DaemonSet, o VerticalPodAutoscaler obtém o conjunto de pods da especificação do controlador.

updatePolicy

PodUpdatePolicy

Especifica se as atualizações recomendadas são aplicadas quando um Pod é iniciado e se as atualizações recomendadas são aplicadas durante a vida útil de um Pod.

resourcePolicy

PodResourcePolicy

Especifica as políticas de ajuste dos pedidos de CPU e memória para contentores individuais. A política de recursos pode ser usada para definir restrições nas recomendações para contentores individuais. Se não for especificado, o escalador automático calcula os recursos recomendados para todos os contentores no pod, sem restrições adicionais.

recommenders

VerticalPodAutoscalerRecommenderSelector array

Recomendador responsável por gerar a recomendação para este objeto VPA. Deixe este campo vazio para usar o recomendador predefinido fornecido pelo GKE. Caso contrário, a lista pode conter exatamente uma entrada para um recomendador alternativo fornecido pelo utilizador. Suportado desde o GKE 1.22.

VerticalPodAutoscalerList v1 autoscaling.k8s.io

Campos

TypeMeta

Grupo, versão e tipo da API.

metadata

ObjectMeta

Metadados de objetos padrão.

items

VerticalPodAutoscaler array

Uma lista de VerticalPodAutoscaler objetos.

PodUpdatePolicy v1 autoscaling.k8s.io

Campos
updateMode

string

Especifica se as atualizações recomendadas são aplicadas quando um Pod é iniciado e se as atualizações recomendadas são aplicadas durante a vida útil de um Pod. Os valores possíveis são os seguintes:

  • "Off": as atualizações recomendadas são geradas, mas não são aplicadas automaticamente ao Pod.
  • "Initial": as atualizações recomendadas são aplicadas apenas quando um Pod é iniciado pela primeira vez. As atualizações que ocorrem enquanto o Pod já está em execução não são aplicadas automaticamente.
  • "Recreate": as atualizações recomendadas são aplicadas recriando o pod. O pod existente é terminado e é criado um novo pod com a configuração atualizada.
  • "Auto": o valor predefinido que aplica essencialmente o modo "Recreate".
  • "InPlaceOrRecreate": as atualizações recomendadas são aplicadas sem recriar o pod, se possível.
minReplicas

int32

O número mínimo de réplicas que têm de estar ativas para tentar a remoção de pods (pendente de outras verificações, como o orçamento de interrupção de pods). Apenas são permitidos valores positivos. A predefinição é 2. Suportado desde o GKE 1.22.

PodResourcePolicy v1 autoscaling.k8s.io

Campos
containerPolicies

ContainerResourcePolicy array

Uma matriz de políticas de recursos para contentores individuais. Pode existir, no máximo, uma entrada para cada contentor com nome e, opcionalmente, uma única entrada com carateres universais com `containerName = '*'`, que processa todos os contentores que não têm políticas individuais.

ContainerResourcePolicy v1 autoscaling.k8s.io

Campos
containerName

string

O nome do contentor ao qual a política se aplica. Se não for especificada, a política serve como política predefinida.

mode

ContainerScalingMode

Especifica se as atualizações recomendadas são aplicadas ao contentor quando é iniciado e se as atualizações recomendadas são aplicadas durante a duração do contentor. Os valores possíveis são "Off" e "Auto". A predefinição é "Auto" se não especificar um valor.

minAllowed

ResourceList

Especifica o pedido mínimo de CPU e o pedido de memória permitidos para o contentor. Por predefinição, não é aplicado nenhum mínimo.

maxAllowed

ResourceList

Especifica o pedido máximo de CPU e o pedido de memória permitidos para o contentor. Por predefinição, não é aplicado nenhum máximo.

ControlledResources

[]ResourceName

Especifica o tipo de recomendações que vão ser calculadas (e possivelmente aplicadas) pelo VerticalPodAutoscaler. Se estiver vazio, é usado o valor predefinido de [ResourceCPU, ResourceMemory].

VerticalPodAutoscalerRecommenderSelector v1 autoscaling.k8s.io

Campos
name

string

Nome do recomendador responsável por gerar a recomendação para este objeto.

VerticalPodAutoscalerStatus v1 autoscaling.k8s.io

Campos
recommendation

RecommendedPodResources

Os pedidos de CPU e memória recomendados mais recentemente.

conditions

VerticalPodAutoscalerCondition array

Descreve o estado atual do VerticalPodAutoscaler.

RecommendedPodResources v1 autoscaling.k8s.io

Campos
containerRecommendation

RecommendedContainerResources array

Uma matriz de recomendações de recursos para contentores individuais.

RecommendedContainerResources v1 autoscaling.k8s.io

Campos
containerName

string

O nome do contentor ao qual a recomendação se aplica.

target

ResourceList

O pedido de CPU e o pedido de memória recomendados para o contentor.

lowerBound

ResourceList

O pedido de CPU mínimo recomendado e o pedido de memória para o contentor. Não é garantido que este valor seja suficiente para que a aplicação seja estável. A execução com pedidos de CPU e memória mais pequenos tem provavelmente um impacto significativo no desempenho ou na disponibilidade.

upperBound

ResourceList

O pedido de CPU e o pedido de memória máximos recomendados para o contentor. É provável que os pedidos de CPU e memória superiores a estes valores sejam desperdiçados.

uncappedTarget

ResourceList

A recomendação de recursos mais recente calculada pelo dimensionador automático, com base na utilização real de recursos, sem ter em conta a ContainerResourcePolicy. Se a utilização real de recursos fizer com que o destino viole a ContainerResourcePolicy, isto pode ser diferente da recomendação limitada. Este campo não afeta a atribuição real de recursos. É usado apenas como uma indicação de estado.

VerticalPodAutoscalerCondition v1 autoscaling.k8s.io

Campos
type

VerticalPodAutoscalerConditionType

O tipo de condição que está a ser descrito. Os valores possíveis são "RecommendationProvided", "LowConfidence", "NoPodsMatched" e "FetchingHistory".

status

ConditionStatus

O estado da condição. Os valores possíveis são True, False e Unknown.

lastTransitionTime

Time

A última vez que a condição fez uma transição de um estado para outro.

reason

string

O motivo da última transição de um estado para outro.

message

string

Uma string legível que fornece detalhes sobre a última transição de um estado para outro.

O que se segue?