Acelerar a inicialização de aplicativos com a otimização da CPU de inicialização

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.4447000 e 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_ID
    

    Substitua PROJECT_ID pelo 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:

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:

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 InPlaceResizedByVPA aparece 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_NAME permanece no pod muito tempo depois que a otimização deveria ter expirado, e não há evento InPlaceResizedByVPA.

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 readinessProbe para suas cargas de trabalho.
  • Configurar o atraso de duração: defina o parâmetro durationSeconds como 0. 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 startupBoost bloco 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 containerPolicies e defina o fator multiplicador da CPU como 1.

        startupBoost:
          cpu:
            type: "Factor"
            factor: 1
      

      Para mais informações, consulte Configurar uma otimização no nível do contêiner.

A seguir