📝 Kubernetes

Resource Limits и Requests в Kubernetes

P
Автор
Pyland
📅
Опубликовано
30.06.2026
⏱️
Время чтения
3 мин
👁️
Просмотров
82
🌳
Уровень
Продвинутый
🐦 💼 ✈️

Без ограничений ресурсов один «жадный» контейнер может съесть всю память узла и убить остальные поды. 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)

🔐 Войдите в систему, чтобы оставить комментарий
🚪 Войти
💭

Комментариев пока нет

Станьте первым, кто поделится мнением об этой статье!

🔗 Похожие

Похожие статьи

Продолжите изучение с этими материалами

📝

Health Checks: liveness и readiness в Kubernetes

Контейнер запущен — не значит, что приложение работает. Может быть дедлок, переполнение памяти или медленная...

📅 30.06.2026 👁️ 93
📝

Что такое Kubernetes и зачем он нужен

Docker упакует приложение в контейнер. Но что делать, когда контейнеров сотни, они падают, нагрузка скачет,...

📅 30.06.2026 👁️ 85
📝

ConfigMap и Secret: конфигурация в Kubernetes

Конфигурация не должна быть зашита в Docker-образ. Разные окружения (dev, staging, production) требуют разных значений....

📅 30.06.2026 👁️ 93

Понравилась статья?

Подпишитесь на наши обновления и получайте новые статьи первыми. Развивайтесь вместе с PyLand!