Dimensione os pedidos e os limites de recursos de contentores

Esta página explica como pode analisar e ajustar os pedidos de CPU e os pedidos de memória de um contentor num cluster do Google Kubernetes Engine (GKE) através da escala automática vertical de pods.

Pode dimensionar os recursos do contentor manualmente através da Google Cloud consola, analisar os recursos com um objeto VerticalPodAutoscaler ou configurar o dimensionamento automático com o dimensionamento automático vertical de pods.

Antes de começar

Antes de começar, certifique-se de que realizou as seguintes tarefas:

  • Ative a API Google Kubernetes Engine.
  • Ative a API Google Kubernetes Engine
  • Se quiser usar a CLI gcloud para esta tarefa, instale-a e, em seguida, inicialize-a. Se instalou anteriormente a CLI gcloud, execute o comando gcloud components update para obter a versão mais recente. As versões anteriores da CLI gcloud podem não suportar a execução dos comandos neste documento.

Analise pedidos de recursos

O Vertical Pod Autoscaler analisa automaticamente os seus contentores e fornece pedidos de recursos sugeridos. Pode ver estes pedidos de recursos através daGoogle Cloud consola, do Cloud Monitoring ou da CLI do Google Cloud.

Consola

Para ver os pedidos de recursos sugeridos na Google Cloud consola, tem de ter uma carga de trabalho implementada existente com, pelo menos, 24 horas. Algumas sugestões podem não estar disponíveis ou ser relevantes para determinadas cargas de trabalho, como as criadas nas últimas 24 horas, os pods autónomos e as apps escritas em Java.

  1. Aceda à página Workloads na Google Cloud consola.

    Aceda a Cargas de trabalho

  2. Na lista de cargas de trabalho, clique no nome da carga de trabalho que quer dimensionar.

  3. Clique em Ações > Escalar > Editar pedidos de recursos.

    A secção Dados de utilização de recursos de análise mostra dados de utilização do histórico que o controlador do redimensionador automático vertical de pods analisou para criar os pedidos de recursos sugeridos na secção Ajustar pedidos e limites de recursos.

Cloud Monitoring

Para ver os pedidos de recursos sugeridos no Cloud Monitoring, tem de ter uma carga de trabalho implementada.

  1. Aceda à página Explorador de métricas na Google Cloud consola.

    Aceda ao Metrics Explorer

  2. Clique em Configuração.

  3. Expanda o menu Selecionar uma métrica.

  4. No menu Recurso, selecione Kubernetes Scale.

  5. No menu Categoria de métricas, selecione Ajustador automático.

  6. No menu Métrica, selecione Bytes de pedidos por réplica recomendados e Núcleo de pedidos por réplica recomendado.

  7. Clique em Aplicar.

CLI gcloud

Para ver os pedidos de recursos sugeridos, tem de criar um VerticalPodAutoscaler objeto e uma implementação.

  1. Para clusters Standard, ative a escala automática vertical de pods para o seu cluster. Para clusters do Autopilot, a escala automática vertical de pods está ativada por predefinição.

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

    Substitua CLUSTER_NAME pelo nome do seu cluster.

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

    Este manifesto descreve um Deployment que não tem pedidos de CPU ou memória. O valor containers.name de my-rec-deployment especifica que todos os pods na implementação pertencem ao VerticalPodAutoscaler.

  3. Aplique o manifesto ao cluster:

    kubectl create -f my-rec-deployment.yaml
    
  4. Guarde 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"
    

    Este manifesto descreve um VerticalPodAutoscaler. O valor updateMode de Off significa que, quando os pods são criados, o controlador da escala automática vertical de pods analisa as necessidades de CPU e memória dos contentores e regista essas recomendações no campo status do recurso. O controlador Vertical Pod Autoscaler não atualiza automaticamente os pedidos de recursos para contentores em execução.

  5. Aplique o manifesto ao cluster:

    kubectl create -f my-rec-vpa.yaml
    
  6. Após algum tempo, veja o VerticalPodAutoscaler:

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

    O resultado é semelhante ao seguinte:

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

    Este resultado mostra recomendações para pedidos de CPU e memória.

Defina manualmente os pedidos de recursos de pods

