Este documento explica como usar a otimização de inicialização da CPU com o escalonador automático vertical de pods (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 de inicialização da CPU acelera a inicialização do aplicativo e melhora a eficiência de custos, aumentando temporariamente as solicitações de CPU durante a inicialização e redimensionando-as de volta aos níveis de referência. Este documento aborda os requisitos, a configuração (nível de pod e contêiner), a verificação e as práticas recomendadas da otimização 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
O uso da otimização de inicialização da CPU oferece os seguintes benefícios:
- Inicialização mais rápida: acelere a inicialização de aplicativos com uso intensivo de recursos , como aqueles escritos em Java, Node.js ou Python.
- Eficiência de custos: evite o provisionamento excessivo de CPU para operação em estado estável atendendo à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: dimensione 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 dimensionar as 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 mais recentes para clusters Standard e Autopilot. - VPA ativado: ative o escalonamento automático vertical de pods em clusters Standard. O GKE ativa o 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 a carga de trabalho.
- Capacidade do nó: verifique se os clusters Standard têm capacidade suficiente para o pod otimizado. Se a capacidade for insuficiente, o GKE vai limitar a solicitação do pod otimizado para se ajustar 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 de inicialização da CPU calcula aumentos de recursos, consulte Como funciona a otimização de inicialização da CPU.
Antes de começar
Antes de começar, selecione o Cloud de Confiance by S3NS projeto que contém o cluster que você quer otimizar e execute as seguintes tarefas:
- Ativar a API Google Kubernetes Engine. Ativar a API Google Kubernetes Engine
- Se você quiser usar a Google Cloud CLI para essa tarefa,
instale e, em seguida,
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 não tiver, consulte Criar um cluster.
Funções exigidas
Para receber as permissões necessárias para ativar e usar a otimização de inicialização da CPU, peça que o administrador conceda a você as seguintes funções 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 com papéis personalizados ou outros papéis predefinidos.
Ativar a otimização de inicialização da CPU
Para ativar a otimização de inicialização da CPU, adicione um bloco de configuração startupBoost ao manifesto do VerticalPodAutoscaler (VPA). É possível configurar a otimização para aplicar a todos os contêineres em um pod ou segmentar contêineres individuais com aumentos de recursos específicos.
Configurar uma otimização no nível do pod
Uma otimização no nível do pod aplica o mesmo aumento de recursos de CPU a todos os contêineres na carga de trabalho. É possível configurar a otimização de inicialização da CPU com ou sem o gerenciamento contínuo de recursos do VPA.
Para configurar uma otimização 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 otimização de inicialização da CPU sem acionar 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 após o pod atingir 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: otimização de inicialização e modo de atualização do VPA ativados
Se você quiser que o GKE gerencie a otimização de inicialização e continue ajustando automaticamente as solicitações de recursos do pod com base no uso contínuo, use essa opção. O exemplo a seguir aplica a otimização 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 uma otimização no nível do contêiner
Se a carga de trabalho incluir sidecars ou outros contêineres que não exigem recursos extras, é possível segmentar contêineres específicos para uma otimização 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 uma otimização no nível do contêiner, use uma das seguintes opções.
Opção A: otimizar um contêiner específico (acionamento do VPA desativado)
Use essa opção para aplicar uma otimização 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 linha de base 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 uma otimização no nível do pod
Se você tiver uma otimização no nível do pod configurada, mas quiser excluir um contêiner específico, use essa opção. O manifesto de exemplo a seguir aplica um fator de multiplicação de CPU de 2 a todo o pod, mas desativa a otimização 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 de inicialização da CPU
Para verificar se os pods recebem a otimização, 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 conferir 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 otimizada no pod
Para verificar as solicitações de recursos atuais do pod, execute o seguinte comando:
kubectl describe pod POD_NAME
Substitua POD_NAME pelo nome do pod.
Verificar a otimização da CPU usando anotações de pod
O webhook de admissão do VPA injeta uma anotação com escopo de contêiner para rastrear os recursos originais aos quais cada contêiner precisa reverter quando a otimização expirar. Para verificar essas anotações, execute o seguinte comando:
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:
- Otimização bem-sucedida: a anotação
vpaCpuStartupBoost/CONTAINER_NAMEestá presente no pod. - Otimização sem sucesso: a anotação está ausente. Isso significa que o controlador de admissão ignorou a otimização, 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 da CPU de volta à linha de base, 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:
- Otimização desativada com sucesso: um evento
InPlaceResizedByVPAaparece com uma mensagem indicando que o pod foi redimensionado no local pelo atualizador do VPA. Isso confirma que a solicitação de CPU retornou ao valor de referência sem reiniciar o contêiner. - Otimização desativada sem sucesso: a anotação
vpaCpuStartupBoost/CONTAINER_NAMEpermanece no pod muito tempo depois que a otimização deveria ter expirado, e não há eventoInPlaceResizedByVPA.
Práticas recomendadas e limitações
Analise 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, na sigla em inglês) com a otimização de inicialização da CPU, siga estas diretrizes:
- Definir verificações 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 ao alto uso da CPU durante a inicialização.
Escalonador automático de clusters e loops de remoção
Se você usar o escalonador automático de clusters em clusters do GKE Standard, considere estes comportamentos de nós:
- Loops de remoção em potencial: uma otimização temporária da CPU pode acionar um escalonamento vertical do nó. Depois que o pod estiver pronto e for reduzido, a subutilização poderá acionar o escalonamento horizontal do nó e remover o pod, levando a um loop sem fim.
- Mitigação: recomendamos o uso do 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êiner afetam a otimização de inicialização da CPU analisando os seguintes comportamentos:
- Somente durante a criação do pod: a otimização de inicialização da CPU é aplicada apenas durante a fase inicial de criação do pod.
- Sem otimizaçã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 otimizaçã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 a otimização de inicialização da CPU em cargas de trabalho atuais, tenha o seguinte em mente para evitar interrupções na carga de trabalho:
- 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 de inicialização da CPU, poderá desativar apenas a otimização usando um dos seguintes métodos com base no escopo:
- Desativar a otimização para toda a carga de trabalho: exclua o
startupBoostbloco da especificação do objeto VerticalPodAutoscaler e aplique o manifesto atualizado ao cluster. Desativar a otimização para um contêiner específico: para excluir um contêiner específico de uma otimização no nível do pod, adicione uma política de contêiner na seção
containerPoliciese defina o fator multiplicador da CPU como 1.startupBoost: cpu: type: "Factor" factor: 1Para mais informações, consulte Configurar uma otimização no nível do contêiner.
- Desativar a otimização para toda a carga de trabalho: exclua o
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 escala