Namespaces, requests и limits

Рейтинг: 65.7% · 17 голосов
Kubernetes для разработчиков: поды, деплойменты, сервисы, ingress, конфиги и отладка. Уроки по главам с обсуждением.
Ответить
Аватара пользователя
anton_k8s
Сообщения: 26
Зарегистрирован: 12 май 2026, 03:23

Namespaces, requests и limits

Сообщение anton_k8s »

АкадемияKubernetes на практикеГлава 9 из 19
Оглавление курса (19)
  1. Зачем нужен Kubernetes и из чего состоит кластер
  2. Поднимаем локальный кластер: minikube и kind
  3. Поды: базовая единица запуска
  4. Deployment и ReplicaSet: управляем репликами
  5. Service: сетевой доступ к подам
  6. ConfigMap и Secret: выносим конфигурацию
  7. Ingress: пускаем трафик снаружи
  8. Хранилище: Volumes и PersistentVolumeClaim
  9. Namespaces, requests и limits (вы здесь)
  10. Health checks: liveness и readiness пробы
  11. Отладка: почему под не стартует
  12. Helm: пакетный менеджер для Kubernetes
  13. Базовая безопасность: RBAC и доступы
  14. Job и CronJob: разовые и периодические задачи
  15. StatefulSet и DaemonSet: stateful-нагрузки и системные агенты
  16. Стратегии обновления и планирование: rollout и rollback, graceful shutdown, nodeSelector, affinity, taints
  17. Автомасштабирование: HPA по метрикам, обзор VPA и Cluster Autoscaler
  18. Наблюдаемость: логи, метрики, events, обзор Prometheus и Grafana
  19. Безопасность глубже: securityContext, Pod Security Standards, NetworkPolicy, шифрование секретов
До этой главы всё, что мы создавали, падало в один namespace default, а контейнеры могли есть столько CPU и памяти, сколько дотянутся. В одиночной песочнице это терпимо, но в кластере, где живут несколько окружений или команд, так нельзя. Разберём три инструмента наведения порядка: namespaces, requests с limits и квоты.

Namespaces, логические разделы кластера:

Namespace делит один кластер на изолированные по именам части. Deployment с именем api может существовать и в dev, и в prod одновременно, это разные объекты. Типовые сценарии: по неймспейсу на окружение (dev, staging, prod) или по неймспейсу на команду.

Из коробки есть четыре служебных: default (туда попадает всё, если не указать другое), kube-system (компоненты самого Kubernetes, CoreDNS например), kube-public и kube-node-lease. В kube-system руками лучше не лазить.

Код: Выделить всё

kubectl create namespace staging
kubectl get pods -n staging
kubectl config set-context --current --namespace=staging
Третья команда переключает текущий namespace, чтобы не дописывать -n к каждой команде. Проверить, где вы сейчас: kubectl config view --minify | grep namespace.

Сеть между неймспейсами не изолирована. Service из главы 5 доступен из чужого namespace по полному имени, например api.staging.svc.cluster.local, а внутри своего хватает короткого api. И не всё в кластере вообще привязано к неймспейсам: ноды и PersistentVolume из главы 8 глобальные. Полный список таких объектов выдаёт kubectl api-resources --namespaced=false.

Requests и limits:

requests это сколько ресурсов шедулер резервирует под контейнер, когда выбирает ноду. limits это жёсткий потолок. CPU меряется в millicores, 500m это половина ядра. Память в Mi и Gi.

Код: Выделить всё

apiVersion: apps/v1
kind: Deployment
metadata:
  name: api
  namespace: staging
spec:
  replicas: 2
  selector:
    matchLabels:
      app: api
  template:
    metadata:
      labels:
        app: api
    spec:
      containers:
      - name: api
        image: ghcr.io/cyberlake/api:1.4.2
        resources:
          requests:
            cpu: 100m
            memory: 128Mi
          limits:
            cpu: 500m
            memory: 256Mi
Поведение при превышении у CPU и памяти разное. CPU контейнеру просто зажимают (троттлинг), процесс живёт, но тормозит. А вот за памятью следит ядро: вылез за лимит, получаешь OOMKill. В статусе пода будет OOMKilled и код выхода 137.

От сочетания requests и limits зависит QoS-класс пода: Guaranteed (requests равны limits по CPU и памяти), Burstable (что-то задано, но не всё и не поровну) и BestEffort (не задано ничего). Когда ноде не хватает памяти, первыми на выселение идут BestEffort.

Откуда брать цифры: смотрите реальное потребление через kubectl top pod (нужен metrics-server, в minikube включается командой minikube addons enable metrics-server). Лимит по памяти ставьте всегда, а лимит по CPU тема холиварная: многие его не ставят вовсе, чтобы под мог разово взять свободные циклы ноды вместо троттлинга.

ResourceQuota и LimitRange:

Чтобы один namespace не сожрал кластер целиком, на него вешают квоту:

Код: Выделить всё

