Skip to main content

Limite de Hardware | Kubernetes

  • Limite de Hardware | Kubernetes

O Kubernetes permite gerenciar e limitar o uso de recursos de hardware como CPU, memória e armazenamento, garantindo um uso eficiente do cluster. Esses limites podem ser aplicados a Pods, Containers, ou Namespaces, com configurações que permitem balancear a utilização de recursos e evitar sobrecarga no cluster.


Tipos de Recursos no Kubernetes

Os recursos principais que podem ser limitados são:

  1. CPU:

    • Representada em unidades de "núcleos" ou milicores (m).
      • 1 = 1 núcleo físico/virtual.
      • 100m = 10% de 1 núcleo (0.1 núcleo).
    • O Kubernetes compartilha a CPU entre contêineres conforme necessário.
  2. Memória:

    • Representada em bytes (ou unidades como Mi, Gi, Ki).
      • 1Gi = 1 gibibyte (1024^3 bytes).
      • 512Mi = 512 mebibytes.
  3. Armazenamento:

    • Controlado com volumes e Persistent Volume Claims (PVCs).
    • Pode ser limitado usando classes de armazenamento.
  4. GPU (opcional):

    • Para cargas de trabalho que utilizam GPUs, recursos como nvidia.com/gpu podem ser configurados.

Configurando Limites e Requisições

Os limites são configurados no YAML do Pod ou Deployment usando resources.requests e resources.limits:

  • requests: Quantidade mínima de recursos que o contêiner precisa para ser agendado.
  • limits: Quantidade máxima de recursos que o contêiner pode usar.

Exemplo:

apiVersion: v1
kind: Pod
metadata:
name: exemplo-pod
spec:
containers:
- name: exemplo-container
image: nginx
resources:
requests:
memory: "128Mi"
cpu: "250m"
limits:
memory: "256Mi"
cpu: "500m"

Explicação:

  • requests:
    • O Kubernetes reserva 128Mi de memória e 250m de CPU para este contêiner.
  • limits:
    • O contêiner não pode usar mais do que 256Mi de memória e 500m de CPU.

Limites por Namespace

Você pode aplicar políticas de limite de recursos a um namespace inteiro usando Resource Quotas.

Exemplo de Resource Quota:

apiVersion: v1
kind: ResourceQuota
metadata:
name: exemplo-quota
namespace: exemplo-namespace
spec:
hard:
requests.cpu: "2"
requests.memory: "4Gi"
limits.cpu: "4"
limits.memory: "8Gi"
pods: "10"

Explicação:

  • O namespace exemplo-namespace está limitado a:
    • 2 CPUs solicitadas no total.
    • 4 CPUs no máximo.
    • 4Gi de memória solicitada no total.
    • 8Gi de memória no máximo.
    • 10 Pods no total.

Como o Kubernetes Lida com Limites

  1. Scheduler:

    • O agendador verifica se os nós têm recursos suficientes para atender aos requisitos de requests.
  2. Kubelet:

    • Garante que o contêiner não exceda os limites definidos em limits.
    • Se um contêiner tentar usar mais memória do que o limite, ele será finalizado com erro de OOM (Out of Memory).
    • O uso de CPU acima do limite será controlado (não interrompido).
  3. Eviction:

    • Se um nó estiver com pressão de recursos (como pouca memória disponível), o Kubernetes pode evictar pods com prioridades mais baixas ou que excederam os limites.

Comandos Úteis

  1. Verificar Configuração de Recurso de um Pod:

    kubectl describe pod <pod-name>
  2. Listar Resource Quotas em um Namespace:

    kubectl get resourcequota -n <namespace>
  3. Verificar o Uso Atual de Recursos:

    kubectl describe resourcequota <quota-name> -n <namespace>

Limitações Físicas do Cluster

Além das limitações configuradas para pods e namespaces, o cluster em si possui restrições baseadas no hardware subjacente:

  1. Número de nós:

    • O limite teórico varia dependendo da versão do Kubernetes e do provedor de nuvem.
    • Exemplo: 5.000 nós para clusters gerenciados.
  2. Número de pods por nó:

    • Configurado pelo kubelet com a opção --max-pods.
    • Geralmente, o padrão é 110 pods por nó.
  3. Recursos agregados:

    • A soma de CPU, memória e armazenamento disponíveis nos nós define o limite máximo do cluster.

Práticas Recomendadas

  1. Sempre definir requests e limits:

    • Para evitar competição de recursos e mau comportamento do cluster.
  2. Usar Resource Quotas e Limit Ranges:

    • Aplique quotas para evitar que namespaces ou projetos consumam recursos além do permitido.
  3. Monitoramento:

    • Use ferramentas como Prometheus e Grafana para monitorar o uso de recursos no cluster.
  4. Teste de carga:

    • Teste suas configurações para identificar gargalos e ajustar os limites conforme necessário.

Com essas ferramentas e práticas, você pode garantir que o Kubernetes gerencie eficientemente o hardware disponível e mantenha seu cluster estável e otimizado. 🚀