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.
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 para que os recursos criados neste exercício fiquem isolados do restante do seu cluster.
kubectl create namespace cpu-example
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.
O recurso de CPU é medido em unidades de CPU. No Kubernetes, uma CPU equivale a:
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
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 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 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.
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:
Exclua o seu namespace:
kubectl delete namespace cpu-example
Configurar Requisições e Limites de Memória Padrão para um Namespace
Configurar Requisições e Limites de CPU Padrão para um Namespace
Configurar Restrições de Memória Mínima e Máxima para um Namespace
Configurar Restrições de CPU Mínima e Máxima para um Namespace
Redimensionar recursos de CPU e memória atribuídos a contêineres