apiVersion: v1
kind: ResourceQuota
metadata:
  name: staging-quota
  namespace: staging
spec:
  hard:
    requests.cpu: "4"
    requests.memory: 8Gi
    limits.cpu: "8"
    limits.memory: 16Gi
    pods: "30"
Нюанс: как только в неймспейсе появляется квота на CPU или память, каждый новый под обязан декларировать requests и limits, иначе API-сервер его отклонит. Чтобы не заставлять всех писать блок resources руками, рядом кладут LimitRange с дефолтами:

Код: Выделить всё

apiVersion: v1
kind: LimitRange
metadata:
  name: staging-defaults
  namespace: staging
spec:
  limits:
  - type: Container
    defaultRequest:
      cpu: 100m
      memory: 128Mi
    default:
      cpu: 500m
      memory: 256Mi
Теперь контейнер без явного resources автоматически получит 100m и 128Mi запроса, 500m и 256Mi лимита.

Типичные грабли:

memory: 100m вместо 100Mi. Конфиг валидный, m означает милли, и вы только что запросили десятую часть байта. Шедулер радостно разместит такой под куда угодно, а реальное потребление никто не учтёт.

Под висит в Pending. Почти всегда это requests больше, чем свободно на любой ноде. kubectl describe pod покажет событие FailedScheduling с Insufficient cpu или Insufficient memory. На локальном minikube с парой ядер ловится на раз.

OOMKilled по кругу. Лимит памяти ниже реального потребления, контейнер убивают, он рестартует, счётчик RESTARTS растёт. Смотрите Last State: Terminated в kubectl describe pod.

Забытый -n. Деплой "пропал", хотя он просто в другом неймспейсе. kubectl get all -A показывает объекты во всех неймспейсах сразу.

Удаление namespace сносит всё содержимое: поды, сервисы, секреты, PVC. kubectl delete namespace staging это не уборка папки, а снос целого этажа.

Итог:

Теперь вы умеете резать кластер на неймспейсы, задавать контейнерам requests и limits, а неймспейсам квоты с дефолтами через LimitRange. Следующая глава про liveness и readiness пробы, без них Kubernetes не отличает живой под от зависшего. А если после внедрения лимитов поды начали вести себя странно, глава 11 про отладку как раз об этом.
👍5 ❤️2 🔥 😄 🤔2
✔ Лучший ответ сформирован автоматически — jimmy36
anton_k8s писал(а):лимит по CPU тема холиварная а в чем тогда защита от соседа по ноде, который начнет жрать весь проц? requests же вроде только при планировании учитываются. или под нагрузкой ядро таки делит cpu пропорционально requests? кто-нибудь проверял на живом кластере, а не в теории
Перейти к ответу →
Аватара пользователя
jimmy36
Сообщения: 1
Зарегистрирован: 12 май 2026, 11:23

Re: Namespaces, requests и limits

Сообщение jimmy36 »

✔ Лучший ответ — сформирован автоматически
anton_k8s писал(а):лимит по CPU тема холиварная
а в чем тогда защита от соседа по ноде, который начнет жрать весь проц? requests же вроде только при планировании учитываются. или под нагрузкой ядро таки делит cpu пропорционально requests? кто-нибудь проверял на живом кластере, а не в теории
👍 ❤️1 🔥 😄 🤔
Аватара пользователя
vernonn
Сообщения: 2
Зарегистрирован: 28 май 2026, 10:21

Re: Namespaces, requests и limits

Сообщение vernonn »

про OOMKilled по кругу прямо наша история. джава неделю рестартовала, лимит 512Mi, а хип сам себе выбрал больше и привет 137. вылечили -XX:MaxRAMPercentage=75, с тех пор тишина. короче если у вас jvm в контейнере, лимит без настройки хипа это лотерея
👍2 ❤️ 🔥 😄 🤔
Аватара пользователя
travio
Сообщения: 1
Зарегистрирован: 13 май 2026, 11:45

Re: Namespaces, requests и limits

Сообщение travio »

вместо kubectl config set-context всем советую поставить kubectx и kubens, переключение неймспейса одной командой и с автодополнением. на minikube тоже работает, жить становится сильно проще
👍 ❤️1 🔥 😄 🤔
Аватара пользователя
Mana21
Сообщения: 1
Зарегистрирован: 14 май 2026, 16:26

Re: Namespaces, requests и limits

Сообщение Mana21 »

вопрос по квотам: а что будет с подами, которые уже крутились в неймспейсе без requests до того, как туда повесили ResourceQuota? их прибьет или они доживают до первого рестарта?
👍 ❤️ 🔥1 😄 🤔
Ответить
← Предыдущая глава
Хранилище: Volumes и PersistentVolumeClaim
Следующая глава →
Health checks: liveness и readiness пробы

Все главы курса «Kubernetes на практике»

Поделиться темой: ✈ Telegram VK

Вернуться в «Kubernetes на практике»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость