Escalonar solicitações e limites de recursos de contêiner

Nesta página, explicamos como analisar e ajustar as solicitações de CPU e as solicitações de memória de um contêiner em um Google Kubernetes Engine (GKE) usando escalonamento automático de pods verticais.

É possível escalonar recursos de contêiner manualmente usando o console Google Cloud , analisar recursos usando um objeto VerticalPodAutoscaler ou configurar o escalonamento automático usando o escalonamento automático vertical de pods.

Antes de começar

Antes de começar, verifique se você realizou as tarefas a seguir:

  • Ativar a API Google Kubernetes Engine.
  • Ativar a API Google Kubernetes Engine
  • Se você quiser usar a CLI do Google Cloud para essa tarefa, instale e inicialize a gcloud CLI. 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.

Analisar solicitações de recursos

O escalonador automático vertical de pods analisa automaticamente seus contêineres e fornece solicitações de recursos sugeridas. É possível ver essas solicitações de recursos usando o console doGoogle Cloud , o Cloud Monitoring ou a Google Cloud CLI.

Console

Para ver as solicitações de recursos sugeridas no console Google Cloud , você precisa ter uma carga de trabalho implantada com pelo menos 24 horas de uso. Algumas sugestões podem não estar disponíveis ou ser relevantes para determinadas cargas de trabalho, como as criadas nas últimas 24 horas, pods independentes e apps escritos em Java.

  1. Acesse a página Cargas de trabalho no console Google Cloud .

    Acesse "Cargas de trabalho"

  2. Na lista de cargas de trabalho, clique no nome da carga de trabalho que você quer escalonar.

  3. Clique em Ações > Escalonar > Editar solicitações de recursos.

    A seção Analisar dados de utilização de recursos mostra dados históricos de uso que o controlador do Escalonador automático vertical de pods analisou para criar as solicitações de recursos sugeridas na seção Ajustar solicitações e limites de recursos.

Cloud Monitoring

Para ver as solicitações de recursos sugeridas no Cloud Monitoring, você precisa implantar uma carga de trabalho atual.

  1. Acesse a página do Metrics Explorer no console Google Cloud .

    Acessar o Metrics Explorer

  2. Clique em Configuração.

  3. Abra o menu Selecionar uma métrica.

  4. No menu Recurso, selecione Escalonar do Kubernetes.

  5. No menu Categoria da métrica, selecione Escalonador automático.

  6. No menu Métrica, selecione Recomendado por bytes de solicitação de réplica e Recomendado por núcleo de solicitação de réplica.

  7. Clique em Aplicar.

CLI da gcloud

Para ver as solicitações de recursos sugeridas, crie um objeto VerticalPodAutoscaler e uma implantação.

  1. Para clusters padrão, ative o escalonamento automático vertical de pods no cluster. Para clusters do Autopilot, o escalonamento automático vertical de pods é ativado por padrão.

    gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
    

    Substitua CLUSTER_NAME pelo nome do cluster.

  2. Salve o seguinte manifesto como my-rec-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-rec-deployment
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: my-rec-deployment
      template:
        metadata:
          labels:
            app: my-rec-deployment
        spec:
          containers:
          - name: my-rec-container
            image: nginx
    

    Esse manifesto descreve um Deployment que não tem solicitações de CPU ou memória. O valor containers.name de my-rec-deployment especifica que todos os pods na implantação pertencem a VerticalPodAutoscaler.

  3. Aplique o manifesto ao cluster:

    kubectl create -f my-rec-deployment.yaml
    
  4. Salve o seguinte manifesto como my-rec-vpa.yaml:

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: my-rec-vpa
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind:       Deployment
        name:       my-rec-deployment
      updatePolicy:
        updateMode: "Off"
    

    Esse manifesto descreve uma VerticalPodAutoscaler. O valor updateMode de Off significa que, quando os pods são criados, o controlador de escalonador automático vertical de pods analisa as necessidades de CPU e memória dos contêineres e registra essas recomendações no campo status do recurso. O controlador do escalonador automático vertical de pods não atualiza automaticamente as solicitações de recursos para executar contêineres.

  5. Aplique o manifesto ao cluster:

    kubectl create -f my-rec-vpa.yaml
    
  6. Depois de algum tempo, visualize o VerticalPodAutoscaler:

    kubectl get vpa my-rec-vpa --output yaml
    

    A saída será assim:

    ...
      recommendation:
        containerRecommendations:
        - containerName: my-rec-container
          lowerBound:
            cpu: 25m
            memory: 262144k
          target:
            cpu: 25m
            memory: 262144k
          upperBound:
            cpu: 7931m
            memory: 8291500k
    ...
    

    O resultado mostra recomendações para solicitações de CPU e memória.

