Atribuir Recursos de CPU a Contêineres e Pods

Atribuir Recursos de CPU a Contêineres e Pods

Esta página mostra como atribuir uma requisição de CPU e um limite de CPU a um contêiner. Contêineres não podem usar mais CPU do que o limite configurado. Desde que o sistema tenha tempo de CPU livre, um contêiner tem garantida a alocação de tanta CPU quanto requisita.

Antes de você começar

Você precisa ter um cluster do Kubernetes e a ferramenta de linha de comando kubectl deve estar configurada para se comunicar com seu cluster. É recomendado executar esse tutorial em um cluster com pelo menos dois nós que não estejam atuando como hosts de camada de gerenciamento. Se você ainda não possui um cluster, pode criar um usando o minikube ou pode usar um dos seguintes ambientes:

Para verificar a versão, digite kubectl version.

O seu cluster precisa ter pelo menos 1 CPU disponível para executar os exemplos desta tarefa.

Algumas das etapas desta página exigem que você execute o serviço metrics-server no seu cluster. Se o metrics-server já estiver em execução, você pode pular essas etapas.

Se você estiver usando o Minikube, execute o seguinte comando para habilitar o metrics-server:

minikube addons enable metrics-server

Para verificar se o metrics-server, ou outro provedor da API de métricas de recursos (metrics.k8s.io), está em execução, execute o seguinte comando:

kubectl get apiservices

Se a API de métricas de recursos estiver disponível, a saída incluirá uma referência a metrics.k8s.io.

NAME
v1beta1.metrics.k8s.io

Crie um namespace

Crie um Namespace para que os recursos criados neste exercício fiquem isolados do restante do seu cluster.

kubectl create namespace cpu-example

Especifique uma requisição e um limite de CPU

Para especificar uma requisição de CPU para um contêiner, inclua o campo resources.requests.cpu no manifesto de recursos do contêiner. Para especificar um limite de CPU, inclua resources.limits.cpu.

Neste exercício, você cria um Pod que tem um contêiner. O contêiner tem uma requisição de 0,5 CPU e um limite de 1 CPU. Este é o arquivo de configuração do Pod:

apiVersion: v1
kind: Pod
metadata:
  name: cpu-demo
  namespace: cpu-example
spec:
  containers:
  - name: cpu-demo-ctr
    image: vish/stress
    resources:
      limits:
        cpu: "1"
      requests:
        cpu: "0.5"
    args:
    - -cpus
    - "2"

A seção args do arquivo de configuração fornece argumentos para o contêiner quando ele inicia. O argumento -cpus "2" instrui o contêiner a tentar usar 2 CPUs.

Crie o Pod:

kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit.yaml --namespace=cpu-example

Verifique se o Pod está em execução:

kubectl get pod cpu-demo --namespace=cpu-example

Veja informações detalhadas sobre o Pod:

kubectl get pod cpu-demo --output=yaml --namespace=cpu-example

A saída mostra que o único contêiner do Pod tem uma requisição de CPU de 500 miliCPU e um limite de CPU de 1 CPU.

resources:
  limits:
    cpu: "1"
  requests:
    cpu: 500m

Use kubectl top para obter as métricas do Pod:

kubectl top pod cpu-demo --namespace=cpu-example

Este exemplo de saída mostra que o Pod está usando 974 miliCPU, um pouco menos do que o limite de 1 CPU especificado na configuração do Pod.

NAME                        CPU(cores)   MEMORY(bytes)
cpu-demo                    974m         <something>

Lembre-se de que, ao definir -cpu "2", você configurou o contêiner para tentar usar 2 CPUs, mas o contêiner só tem permissão para usar cerca de 1 CPU. O uso de CPU do contêiner está sendo limitado (throttling), porque o contêiner está tentando usar mais recursos de CPU do que o seu limite.

Nota:

Outra explicação possível para o uso de CPU abaixo de 1,0 é que o nó pode não ter recursos de CPU suficientes disponíveis. Lembre-se de que os pré-requisitos deste exercício exigem que o seu cluster tenha pelo menos 1 CPU disponível para uso. Se o seu contêiner for executado em um nó que tem apenas 1 CPU, o contêiner não pode usar mais do que 1 CPU, independentemente do limite de CPU especificado para o contêiner.

Unidades de CPU

O recurso de CPU é medido em unidades de CPU. No Kubernetes, uma CPU equivale a:

  • 1 vCPU da AWS
  • 1 Core do GCP
  • 1 vCore do Azure
  • 1 Hyperthread em um processador Intel com Hyperthreading em um servidor dedicado