Pode definir pedidos de recursos de pods manualmente através da Google Cloud consola ou do kubectl. Use as seguintes práticas recomendadas para definir os pedidos e os limites de recursos do contentor:

  • Memória: defina a mesma quantidade de memória para o pedido e o limite.
  • CPU: para o pedido, especifique a CPU mínima necessária para garantir o funcionamento correto, de acordo com os seus próprios SLOs. Defina um limite de CPU ilimitado.

Consola

  1. Aceda à página Workloads na Google Cloud consola.

    Aceda a Cargas de trabalho

  2. Na lista de cargas de trabalho, clique no nome da carga de trabalho que quer dimensionar.

  3. Clique em Ações > Escalar > Editar pedidos de recursos.

    1. A secção Ajuste os pedidos e os limites de recursos mostra os pedidos atuais de CPU e memória para cada contentor, bem como os pedidos de CPU e memória sugeridos.
  4. Clique em Aplicar sugestões mais recentes para ver os pedidos sugeridos para cada contentor.

  5. Clique em Guardar alterações.

  6. Clique em Confirm.

kubectl

Escalonar verticalmente a carga de trabalho com a mínima interrupção

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

Para usar o comando kubectl patch, especifique o pedido de recurso atualizado na flag --patch. Por exemplo, para dimensionar 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"}}}]}}'

Dimensione verticalmente a sua carga de trabalho

Para definir pedidos de recursos para um agrupamento, defina os valores requests.cpu e memory.cpu no manifesto de implementação. Neste exemplo, modifica manualmente a Implementação criada em Analisar pedidos de recursos com pedidos de recursos sugeridos.

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

    Este manifesto descreve uma implementação que tem dois pods. Cada pod tem um contentor que pede 25 milicpus e 256 mib de memória.

  2. Aplique o manifesto ao cluster:

    kubectl apply -f my-adjusted-deployment.yaml
    

Defina pedidos de recursos de pods automaticamente

A escala automática vertical de pods usa o objeto VerticalPodAutoscaler para definir automaticamente pedidos de recursos em pods quando o updateMode é Auto. Pode configurar um VerticalPodAutoscaler através da CLI gcloud ou da consolaGoogle Cloud .

Consola

Para definir pedidos de recursos automaticamente, tem de ter um cluster com a funcionalidade de escala automática vertical de pods ativada. Os clusters do Autopilot têm a funcionalidade de escala automática vertical de pods ativada por predefinição.

Ative a escala automática vertical de pods

  1. Aceda à página do Google Kubernetes Engine na Google Cloud consola.

    Aceda ao Google Kubernetes Engine

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

  3. Na secção Automatização, clique em Editar para a opção Escala automática vertical de pods.

  4. Selecione a caixa de verificação Ativar a escala automática vertical de pods.

  5. Clique em Guardar alterações.

Configure a escala automática vertical de pods

  1. Aceda à página Workloads na Google Cloud consola.

    Aceda a Cargas de trabalho

  2. Na lista de cargas de trabalho, clique no nome da implementação para a qual quer configurar o ajuste automático vertical de pods.

  3. Clique em Ações > Escala automática > Escala automática vertical de pods.

  4. Escolha um modo de ajuste de escala automático:

    • Modo automático: a escala automática vertical de pods atualiza os pedidos de CPU e memória durante a vida útil de um pod.
    • Modo inicial: a escala automática vertical de pods atribui pedidos de recursos apenas na criação de pods e nunca os altera posteriormente.
  5. (Opcional) Defina políticas de contentores. Esta opção permite-lhe garantir que a recomendação nunca é definida acima ou abaixo de um pedido de recurso especificado.

    1. Clique em Adicionar política.
    2. Selecione Automático para Modo de edição do contentor.
    3. Em Recursos controlados, selecione os recursos nos quais quer dimensionar automaticamente o contentor.
    4. Clique em Adicionar regra para definir um ou mais intervalos mínimos ou máximos para os pedidos de recursos do contentor:
      • Memória mín. permitida: a quantidade mínima de memória que o contentor deve ter sempre, em MiB.
      • CPU mínima permitida: a quantidade mínima de CPU que o contentor deve ter sempre, em mCPU.
      • Memória máxima permitida: a quantidade máxima de memória que o contentor deve ter sempre, em MiB.
      • CPU máx. permitida: a quantidade máxima de CPU que o contentor deve ter sempre, em mCPU.
  6. Clique em Concluído.

  7. Clique em Guardar.

