Este documento explica como usar o aumento de inicialização da CPU com o escalonador automático de pods verticais (VPA) no Google Kubernetes Engine (GKE) para aumentar temporariamente os recursos de CPU alocados a um pod durante a fase de inicialização.
A otimização da inicialização da CPU acelera a inicialização do aplicativo e melhora a eficiência de custos ao aumentar temporariamente as solicitações de CPU durante a inicialização e redimensioná-las de volta aos níveis de linha de base no local. Este documento aborda os requisitos, a configuração (nível de pod e contêiner), a verificação e as práticas recomendadas do aumento de inicialização.
Este documento é destinado a engenheiros de DevOps e de plataforma e desenvolvedores de aplicativos que querem otimizar a performance de inicialização de aplicativos no GKE.
Vantagens
Usar a otimização de inicialização da CPU oferece os seguintes benefícios:
- Inicialização mais rápida: acelere a inicialização de aplicativos que consomem muitos recursos, como os escritos em Java, Node.js ou Python.
- Eficiência de custo: evite o provisionamento excessivo de CPU para operação em estado estável e atenda às demandas de inicialização. A operação em estado estável é o período após a conclusão da inicialização de um aplicativo e a estabilização do uso de recursos.
- Sem interrupção: reduza os recursos de volta aos níveis de referência usando o redimensionamento de pods no local (IPPR, na sigla em inglês) do Kubernetes sem reiniciar os contêineres.
- Redução do esforço manual: minimize o desperdício de recursos e o esforço manual necessário para ajustar o tamanho das cargas de trabalho.
Requisitos
Para usar a otimização de inicialização da CPU, você precisa atender aos seguintes requisitos:
- Versão do GKE: use
1.36.0-gke.4447000e versões mais recentes para clusters Standard e Autopilot. - VPA ativado: ative o escalonamento automático vertical de pods em clusters padrão. O GKE ativa a VPA por padrão em clusters do Autopilot. É possível usar o VPA exclusivamente para a otimização de inicialização da CPU escolhendo um modo de atualização específico. Para ativar e configurar o VPA, consulte Definir solicitações de recursos de pods automaticamente.
- Tipo de carga de trabalho: use um controlador, como uma implantação ou um StatefulSet, para gerenciar sua carga de trabalho.
- Capacidade do nó: verifique se os clusters padrão têm capacidade suficiente para o pod promovido. Se não houver capacidade suficiente, o GKE vai limitar a solicitação de pod aumentada para se adequar ao nó.
Como funciona a otimização de inicialização da CPU
Para mais informações sobre o ciclo de vida da otimização e como a otimização da inicialização da CPU calcula os aumentos de recursos, consulte Como funciona a otimização da inicialização da CPU.
Antes de começar
Antes de começar, verifique se você selecionou o projeto do Cloud de Confiance by S3NS que contém o cluster que você quer aumentar e se realizou as seguintes tarefas:
- Ative a API Google Kubernetes Engine. Ativar a API Google Kubernetes Engine
- Se você quiser usar a Google Cloud CLI para essa tarefa, instale e inicialize a CLI gcloud. 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.
Configure a CLI gcloud para usar o projeto selecionado:
gcloud config set project PROJECT_IDSubstitua
PROJECT_IDpelo ID do seu projeto.Verifique se você tem um cluster do GKE. Se você não tiver um, consulte Criar um cluster.
Funções exigidas
Para receber as permissões necessárias e ativar e usar o aumento de inicialização da CPU, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto:
- Administrador do Kubernetes Engine (
roles/container.admin) - Desenvolvedor do Kubernetes Engine (
roles/container.developer)
Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.
Também é possível conseguir as permissões necessárias usando papéis personalizados ou outros papéis predefinidos.
Ativar a otimização da CPU de inicialização
Para ativar a otimização da CPU de inicialização, adicione um bloco de configuração startupBoost ao manifesto do
VerticalPodAutoscaler (VPA). É possível configurar o aumento para aplicar a
todos os contêineres em um pod ou segmentar contêineres individuais com aumentos específicos de recursos.
Configurar um aumento no nível do pod
Um aumento no nível do pod aplica o mesmo aumento de recurso de CPU a todos os contêineres na carga de trabalho. É possível configurar a otimização da CPU de inicialização com ou sem o gerenciamento contínuo de recursos do VPA.
Para configurar um aumento no nível do pod, use uma das seguintes opções.
Opção A: otimização de inicialização ativada e modo de atualização do VPA desativado
Use essa opção para aproveitar o VPA exclusivamente para os recursos de aumento de inicialização da CPU
sem acionar as recomendações regulares do VPA. O exemplo a seguir aplica um fator de multiplicação de CPU de 2 e o mantém por 10 segundos depois que o pod atinge o status Ready:
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: example-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: example
updatePolicy:
updateMode: "Off"
startupBoost:
cpu:
type: "Factor"
factor: 2
durationSeconds: 10
Opção B: modo de atualização do VPA e otimização de inicialização ativados
Use esta opção se quiser que o GKE gerencie o aumento de inicialização e continue ajustando automaticamente as solicitações de recursos do seu pod com base no uso contínuo. O
exemplo a seguir aplica o aumento de inicialização e define o campo updateMode como
InPlaceOrRecreate:
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: example-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: example
updatePolicy:
updateMode: "InPlaceOrRecreate"
startupBoost:
cpu:
type: "Factor"
factor: 2
durationSeconds: 10
Configurar um aumento no nível do contêiner
Se a carga de trabalho incluir sidecars ou outros contêineres que não exigem recursos extras, você poderá segmentar contêineres específicos para um aumento de inicialização na seção resourcePolicy. O valor containerName precisa corresponder ao campo name
de um contêiner na especificação de implantação.
Para configurar um aumento no nível do contêiner, use uma das seguintes opções.
Opção A: aumentar um contêiner específico (ativação do VPA desativada)
Use essa opção para aplicar um aumento a um único contêiner, mantendo o restante das solicitações de recursos do pod intacto. O manifesto de exemplo a seguir adiciona duas
vCPUs à solicitação de valor de referência para um contêiner chamado boosted-container-name:
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: example-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: example
updatePolicy:
updateMode: "Off"
resourcePolicy:
containerPolicies:
- containerName: "boosted-container-name"
mode: "Off"
startupBoost:
cpu:
type: "Quantity"
quantity: "2"
Opção B: desativar um contêiner específico de um aumento no nível do pod
Se você tiver um aumento no nível do pod configurado, mas quiser excluir um contêiner específico,
use esta opção. O manifesto de exemplo a seguir aplica um fator de multiplicação de CPU de 2 a
todo o pod, mas desativa o aumento para um contêiner chamado
disable-cpu-boost-for-this-container definindo o fator como 1:
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: example-vpa
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: example
updatePolicy:
updateMode: "InPlaceOrRecreate"
startupBoost:
cpu:
type: "Factor"
factor: 2
resourcePolicy:
containerPolicies:
- containerName: "disable-cpu-boost-for-this-container"
startupBoost:
cpu:
type: "Factor"
factor: 1
Verificar a otimização da CPU de inicialização
Para verificar se os pods recebem o aumento, confira a configuração do VPA, as solicitações de recursos do pod, as anotações do pod e os eventos do VPA.
Verificar a configuração do VPA
Para verificar os detalhes do objeto VerticalPodAutoscaler, execute o seguinte comando:
kubectl describe vpa VPA_NAME
Substitua VPA_NAME pelo nome do objeto VPA.
Verificar a solicitação de CPU aumentada no pod
Para verificar as solicitações de recursos atuais do seu pod, execute o seguinte comando:
kubectl describe pod POD_NAME
Substitua POD_NAME pelo nome do pod.
Verificar o aumento de CPU usando anotações de pod
O webhook de admissão da VPA injeta uma anotação no escopo do contêiner para rastrear os recursos originais a que cada contêiner deve retornar quando o aumento expirar. Para conferir essas anotações, execute o comando a seguir:
kubectl get pod POD_NAME --output yaml
Na seção metadata.annotations, procure uma anotação formatada como vpaCpuStartupBoost/CONTAINER_NAME. Exemplo:
metadata:
annotations:
vpaCpuStartupBoost/slow-starter: '{"requests":{"cpu":"50m","memory":"64Mi"},"limits":{"cpu":"200m","memory":"128Mi"}}'
A resposta ao comando indica um dos seguintes resultados de verificação:
- Aumento bem-sucedido: a anotação
vpaCpuStartupBoost/CONTAINER_NAMEestá presente no pod. - Otimização sem sucesso: a anotação está totalmente ausente. Isso significa que o controlador de admissão ignorou o aumento, possivelmente devido a limites de capacidade do nó ou limitações de recursos do Autopilot.
Verificar eventos de redução de escala
Para verificar se o GKE diminuiu a alocação de recursos de CPU de volta ao valor de referência, confira os eventos do cluster executando o seguinte comando:
kubectl get events --field-selector reason=InPlaceResizedByVPA
A resposta ao comando indica um dos seguintes resultados de verificação:
- Remoção do boost bem-sucedida: você vê um evento
InPlaceResizedByVPAcom uma mensagem indicando que o pod foi redimensionado no local pelo VPA Updater. Isso confirma que a solicitação de CPU voltou ao valor de base sem reiniciar o contêiner. - Remoção sem sucesso: a anotação
vpaCpuStartupBoost/CONTAINER_NAMEpermanece no pod muito depois do vencimento do aumento, e não há eventoInPlaceResizedByVPA.
Práticas recomendadas e limitações
Confira o seguinte ao usar a otimização de inicialização da CPU.
Interações com o escalonamento automático horizontal de pods
Se você usar o escalonador automático horizontal de pods (HPA) com o aumento de inicialização da CPU, siga estas diretrizes:
- Defina sondagens de integridade: é necessário definir um
readinessProbepara suas cargas de trabalho. - Configurar o atraso de duração: defina o parâmetro
durationSecondscomo0. Essa configuração impede que o HPA faça o escalonamento horizontal do aplicativo prematuramente devido à alta utilização da CPU durante a inicialização.
Escalonador automático de clusters e loops de remoção
Se você usa o escalonador automático de cluster em clusters do GKE Standard, considere estes comportamentos de nós:
- Possíveis loops de remoção: um aumento temporário da CPU pode acionar um escalonamento vertical do nó. Depois que o pod estiver pronto e for reduzido, a subutilização poderá acionar a redução de escala do nó e desalojar o pod, levando a um loop sem fim.
- Mitigação: recomendamos usar o GKE Autopilot para mitigar problemas de desfragmentação de nós e loops de remoção.
Reinicializações do contêiner
Entenda como as reinicializações de contêineres afetam a otimização da inicialização da CPU revisando os seguintes comportamentos:
- Somente durante a criação do pod: a otimização da inicialização da CPU é aplicada apenas durante a fase inicial de criação do pod.
- Sem aceleração na reinicialização: se um contêiner for reiniciado, por exemplo, devido a um evento OOMKill, mas o pod permanecer ativo, o GKE não vai aplicar a aceleração novamente. Esse comportamento ocorre porque o webhook de admissão do pod é acionado apenas durante o processo inicial de criação do pod.
Limpar
Como você configura o aumento de inicialização da CPU em cargas de trabalho atuais, lembre-se do seguinte para evitar interrupções:
- Não é necessário excluir nenhum recurso do Kubernetes.
- Se o objeto VerticalPodAutoscaler ou os controladores de carga de trabalho (como implantações ou StatefulSets) ainda forem necessários para operações de estado estável, não os exclua.
Se você não precisar da otimização da CPU de inicialização, desative apenas a otimização usando um dos seguintes métodos com base no seu escopo:
- Desativar o boost para toda a carga de trabalho: exclua o bloco
startupBoostda especificação do objeto VerticalPodAutoscaler e aplique o manifesto atualizado ao cluster. Desativar o aumento para um contêiner específico: para excluir um contêiner específico de um aumento no nível do pod, adicione uma política de contêiner na seção
containerPoliciese defina o fator multiplicador de CPU como 1.startupBoost: cpu: type: "Factor" factor: 1Para mais informações, consulte Configurar um aumento no nível do contêiner.
- Desativar o boost para toda a carga de trabalho: exclua o bloco
A seguir
- Escalonar solicitações e limites de recursos de contêiner
- Como configurar o escalonamento automático horizontal de pods
- Dimensionar cargas de trabalho em grande escala