Valores fracionários são permitidos. Um contêiner que requisita 0,5 CPU tem garantida a metade da CPU de um contêiner que requisita 1 CPU. Você pode usar o sufixo m para indicar mili. Por exemplo, 100m CPU, 100 miliCPU e 0,1 CPU são a mesma coisa. Não é permitida uma precisão menor do que 1m.

A CPU é sempre requisitada como uma quantidade absoluta, nunca como uma quantidade relativa; 0,1 é a mesma quantidade de CPU em uma máquina com um, dois ou 48 núcleos.

Exclua o seu Pod:

kubectl delete pod cpu-demo --namespace=cpu-example

Especifique uma requisição de CPU grande demais para os seus nós

Requisições e limites de CPU são associados a contêineres, mas é útil pensar em um Pod como tendo uma requisição e um limite de CPU. A requisição de CPU de um Pod é a soma das requisições de CPU de todos os contêineres do Pod. Da mesma forma, o limite de CPU de um Pod é a soma dos limites de CPU de todos os contêineres do Pod.

A alocação de Pods é baseada nas requisições. Um Pod só é alocado para execução em um nó se o nó tiver recursos de CPU disponíveis suficientes para atender à requisição de CPU do Pod.

Neste exercício, você cria um Pod com uma requisição de CPU tão grande que excede a capacidade de qualquer nó do seu cluster. Este é o arquivo de configuração de um Pod que tem um contêiner. O contêiner requisita 100 CPUs, o que provavelmente excede a capacidade de qualquer nó do seu cluster.

apiVersion: v1
kind: Pod
metadata:
  name: cpu-demo-2
  namespace: cpu-example
spec:
  containers:
  - name: cpu-demo-ctr-2
    image: vish/stress
    resources:
      limits:
        cpu: "100"
      requests:
        cpu: "100"
    args:
    - -cpus
    - "2"

Crie o Pod:

kubectl apply -f https://k8s.io/examples/pods/resource/cpu-request-limit-2.yaml --namespace=cpu-example

Veja o status do Pod:

kubectl get pod cpu-demo-2 --namespace=cpu-example

A saída mostra que o status do Pod é Pending. Ou seja, o Pod não foi alocado para execução em nenhum nó e permanecerá no estado Pending indefinidamente:

NAME         READY     STATUS    RESTARTS   AGE
cpu-demo-2   0/1       Pending   0          7m

Veja informações detalhadas sobre o Pod, incluindo os eventos:

kubectl describe pod cpu-demo-2 --namespace=cpu-example

A saída mostra que o contêiner não pode ser alocado por falta de recursos de CPU suficientes nos nós:

Events:
  Reason                        Message
  ------                        -------
  FailedScheduling      No nodes are available that match all of the following predicates:: Insufficient cpu (3).

Exclua o seu Pod:

kubectl delete pod cpu-demo-2 --namespace=cpu-example

Se você não especificar um limite de CPU

Se você não especificar um limite de CPU para um contêiner, uma das seguintes situações se aplica:

  • O contêiner não tem um limite superior para os recursos de CPU que pode usar. O contêiner pode usar todos os recursos de CPU disponíveis no nó em que está sendo executado.

  • O contêiner está em execução em um namespace que tem um limite de CPU padrão, e o limite padrão é atribuído automaticamente ao contêiner. Administradores de cluster podem usar um LimitRange para especificar um valor padrão para o limite de CPU.

Se você especificar um limite de CPU, mas não especificar uma requisição de CPU

Se você especificar um limite de CPU para um contêiner, mas não especificar uma requisição de CPU, o Kubernetes atribui automaticamente uma requisição de CPU igual ao limite. Da mesma forma, se um contêiner especificar o seu próprio limite de memória, mas não especificar uma requisição de memória, o Kubernetes atribui automaticamente uma requisição de memória igual ao limite.

Motivação para requisições e limites de CPU

Ao configurar requisições e limites de CPU para os contêineres que são executados no seu cluster, você pode fazer uso eficiente dos recursos de CPU disponíveis nos nós do seu cluster. Ao manter baixa a requisição de CPU de um Pod, você dá ao Pod uma boa chance de ser alocado. Ao ter um limite de CPU maior do que a requisição de CPU, você consegue duas coisas:

  • O Pod pode ter picos de atividade em que utiliza os recursos de CPU que estiverem disponíveis no momento.
  • A quantidade de recursos de CPU que um Pod pode usar durante um pico fica limitada a um valor razoável.

Limpeza

Exclua o seu namespace:

kubectl delete namespace cpu-example

Próximos passos

Para desenvolvedores de aplicações

Para administradores de cluster

Última modificação November 04, 2026 at 2:56 AM PST: [pt-br] Add tasks/configure-pod-container/assign-cpu-resource.md (6a1cadfba3)