gcloud

Para definir pedidos de recursos automaticamente, tem de usar um cluster com a funcionalidade de escala automática vertical de pods ativada. Os clusters do Autopilot têm a funcionalidade ativada por predefinição.

  1. Para clusters padrão, ative a escala automática vertical de pods para o seu cluster:

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

    Substitua CLUSTER_NAME pelo nome do seu cluster.

  2. Guarde 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"]
    

    Este manifesto descreve uma implementação que tem dois pods. Cada pod tem um contentor que pede 100 miliCPU e 50 MiB de memória.

  3. Aplique o manifesto ao cluster:

    kubectl create -f my-auto-deployment.yaml
    
  4. Apresente 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. Guarde 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 implementação denominada my-deployment pertence a este VerticalPodAutoscaler.
    • updateMode: "Recreate": especifica que o controlador da escala automática vertical de pods pode eliminar um pod, ajustar os pedidos de CPU e memória e, em seguida, iniciar um novo pod. Este é o comportamento predefinido se não for especificado nenhum modo (também denominado modo Auto). Também pode alterar o modo de atualização para um dos seguintes valores:
      • updateMode: "Initial": a escala automática vertical de pods atribui pedidos de recursos apenas no momento da criação do pod.
      • updateMode: "InPlaceOrRecreate" (Pré-visualização): a escala automática vertical de pods tenta atualizar os recursos sem recriar o pod, recorrendo à 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
    

    O resultado 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 sido alterados, aguarde mais um pouco e, em seguida, veja novamente os pods em execução.

Veja informações sobre um Vertical Pod Autoscaler

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

  1. Obtenha informações detalhadas acerca de um dos seus pods em execução:

    kubectl get pod POD_NAME --output yaml
    

    Substitua POD_NAME pelo nome de um dos seus Pods que obteve no passo anterior.

    O resultado é semelhante ao seguinte:

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

    Este resultado mostra que o controlador da escala automática vertical de pods tem um pedido de memória de 262144k e um pedido de CPU de 510 milicpus.

  2. Receba informações detalhadas sobre o VerticalPodAutoscaler:

    kubectl get vpa my-vpa --output yaml
    

    O resultado é semelhante ao seguinte:

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

    Este resultado mostra recomendações para pedidos de CPU e memória, e inclui as seguintes propriedades:

    • target: especifica que, para o contentor ser executado de forma ideal,deve pedir 587 milicpus e 262 144 kilobytes de memória.
    • lowerBound e upperBound: a escala automática vertical de pods usa estas propriedades para decidir se deve eliminar um pod e substituí-lo por um novo pod. Se um pod tiver pedidos inferiores ao limite inferior ou superiores ao limite superior, o redimensionador automático vertical de pods elimina o pod e substitui-o por um pod que cumpre o atributo de destino.

Desative contentores específicos

Pode desativar a opção de dimensionamento automático de pods vertical para contentores específicos através da CLI gcloud ou da consola Google Cloud .

Consola

Para desativar a escala automática vertical de pods para contentores específicos, tem de ter um cluster com a funcionalidade de escala automática vertical de pods ativada. Os clusters do Autopilot têm a funcionalidade de escala automática vertical de pods ativada por predefinição.

Ative a escala automática vertical de pods

  1. Aceda à página do Google Kubernetes Engine na Google Cloud consola.

    Aceda ao Google Kubernetes Engine

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

  3. Na secção Automatização, clique em Editar para a opção Escala automática vertical de pods.

  4. Selecione a caixa de verificação Ativar a escala automática vertical de pods.

  5. Clique em Guardar alterações.

Configure a escala automática vertical de pods

  1. Aceda à página Workloads na Google Cloud consola.

    Aceda a Cargas de trabalho

  2. Na lista de cargas de trabalho, clique no nome da implementação para a qual quer configurar o ajuste automático vertical de pods.

  3. Clique em Ações > Escala automática > Escala automática vertical de pods.

  4. Escolha um modo de ajuste de escala automático:

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

  6. Selecione o contentor que quer desativar.

  7. Para Editar modo de contentor, selecione Desativado.

  8. Clique em Concluído.

  9. Clique em Guardar.

