Como configurar o escalonamento automático vertical de pods

Nesta página, você aprende a configurar o escalonamento automático vertical de pods em um cluster do Google Kubernetes Engine. O escalonamento automático de pods verticais envolve o ajuste de solicitações de CPU e memória de um pod.

O escalonamento automático vertical de pods é ativado por padrão nos clusters do Autopilot. No entanto, ainda é preciso configurar o escalonador automático vertical de pods para suas cargas de trabalho criando objetos VerticalPodAutoscaler, conforme descrito nas seções a seguir.

Visão geral

Use o recurso personalizado VerticalPodAutoscaler para analisar e ajustar solicitações de CPU e solicitações de memória dos contêineres. Configure um escalonador automático vertical de pods para fazer recomendações para solicitações de CPU e memória ou para fazer alterações automáticas nessas solicitações.

Antes de começar

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

Defina as configurações padrão da gcloud usando um dos métodos a seguir:

  • Use gcloud init se quiser orientações para definir os padrões.
  • Use gcloud config para definir individualmente a região, a zona e o ID do projeto.

Como usar o gcloud init

Se você receber o erro One of [--zone, --region] must be supplied: Please specify location, conclua esta seção.

  1. Execute gcloud init e siga as instruções:

    gcloud init

    Se você estiver usando SSH em um servidor remoto, utilize a sinalização --console-only para impedir que o comando inicie um navegador:

    gcloud init --console-only
  2. Siga as instruções para autorizar a gcloud a usar sua conta do Google Cloud.
  3. Crie uma nova configuração ou selecione uma atual.
  4. Escolha um projeto do Google Cloud.
  5. Escolha uma zona padrão do Compute Engine para clusters zonais ou uma região para clusters regionais ou de Autopilot.

Como usar o gcloud config

  • Defina o ID do projeto padrão:
    gcloud config set project PROJECT_ID
  • Se você estiver trabalhando com clusters zonais, defina a zona do Compute padrão:
    gcloud config set compute/zone COMPUTE_ZONE
  • Se você estiver trabalhando com clusters de Autopilot ou regionais, defina a região do Compute padrão:
    gcloud config set compute/region COMPUTE_REGION
  • Atualize gcloud para a versão mais recente:
    gcloud components update

Observação sobre as versões da API

Este guia pressupõe que você tenha a versão v1 da API VerticalPodAutoscaler instalada em seu cluster do Google Kubernetes Engine. Ela está disponível na versão 1.14.7-gke.10 ou superior e em 1.15.4-gke.15 ou superior.

É recomendada a utilização dessa API. Para instruções sobre como migrar de versões mais antigas da API, consulte o guia de migração.

Como ativar o escalonamento automático vertical de pods em um cluster

Para criar um novo cluster com escalonamento automático de pod vertical ativado, insira este comando:

gcloud container clusters create CLUSTER_NAME \
    --enable-vertical-pod-autoscaling --cluster-version=1.14.7

Substitua CLUSTER_NAME pelo nome do novo cluster.

Para ativar o escalonamento automático de pods verticais para um cluster atual, digite este comando:

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

Substitua CLUSTER_NAME pelo nome do cluster.

Ativar ou desativar o escalonamento automático vertical de pods causa uma reinicialização do plano de controle.

Como receber recomendações de recursos

Neste exercício, você cria um objeto VerticalPodAutoscaler que tem um updateMode de "Off". Em seguida, cria uma implantação que tem dois pods, cada um com um contêiner. Quando os pods são criados, o escalonador automático vertical de pods analisa as necessidades de CPU e memória dos contêineres e registra essas recomendações em seu campo status. O escalonador automático vertical de pods não executa qualquer ação para atualizar as solicitações de recursos para os contêineres em execução.

Veja aqui um manifesto do objeto VerticalPodAutoscaler:

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"

Salve o manifesto em um arquivo chamado my-rec-vpa.yaml e crie o objeto VerticalPodAutoscaler:

kubectl create -f my-rec-vpa.yaml

Veja aqui um manifesto do Deployment:

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

