Без ограничений ресурсов один «жадный» контейнер может съесть всю память узла и убить остальные поды. Requests и Limits — механизм честного распределения CPU и памяти в кластере.
requests: гарантированные ресурсы
Request — минимальный объём ресурсов, который K8s гарантирует контейнеру. Scheduler использует requests для принятия решения, на какой узел поставить Pod.
Если Pod запрашивает 500m CPU и 256Mi RAM →
Scheduler ищет узел, где есть хотя бы 500m CPU и 256Mi RAM свободно
Request — это резервирование. Даже если контейнер использует меньше, эти ресурсы «зарезервированы» для него.
limits: максимальные ресурсы
Limit — потолок потребления. Контейнер не может превысить лимит.
- CPU Limit: если процесс хочет больше, он получает throttling (замедление). Pod не убивается.
- Memory Limit: если процесс превышает лимит памяти, он получает OOMKilled (Out Of Memory, Pod перезапускается).
CPU и Memory: единицы измерения
CPU
CPU измеряется в millicores (m):
| Запись | Значение |
|---|---|
1 или 1000m |
1 ядро CPU |
500m |
0.5 ядра |
100m |
0.1 ядра |
250m |
25% одного ядра |
resources:
requests:
cpu: "100m" # 0.1 ядра гарантировано
limits:
cpu: "500m" # максимум 0.5 ядра
Memory
| Запись | Значение |
|---|---|
128Mi |
128 мебибайт |
1Gi |
1 гибибайт (≈ 1.07 GB) |
512M |
512 мегабайт (используй Mi, не M) |
resources:
requests:
memory: "128Mi"
limits:
memory: "256Mi"
Полный YAML с ресурсами
# deployment-with-resources.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: api-server
spec:
replicas: 3
selector:
matchLabels:
app: api-server
template:
metadata:
labels:
app: api-server
spec:
containers:
- name: api
image: my-api:1.0
ports:
- containerPort: 8000
resources:
requests:
cpu: "200m"
memory: "256Mi"
limits:
cpu: "1000m"
memory: "512Mi"
- name: sidecar-proxy
image: envoy:v1.28
resources:
requests:
cpu: "50m"
memory: "64Mi"
limits:
cpu: "200m"
memory: "128Mi"
QoS классы: Guaranteed, Burstable, BestEffort
K8s автоматически присваивает каждому Pod класс QoS (Quality of Service). Это влияет на порядок вытеснения при нехватке ресурсов на узле.
Guaranteed
Requests == Limits для всех контейнеров и для CPU, и для Memory. Самый высокий приоритет — вытесняется последним.
resources:
requests:
cpu: "500m"
memory: "256Mi"
limits:
cpu: "500m" # равно requests
memory: "256Mi" # равно requests
Burstable
Есть хотя бы один limits или requests, но они не равны. Средний приоритет.
resources:
requests:
cpu: "100m"
memory: "128Mi"
limits:
cpu: "500m"
memory: "512Mi"
BestEffort
Не задано ни requests, ни limits. Самый низкий приоритет — вытесняется первым при нехватке ресурсов.
# resources не указаны вообще
containers:
- name: app
image: my-app:1.0
Никогда не используй BestEffort в production.
Проверка использования ресурсов
# Потребление ресурсов подами
kubectl top pods
# NAME CPU(cores) MEMORY(bytes)
# api-server-abc123 185m 243Mi
# api-server-def456 210m 198Mi
# Потребление ресурсов узлами
kubectl top nodes
# NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
# node-1 1250m 31% 4192Mi 52%
# node-2 890m 22% 3100Mi 38%
# Детальная информация о выделении ресурсов на узле
kubectl describe node node-1
# Allocated resources:
# CPU Requests CPU Limits Memory Requests Memory Limits
# 1250m (31%) 3500m (87%) 4096Mi (51%) 8192Mi (102%)
LimitRange: дефолтные ограничения для namespace
# limitrange.yaml
apiVersion: v1
kind: LimitRange
metadata:
name: default-limits
namespace: production
spec:
limits:
- type: Container
default: # дефолтные limits
cpu: "500m"
memory: "256Mi"
defaultRequest: # дефолтные requests
cpu: "100m"
memory: "128Mi"
max: # максимально разрешённые limits
cpu: "2"
memory: "2Gi"
min: # минимально допустимые requests
cpu: "50m"
memory: "32Mi"
ResourceQuota: лимиты для namespace
# resourcequota.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
name: namespace-quota
namespace: production
spec:
hard:
requests.cpu: "10" # сумма всех requests CPU не > 10 ядер
requests.memory: "20Gi" # сумма всех requests Memory не > 20 Gi
limits.cpu: "40"
limits.memory: "80Gi"
pods: "50" # не более 50 подов в namespace
kubectl apply -f resourcequota.yaml
kubectl describe resourcequota namespace-quota -n production
# Name: namespace-quota
# Resource Used Hard
# -------- ---- ----
# limits.cpu 3500m 40
# limits.memory 6Gi 80Gi
# pods 12 50
# requests.cpu 1250m 10
# requests.memory 3Gi 20Gi
💬 Комментарии (0)
Комментариев пока нет
Станьте первым, кто поделится мнением об этой статье!