Что произойдет, если в Kubernetes будет превышен лимит CPU?

«Что произойдет, если в Kubernetes будет превышен лимит CPU?» — вопрос из категории Kubernetes, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Kubernetes управление CPU для контейнеров задается через requests (гарантированная доля) и limits (жесткий предел). Последствия зависят от того, какое из этих значений превышено.

1. Превышение requests (при планировании пода):

  • Если в кластере нет узла с достаточным количеством свободных CPU-ресурсов для удовлетворения requests пода, Pod останется в состоянии Pending.
  • Kube-scheduler не сможет его разместить, пока не освободится место или не будет добавлен новый узел.

2. Превышение limits (во время работы контейнера):

  • Ядро Linux (через механизм CFS — Completely Fair Scheduler) начнет ограничивать (throttle) процесс контейнера.
  • Контейнер не сможет использовать CPU сверх лимита, его производительность упадет, но он не будет убит.
  • Это можно отследить по метрике container_cpu_cfs_throttled_seconds_total в cAdvisor/Prometheus.

Пример манифеста с лимитами:

apiVersion: v1
kind: Pod
metadata:
  name: cpu-demo
spec:
  containers:
  - name: cpu-demo-ctr
    image: vish/stress
    resources:
      requests:
        cpu: "500m"  # 0.5 ядра
      limits:
        cpu: "1"      # 1 ядро
    command: ["stress", "--cpu", "2"] # Попытка использовать 2 ядра

В этом примере контейнер попытается использовать 2 ядра, но будет ограничен одним. Его производительность будет хуже, но он продолжит работу.

На практике мы настраивали HPA (Horizontal Pod Autoscaler) на основе метрик CPU, чтобы автоматически добавлять реплики при высокой нагрузке, вместо того чтобы полагаться только на жесткие лимиты.