Definir solicitações de recursos de pods manualmente

É possível definir solicitações de recursos de pods manualmente usando o console Google Cloud ou o kubectl. Use as seguintes práticas recomendadas para definir limites e solicitações de recursos do contêiner:

  • Memória: defina a mesma quantidade de memória para a solicitação e o limite.
  • CPU: para a solicitação, especifique a CPU mínima necessária para garantir a operação correta, de acordo com seus próprios SLOs. Defina um limite de CPU sem restrições.

Console

  1. Acesse a página Cargas de trabalho no console Google Cloud .

    Acesse "Cargas de trabalho"

  2. Na lista de cargas de trabalho, clique no nome da carga de trabalho que você quer escalonar.

  3. Clique em Ações > Escalonar > Editar solicitações de recursos.

    1. A seção Ajustar solicitações e limites de recursos mostra as solicitações atuais de CPU e memória para cada contêiner, além das solicitações sugeridas de CPU e memória.
  4. Clique em Aplicar sugestões mais recentes para visualizar as solicitações sugeridas para cada contêiner.

  5. Clique em Save Changes.

  6. Clique em Confirmar.

kubectl

Escalonar verticalmente sua carga de trabalho com o mínimo de interrupção

A partir da versão 1.33 do Kubernetes, é possível usar o comando kubectl patch para escalonar verticalmente sua carga de trabalho atualizando os recursos atribuídos a um contêiner, sem recriar o pod. Para mais informações, incluindo limitações, consulte a documentação do Kubernetes sobre como redimensionar recursos de CPU e memória.

Para usar o comando kubectl patch, especifique a solicitação de recurso atualizada na sinalização --patch. Por exemplo, para escalonar my-app para 800 mCPUs, execute o seguinte comando:

kubectl patch pod my-app --subresource resize --patch \
  '{"spec":{"containers":[{"name":"pause", "resources":{"requests":{"cpu":"800m"}, "limits":{"cpu":"800m"}}}]}}'

Escalonar verticalmente sua carga de trabalho

Para definir solicitações de recursos para um pod, defina os valores de "request.cpu" e "memory.cpu" no manifesto de implantação. Neste exemplo, você modifica manualmente a implantação criada em Analisar solicitações de recursos com solicitações de recursos sugeridas.

  1. Salve o seguinte manifesto de exemplo como my-adjusted-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-rec-deployment
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: my-rec-deployment
      template:
        metadata:
          labels:
            app: my-rec-deployment
        spec:
          containers:
          - name: my-rec-container
            image: nginx
            resources:
              requests:
                cpu: 25m
                memory: 256Mi
    

    Esse manifesto descreve uma implantação com dois pods. Cada pod tem um contêiner que solicita 25 milliCPU e 256 MiB de memória.

  2. Aplique o manifesto ao cluster:

    kubectl apply -f my-adjusted-deployment.yaml
    

Definir solicitações de recursos de pods automaticamente

O escalonamento automático vertical de pods usa o objeto VerticalPodAutoscaler para definir automaticamente as solicitações de recursos nos pods quando updateMode é Auto. É possível configurar um VerticalPodAutoscaler usando a CLI gcloud ou o console doGoogle Cloud .

Console

Para definir solicitações de recursos automaticamente, é necessário ter um cluster com o recurso de escalonamento automático vertical de pods ativado. Os clusters do Autopilot têm o recurso de escalonamento automático vertical de pods ativado por padrão.

Ativar o Escalonamento automático vertical de pods

  1. Acesse a página Google Kubernetes Engine no Google Cloud console.

    Acessar o Google Kubernetes Engine

  2. Na lista de clusters, clique no nome do cluster que você quer modificar.

  3. Na seção Automação, clique em Editar na opção Escalonamento automático vertical de pods.

  4. Marque a caixa de seleção Ativar o escalonamento automático vertical de pods.

  5. Clique em Salvar alterações.