gcloud

Para desativar a escala automática vertical de pods para contentores específicos, siga os passos abaixo:

  1. Guarde 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"
    

    Este manifesto descreve um VerticalPodAutoscaler. O valor mode: "Off" desativa as recomendações para o contentor my-opt-sidecar.

  2. Aplique o manifesto ao cluster:

    kubectl apply -f my-opt-vpa.yaml
    
  3. Guarde 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 redimensionador automático vertical de pods:

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

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

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

    Neste resultado, existem apenas recomendações para um contentor. Não existem recomendações para my-opt-sidecar.

    A escala automática vertical de pods nunca atualiza os recursos em contentores desativados. Se aguardar alguns minutos, o pod é recriado, mas apenas um contentor tem pedidos de recursos atualizados.

Identifique cargas de trabalho sem pedidos ou limites de recursos

Pode querer identificar cargas de trabalho sem limites e pedidos de recursos configurados porque o GKE recomenda definir limites e pedidos de recursos para todas as cargas de trabalho como uma prática recomendada para evitar o encerramento abrupto de pods sob pressão de recursos de nós e melhorar a precisão da atribuição de custos. A definição de pods BestEffort ou pods com memória Burstable pode originar problemas de fiabilidade quando um nó sofre pressão de memória. Use as seguintes práticas recomendadas para definir os pedidos e os limites de recursos do contentor:

  • Memória: defina a mesma quantidade de memória para o pedido e o limite.
  • CPU: para o pedido, especifique a CPU mínima necessária para garantir o funcionamento correto, de acordo com os seus próprios SLOs. Defina um limite de CPU ilimitado.

O GKE gera estatísticas e recomendações para cargas de trabalho em execução sem pedidos e limites de recursos.

A tabela seguinte descreve os cenários de configuração de recursos que o GKE deteta e os critérios para cada cenário.

Subtipo de estatísticas Cenário de definições em falta Detalhes
REQUEST_OR_LIMIT_NOT_SET Nenhum pedido nem limite de memória configurado. (MEMORY_REQUEST_AND_LIMIT_NOT_SET) Os pods estão a ser executados sem pedidos de memória e limites definidos para os respetivos contentores. O GKE não pode limitar a utilização de memória e pode terminar abruptamente esses pods se um nó sofrer pressão de memória, o que pode causar problemas de fiabilidade.
REQUEST_OR_LIMIT_NOT_SET Não existem limites de memória configurados. (MEMORY_LIMIT_NOT_SET) Os pods estão a ser executados sem limites de memória definidos para os respetivos contentores. O GKE não pode limitar a utilização de memória e pode terminar abruptamente esses pods se um nó sofrer pressão de memória e a utilização de memória dos pods exceder os pedidos, o que pode causar problemas de fiabilidade. Deve definir a mesma quantidade de memória para pedidos e limites para evitar que os agrupamentos usem mais memória do que a pedida.
REQUEST_OR_LIMIT_NOT_SET Nenhum pedido e limite de CPU configurados. (CPU_REQUEST_AND_LIMIT_NOT_SET) Os pods estão a ser executados sem pedidos de CPU e limites definidos para contentores. Isto aumenta as probabilidades de esgotamento dos recursos dos nós, torna os pods mais propensos a serem limitados quando a utilização da CPU do nó está perto do limite e pode causar problemas de desempenho.

Para mais informações sobre estas estatísticas, siga as instruções para ver estatísticas e recomendações.

Verifique manualmente os pedidos e os limites de recursos

Pode querer rever manualmente os pedidos e os limites de recursos em falta e que têm de ser especificados para uma determinada carga de trabalho, de modo a poder atualizar a configuração conforme recomendado.

Para rever ou atualizar a configuração de pedidos e limites de recursos para uma carga de trabalho especificada, faça o seguinte:

  1. Aceda à página Workloads na Google Cloud consola.

    Aceda a Cargas de trabalho

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

  3. Clique em Ações > Dimensionar > Editar pedidos de recursos.

    1. A secção Ajuste os pedidos e os limites de recursos mostra os pedidos atuais de CPU e memória para cada contentor.

O que se segue?