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 do 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 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 gcloud components update.

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 do Google Cloud, o Cloud Monitoring ou a Google Cloud CLI.

Console

Para visualizar as solicitações de recursos sugeridas no Console do Google Cloud, é preciso ter uma carga de trabalho atual implantada com pelo menos 24 horas de idade. 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 do 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 Explorador de métricas no console do 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 a Google Cloud CLI ou o Console do Google Cloud.

Console

  1. Acesse a página Cargas de trabalho no console do 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.

gcloud

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
    

Também é possível aplicar alterações manualmente seguindo estas etapas:

  1. Acesse a página Cargas de trabalho no console do 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.

  4. Configure as solicitações de contêiner.

  5. Clique em Ver YAML equivalente.

  6. Clique em Fazer download da carga de trabalho ou copie e cole o manifesto em um arquivo chamado resource-adjusted.yaml.

  7. Aplique o manifesto ao cluster:

    kubectl create -f resource-adjusted.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 do Google 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 do Google Kubernetes Engine no console do Google Cloud.

    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 console do Google Cloud.

    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.1
            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: "Auto"
    

    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: Auto: 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.

    Também é possível configurar o escalonamento automático vertical de pods para atribuir solicitações de recursos apenas no momento da criação do pod, usando updateMode: "Initial".

  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 do 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 do Google Kubernetes Engine no console do Google Cloud.

    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 console do Google Cloud.

    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: "Auto"
      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.

A seguir