Configurar o escalonamento automático vertical de pods

  1. Acesse a página Cargas de trabalho no Google Cloud console.

    Acesse "Cargas de trabalho"

  2. Na lista de cargas de trabalho, clique no nome da implantação em que você quer configurar o escalonamento automático vertical de pods.

  3. Clique em Ações > Escalonamento automático > Escalonamento automático vertical de pods.

  4. Escolha um modo de escalonamento automático:

    • Modo automático: o escalonamento automático vertical de pods atualiza as solicitações de CPU e memória durante a vida útil de um pod.
    • Modo inicial: o escalonamento automático vertical de pods atribui solicitações de recursos apenas na criação do pod e nunca as altera posteriormente.
  5. (Opcional) Defina políticas de contêiner. Com essa opção, você garante que a recomendação nunca seja definida acima ou abaixo de uma solicitação de recurso especificada.

    1. Clique em Adicionar política.
    2. Selecione Automático para Editar o modo de contêiner.
    3. Em Recursos controlados, selecione em quais recursos você quer fazer o escalonamento automático do contêiner.
    4. Clique em Adicionar regra para definir um ou mais intervalos mínimos ou máximos para as solicitações de recursos do contêiner:
      • Memória mínima permitida: a quantidade mínima de memória que o contêiner precisa ter sempre, em MiB.
      • CPU mínima permitida: a quantidade mínima de CPU que o contêiner precisa ter sempre, em mCPU.
      • Memória permitida máxima: a quantidade máxima de memória que o contêiner precisa ter sempre, em MiB.
      • Máximo permitido de CPU: a quantidade máxima de CPU que o contêiner precisa ter sempre, em mCPU.
  6. Clique em Concluído.

  7. Clique em Salvar.

gcloud

Para definir solicitações de recursos automaticamente, use um cluster com o recurso de escalonamento automático vertical de pods ativado. Os clusters do Autopilot têm o recurso ativado por padrão.

  1. Para clusters padrão, ative o escalonamento automático vertical de pods no cluster:

    gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
    

    Substitua CLUSTER_NAME pelo nome do cluster.

  2. Salve o seguinte manifesto como my-auto-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-auto-deployment
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: my-auto-deployment
      template:
        metadata:
          labels:
            app: my-auto-deployment
        spec:
          containers:
          - name: my-container
            image: registry.k8s.io/ubuntu-slim:0.14
            resources:
              requests:
                cpu: 100m
                memory: 50Mi
            command: ["/bin/sh"]
            args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]
    

    Esse manifesto descreve uma implantação com dois pods. Cada pod tem um contêiner que solicita 100 milliCPU e 50 MiB de memória.

  3. Aplique o manifesto ao cluster:

    kubectl create -f my-auto-deployment.yaml
    
  4. Liste os pods em execução:

    kubectl get pods
    

    A saída mostra os nomes dos pods em my-deployment:

    NAME                            READY     STATUS             RESTARTS   AGE
    my-auto-deployment-cbcdd49fb-d6bf9   1/1       Running            0          8s
    my-auto-deployment-cbcdd49fb-th288   1/1       Running            0          8s
    
  5. Salve o seguinte manifesto como my-vpa.yaml:

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: my-vpa
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind:       Deployment
        name:       my-auto-deployment
      updatePolicy:
        updateMode: "Recreate"
    

    Este manifesto descreve um VerticalPodAutoscaler com as seguintes propriedades:

    • targetRef.name: especifica que qualquer pod controlado por uma implantação chamada my-deployment pertence a esse VerticalPodAutoscaler.
    • updateMode: "Recreate": especifica que o controlador do escalonador automático vertical de pods pode excluir um pod, ajustar as solicitações de CPU e memória e, em seguida, iniciar um novo pod. Esse é o comportamento padrão se nenhum modo for especificado (também chamado de modo Auto). Você também pode mudar o modo de atualização para um dos seguintes valores:
      • updateMode: "Initial": o escalonamento automático vertical de pods atribui solicitações de recursos apenas no momento da criação do pod.
      • updateMode: "InPlaceOrRecreate" (prévia): o escalonamento automático vertical de pods tenta atualizar os recursos sem recriar o pod, voltando à recriação se necessário.
  6. Aplique o manifesto ao cluster:

    kubectl create -f my-vpa.yaml
    
  7. Aguarde alguns minutos e veja os pods em execução novamente:

    kubectl get pods
    

    A resposta mostra que os nomes dos pods foram alterados:

    NAME                                 READY     STATUS             RESTARTS   AGE
    my-auto-deployment-89dc45f48-5bzqp   1/1       Running            0          8s
    my-auto-deployment-89dc45f48-scm66   1/1       Running            0          8s
    

    Se os nomes dos pods não tiverem mudado, aguarde um pouco mais e veja os pods em execução novamente.

Ver informações sobre um escalonador automático vertical de pods

