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

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

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

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:

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 InPlaceResizedByVPA com 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_NAME permanece no pod muito depois do vencimento do aumento, e não há evento InPlaceResizedByVPA.

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 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 à 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 startupBoost da 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 containerPolicies e defina o fator multiplicador de CPU como 1.

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

      Para mais informações, consulte Configurar um aumento no nível do contêiner.

A seguir