No manifesto, você vê que não há solicitações de CPU ou memória. Também é possível ver que os pods no implantação pertencem ao VerticalPodAutoscaler, porque ele aponta para o destino de kind: Deployment e name: my-rec-deployment.

Copie o manifesto em um arquivo denominado my-rec-deployment.yaml e crie a implantação:

kubectl create -f my-rec-deployment.yaml

Aguarde um minuto e visualize o escalonador automático vertical de pods:

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

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

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

Agora que você tem as solicitações de CPU e memória recomendadas, pode optar por excluir a implantação, adicionar solicitações de CPU e memória ao manifesto de implantação e reiniciar sua implantação.

Como desativar contêineres específicos

Neste exercício, você criará um objeto VerticalPodAutoscaler com um contêiner específico desativado. Depois criará uma implantação com um Pod com dois contêineres. Quando o pod é criado, o escalonador automático vertical de pods cria e aplica uma recomendação apenas para um único contêiner, ignorando aquele que foi desativado.

Veja aqui um manifesto do objeto VerticalPodAutoscaler:

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"

Observe que o VerticalPodAutoscaler tem mais informações na seção resourcePolicy. mode "Off" desativa as recomendações para contêineres com nomes especificados, neste caso, my-opt-sidecar.

Salve o manifesto em um arquivo chamado my-opt-vpa.yaml e crie o VerticalPodAutoscaler:

kubectl create -f my-opt-vpa.yaml

Veja aqui um manifesto da implantação:

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"]

Copie o manifesto em um arquivo denominado my-opt-deployment.yaml e crie a implantação:

kubectl create -f my-opt-deployment.yaml

Aguarde um minuto e visualize 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
...

Observe que há recomendações apenas para um contêiner. Não há recomendações para my-opt-sidecar devido à desativação do contêiner.

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.

Como atualizar solicitações de recursos automaticamente

Neste exercício, você cria uma implantação com dois pods. Cada pod tem um contêiner que solicita 100 milliCPU e 50 mebibytes de memória. Em seguida, você criará um objeto VerticalPodAutoscaler que ajusta automaticamente as solicitações de CPU e de memória.

Veja aqui um manifesto do Deployment:

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: k8s.gcr.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"]

Copie o manifesto em um arquivo denominado my-auto-deployment.yaml e crie a implantação:

kubectl create -f my-auto-deployment.yaml

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

Anote os nomes dos pods para uso posterior.

As solicitações de CPU e memória para a implantação são muito pequenas. Portanto, é provável que a implantação se beneficie de um aumento nos recursos.

Veja um manifesto de um VerticalPodAutoscaler:

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"

No manifesto, o campo targetRef informa que qualquer pod controlado por uma implantação denominada my-deployment pertence a este escalonador automático vertical de pods.

O campo updateMode tem um valor Auto, o que significa que o escalonador automático vertical de pods pode atualizar solicitações de CPU e memória durante a vida útil de um pod. Em outras palavras, o 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.

Copie o manifesto em um arquivo chamado my-vpa.yaml e crie o VerticalPodAutoscaler:

kubectl create -f my-vpa.yaml

Aguarde alguns minutos e veja os pods em execução novamente:

kubectl get pods

Observe que os nomes do pod foram alterados. Se os nomes do pod ainda não tiverem mudado, aguarde mais um pouco e liste os pods em execução novamente.

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 seus pods.

Na saída, veja que o escalonador automático vertical de pods aumentou as solicitações de memória e de CPU. Também é possível ver uma anotação que documenta a atualização:

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

Receba informações detalhadas sobre o escalonador automático vertical de pods:

kubectl get vpa my-vpa --output yaml

A saída mostra três conjuntos de recomendações para solicitações de CPU e de memória: limite inferior, destino e limite superior:

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

A recomendação target informa que o contêiner funcionará de maneira ideal se solicitar 587 milliCPU e 262.144 kilobytes de memória.

O escalonador automático vertical de pods usa as recomendações lowerBound e upperBound para decidir se exclui um pod e o substitui por um novo. 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 tenha a recomendação de destino.

Limpeza

Desative o escalonamento automático vertical de pods:

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

Substitua CLUSTER_NAME pelo nome do cluster.

Como opção, exclua o cluster.

A seguir