Para ver detalhes sobre um escalonador automático vertical de pods, faça o seguinte:

  1. Receba informações detalhadas sobre um dos seus pods em execução:

    kubectl get pod POD_NAME --output yaml
    

    Substitua POD_NAME pelo nome de um dos pods que você recuperou na etapa anterior.

    O resultado será assim:

    apiVersion: v1
    kind: Pod
    metadata:
      annotations:
        vpaUpdates: 'Pod resources updated by my-vpa: container 0: cpu capped to node capacity, memory capped to node capacity, cpu request, memory request'
    ...
    spec:
      containers:
      ...
        resources:
          requests:
            cpu: 510m
            memory: 262144k
        ...
    

    Esta saída mostra que o controlador do escalonador automático vertical de pods tem uma solicitação de memória de 262144k e uma solicitação de CPU de 510 miliCPU.

  2. Veja informações detalhadas sobre VerticalPodAutoscaler:

    kubectl get vpa my-vpa --output yaml
    

    O resultado será assim:

    ...
      recommendation:
        containerRecommendations:
        - containerName: my-container
          lowerBound:
            cpu: 536m
            memory: 262144k
          target:
            cpu: 587m
            memory: 262144k
          upperBound:
            cpu: 27854m
            memory: "545693548"
    

    Esta saída mostra recomendações para solicitações de CPU e memória e inclui as seguintes propriedades:

    • target: especifica essa informação para que o contêiner seja executado de maneira ideal, precisa solicitar 587 milliCPU e 26.2144 kilobytes de memória.
    • lowerBound e upperBound: o escalonamento automático vertical de pods usa essas propriedades para decidir se quer excluir um pod e substituí-lo por um novo pod. Se um pod tiver solicitações abaixo do limite inferior ou acima do superior, o escalonador automático vertical de pods excluirá o pod e o substituirá por um que atenda ao atributo de destino.

Desativar contêineres específicos

É possível desativar contêineres específicos do escalonamento automático vertical de pods usando a CLI gcloud ou o console Google Cloud .

Console

Para desativar contêineres específicos do escalonamento automático vertical de pods, é necessário ter um cluster com o recurso de escalonamento automático vertical de pods ativado. Os clusters do Autopilot têm o recurso de escalonamento automático vertical de pods ativado por padrão.

Ativar o Escalonamento automático vertical de pods

  1. Acesse a página Google Kubernetes Engine no Google Cloud console.

    Acessar o Google Kubernetes Engine

  2. Na lista de clusters, clique no nome do cluster que você quer modificar.

  3. Na seção Automação, clique em Editar na opção Escalonamento automático vertical de pods.

  4. Marque a caixa de seleção Ativar o escalonamento automático vertical de pods.

  5. Clique em Salvar alterações.

Configurar o escalonamento automático vertical de pods

  1. Acesse a página Cargas de trabalho no Google Cloud console.

    Acesse "Cargas de trabalho"

  2. Na lista de cargas de trabalho, clique no nome da implantação em que você quer configurar o escalonamento automático vertical de pods.

  3. Clique em Ações > Escalonamento automático > Escalonamento automático vertical de pods.

  4. Escolha um modo de escalonamento automático:

    • Modo automático: o escalonamento automático vertical de pods atualiza as solicitações de CPU e memória durante a vida útil de um pod.
    • Modo inicial: o escalonamento automático vertical de pods atribui solicitações de recursos apenas na criação do pod e nunca as altera posteriormente.
  5. Clique em Adicionar política.

  6. Selecione o contêiner que você quer desativar.

  7. Em Editar modo do contêiner, selecione Desativado.

  8. Clique em Concluído.

  9. Clique em Salvar.

gcloud

