Ответ
В Kubernetes существует несколько уровней ограничений ресурсов, которые я настраиваю для обеспечения стабильности и эффективности кластера.
1. Ресурсы контейнера (Container Resources): Определяются в спецификации Pod. Это основа для планирования и ограничения потребления.
requests: Минимальные гарантированные ресурсы, которые планировщик (kube-scheduler) резервирует для Pod. Pod не будет размещён на ноде, если она не может удовлетворить эти запросы.limits: Максимально допустимое потребление ресурсов. При превышении:- CPU: Контейнер будет "throttled" (ограничена его доля процессорного времени).
- Память: Контейнер будет завершён с статусом
OOMKilled(Out Of Memory).
apiVersion: v1
kind: Pod
metadata:
name: frontend
spec:
containers:
- name: app
image: nginx:alpine
resources:
requests:
memory: "64Mi"
cpu: "250m" # 250 миллиядер (0.25 ядра)
limits:
memory: "128Mi"
cpu: "500m"
2. Квоты на пространство имён (ResourceQuota): Ограничивают суммарное потребление ресурсов всеми Pod'ами в пределах Namespace. Это предотвращает "захват" всех ресурсов кластера одним проектом или командой.
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-quota
namespace: production
spec:
hard:
requests.cpu: "2"
requests.memory: 4Gi
limits.cpu: "4"
limits.memory: 8Gi
pods: "10" # Ограничение на количество Pod
3. Лимитранг (LimitRange): Задаёт политики по умолчанию, минимумам и максимумам для ресурсов контейнеров в рамках Namespace. Полезен для установки стандартов и предотвращения ошибок конфигурации.
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
spec:
limits:
- default: # Значения по умолчанию, если не указаны
memory: 256Mi
defaultRequest: # request по умолчанию
memory: 128Mi
type: Container
4. Ограничения узла (Node Capacity): Физические или виртуальные ресурсы самой ноды (CPU, память, локальное хранилище). Kubelet сообщает о них в API-сервер. Все Pod'ы, размещённые на ноде, не могут суммарно превысить её capacity.
5. Budget на нарушение работы Pod (PodDisruptionBudget): Хотя это не ограничение ресурсов в классическом понимании, PDB ограничивает количество добровольных нарушений работы (например, при обновлении узла), гарантируя доступность приложения.
На практике я всегда начинаю с настройки requests и limits на уровне Pod, затем добавляю ResourceQuota для изоляции команд и использую LimitRange для enforcement стандартов.