Ответ
В 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, чтобы автоматически добавлять реплики при высокой нагрузке, вместо того чтобы полагаться только на жесткие лимиты.