Para desativar contêineres específicos do escalonamento automático vertical de pods, execute as seguintes etapas:

  1. Salve o seguinte manifesto como my-opt-vpa.yaml:

    apiVersion: autoscaling.k8s.io/v1
    kind: VerticalPodAutoscaler
    metadata:
      name: my-opt-vpa
    spec:
      targetRef:
        apiVersion: "apps/v1"
        kind:       Deployment
        name:       my-opt-deployment
      updatePolicy:
        updateMode: "Recreate"
      resourcePolicy:
        containerPolicies:
        - containerName: my-opt-sidecar
          mode: "Off"
    

    Esse manifesto descreve uma VerticalPodAutoscaler. O valor mode: "Off" desativa as recomendações do contêiner my-opt-sidecar.

  2. Aplique o manifesto ao cluster:

    kubectl apply -f my-opt-vpa.yaml
    
  3. Salve o seguinte manifesto como my-opt-deployment.yaml:

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: my-opt-deployment
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: my-opt-deployment
      template:
        metadata:
          labels:
            app: my-opt-deployment
        spec:
          containers:
          - name: my-opt-container
            image: nginx
          - name: my-opt-sidecar
            image: busybox
            command: ["sh","-c","while true; do echo Doing sidecar stuff!; sleep 60; done"]
    
  4. Aplique o manifesto ao cluster:

    kubectl apply -f my-opt-deployment.yaml
    
  5. Após algum tempo, veja o escalonador automático vertical de pods:

    kubectl get vpa my-opt-vpa --output yaml
    

    O resultado mostra recomendações para solicitações de CPU e memória:

    ...
      recommendation:
        containerRecommendations:
        - containerName: my-opt-container
    ...
    

    Nesta saída, há apenas recomendações para um contêiner. Não há recomendações para my-opt-sidecar.

    O escalonador automático vertical de pods nunca atualiza recursos em contêineres desativados. Depois de alguns minutos, o Pod é recriado, mas apenas um contêiner tem as solicitações de recurso atualizadas.

Identificar cargas de trabalho sem solicitações ou limites de recursos

É recomendável identificar cargas de trabalho sem solicitações e limites de recursos configurados porque o GKE recomenda definir solicitações e limites de recursos para todas as cargas de trabalho como uma prática recomendada para evitar o encerramento abrupto do pod sob pressão de recursos do nó e melhorar a precisão da alocação de custos. Definir pods BestEffort ou pods com memória Burstable pode causar problemas de confiabilidade quando um nó sofre pressão de memória. Use as seguintes práticas recomendadas para definir limites e solicitações de recursos do contêiner:

  • Memória: defina a mesma quantidade de memória para a solicitação e o limite.
  • CPU: para a solicitação, especifique a CPU mínima necessária para garantir a operação correta, de acordo com seus próprios SLOs. Defina um limite de CPU sem restrições.

O GKE gera insights e recomendações para cargas de trabalho executadas sem solicitações e limites de recursos.

A tabela a seguir descreve os cenários de configuração de recursos que o GKE detecta e os critérios para cada um deles.

Subtipo de insight Cenário de configurações ausentes Detalhes
REQUEST_OR_LIMIT_NOT_SET Nenhuma solicitação e limite de memória configurados. (MEMORY_REQUEST_AND_LIMIT_NOT_SET) Os pods estão sendo executados sem solicitações nem limites de memória definidos para os contêineres. O GKE não pode limitar o uso da memória e pode encerrar abruptamente esses pods se um nó sofrer pressão de memória, o que pode causar problemas de confiabilidade.
REQUEST_OR_LIMIT_NOT_SET Nenhum limite de memória configurado. (MEMORY_LIMIT_NOT_SET) Os pods estão sendo executados sem limites de memória definidos para os contêineres. O GKE não pode limitar o uso da memória e pode encerrar abruptamente esses pods se um nó sofrer pressão de memória e o uso de memória dos pods exceder as solicitações, o que pode causar problemas de confiabilidade. Defina a mesma quantidade de memória para solicitações e limites para evitar que os pods usem mais memória do que o solicitado.
REQUEST_OR_LIMIT_NOT_SET Nenhuma solicitação e limite de CPU configurados. (CPU_REQUEST_AND_LIMIT_NOT_SET) Os pods estão sendo executados sem solicitações e limites de CPU definidos para os contêineres. Isso aumenta as chances de esgotamento dos recursos do nó, eleva a probabilidade de limitação dos pods quando o uso da CPU do nó está próximo do limite e pode causar problemas de desempenho.

Para mais informações sobre esses insights, siga as instruções para ver insights e recomendações.

Verificar manualmente solicitações e limites de recursos

Talvez seja necessário revisar manualmente quais solicitações e limites de recursos estão faltando e precisam ser especificados para uma determinada carga de trabalho. Assim, é possível atualizar a configuração conforme recomendado.

Para revisar ou atualizar a configuração de solicitações e limites de recursos de uma carga de trabalho específica, faça o seguinte:

  1. Acesse a página Cargas de trabalho no console Google Cloud .

    Acesse "Cargas de trabalho"

  2. Na lista de cargas de trabalho, clique no nome da carga de trabalho que você quer inspecionar.

  3. Clique em Ações > Escalonar > Editar solicitações de recursos.

    1. A seção Ajustar solicitações e limites de recursos mostra as solicitações atuais de CPU e memória para cada contêiner.

A seguir