Namespace, labels, selectors
Что нужно знать перед уроком
- M1.03 — Service и порты — label selector уже встречался у Service/Deployment — здесь разбираем его полностью
Что нужно знать перед уроком
M1 уроки 2–3 — вы уже использовали selector: matchLabels у Deployment и Service интуитивно. Здесь — полный разбор селекторов и второй важной оси изоляции — Namespace.
Теория
Namespace-scoped vs cluster-scoped ресурсы
Не все объекты Kubernetes привязаны к namespace. Namespace-scoped — Pod, Deployment, Service, ConfigMap, Secret, Role, RoleBinding — существуют «внутри» конкретного namespace, их имена уникальны только в пределах namespace (web в ns-a и web в ns-b — разные объекты). Cluster-scoped — сама Namespace, Node, PersistentVolume, ClusterRole, ClusterRoleBinding, StorageClass, а из объектов Deckhouse — Module, PackageRepository (ровно то разграничение, которое станет центральным в M2 уроке 1) — существуют «поверх» всех namespace сразу, их имена уникальны на весь кластер.
| |
Labels и Selectors — механизм связи «многие ко многим»
Label — произвольная пара key: value в метаданных объекта, не влияющая на поведение сама по себе (в отличие от spec) — просто маркер для группировки и поиска. Selector — выражение, отбирающее объекты по их лейблам. Их комбинация — основной механизм связи между независимо существующими объектами Kubernetes (Deployment находит «свои» Pod’ы, Service находит «свои» Pod’ы, NetworkPolicy находит «свои» Pod’ы — и всё это через один и тот же механизм лейблов, без прямых ссылок по имени).
Equality-based селекторы (поддерживаются и в matchLabels, и в -l):
| |
Set-based селекторы (поддерживаются только в matchExpressions, недоступны в matchLabels):
| |
Через -l в CLI то же самое пишется как env in (prod,qa), env notin (dev), голое partition (Exists) или !partition (DoesNotExist).
matchLabels — упрощённый синтаксис, поддерживающий только equality-сравнение (эквивалент нескольких In с одним значением). Как только нужна проверка «одно из нескольких значений», отрицание набора значений или сама проверка присутствия ключа — необходим matchExpressions. Оба блока можно комбинировать в одном селекторе одновременно — итоговое условие — их логическое И.ResourceQuota vs LimitRange — два уровня одной задачи
Обе задачи направлены на «не дать namespace съесть кластер», но на разных уровнях:
LimitRange | ResourceQuota | |
|---|---|---|
| Уровень применения | один объект (Pod/Container/PVC) | весь namespace (агрегат) |
| Что задаёт | default/min/max для одного контейнера | суммарный лимит CPU/RAM/число объектов на весь namespace |
| Пример | «у каждого контейнера memory не больше 512Mi» | «суммарно в namespace не больше 4 CPU и 8Gi RAM» |
| |
Оба механизма работают одновременно и не заменяют друг друга: LimitRange следит за «дисциплиной» отдельных объектов (не дать создать Pod без лимитов вообще, задав default), ResourceQuota — за агрегатным потолком namespace целиком.
Частые ошибки и подводные камни
- Ожидать, что
matchLabelsподдерживаетIn/NotIn/Exists. Он поддерживает только точное равенство — для сложной логики нуженmatchExpressions. - Путать namespace-изоляцию с сетевой изоляцией. Namespace сам по себе не ограничивает сетевой трафик между Pod’ами разных namespace — для этого нужен
NetworkPolicy(M10 урок 9), namespace — это только логическая группировка имён и область действия RBAC/квот. - Забыть, что
ResourceQuotaтребует, чтобы у всех Pod’ов в namespace были заданыrequests(если квота задана поrequests.cpu/requests.memory) — иначеkubectl applyдля Pod безresourcesбудет отклонён с ошибкой квоты.
Практика в кластере
Uptime Kuma — self-hosted мониторинг доступности сервисов (Node.js), легко разворачивается в нескольких экземплярах — удобно для демонстрации изоляции по namespace и лейблам.
| |
- Убедитесь, что одноимённые Deployment’ы в разных namespace не конфликтуют:
| |
- Потренируйтесь с равенство-based и set-based селекторами:
| |
- Примените
LimitRange/ResourceQuotaиз теории наcourse-m1-ns-team-aи проверьте, что превышение квоты блокируется:
| |
Практика разработки
Используется официальный образ louislam/uptime-kuma; собственная сборка — в M3.
Шпаргалка команд урока
| |
Вопросы для самопроверки
PersistentVolume, как и Node, ClusterRole, сама Namespace — существуют вне привязки к конкретному namespace.
Источник: Kubernetes — kubectl reference
matchLabels поддерживает только точное равенство; проверка «одно из нескольких значений» требует matchExpressions с operator: In.
Источник: Kubernetes — labels
LimitRange — дисциплина отдельного объекта (min/max/default), ResourceQuota — суммарный потолок ресурсов и числа объектов на namespace.
Источник: Kubernetes — limit storage consumption
Если в namespace действует ResourceQuota по compute-ресурсам, все Pod'ы обязаны явно указывать requests/limits — иначе создание блокируется.
Источник: Kubernetes — resource quotas
По умолчанию Pod'ы разных namespace могут свободно обращаться друг к другу по сети — явная изоляция требует NetworkPolicy.
Источник: Kubernetes — network policies
Рекомендуемая литература
Официальная документация
- kubernetes.io — concepts/overview/working-with-objects/labels
- kubernetes.io — tasks/administer-cluster/limit-storage-consumption
- kubernetes.io — Namespaces.
Статьи и блоги
- Kubernetes для начинающих: что такое Pod и как с ним работать — Flant на Habr.
- Основные концепции сетевой архитектуры Kubernetes — Habr.
- Миграция с ingress-nginx: выбор нового контроллера — Habr.
Книги
- Marko Lukša. Kubernetes in Action. 2nd ed., 2022. ISBN 978-1617297618.
- Kelsey Hightower, Brendan Burns, Joe Beda. Kubernetes: Up and Running. 3rd ed., 2022. ISBN 978-1098110201.
- Michael Hausenblas, Stefan Schimanski. Programming Kubernetes. 2019. ISBN 978-1492047107.
Связанные материалы
- Предыдущий урок: M1.04 — ConfigMap/Secret.
- Следующий урок: M1.06 — Volumes/PVC/StorageClass.
- Глоссарий: Namespace (будет дополнен).
✓ Урок пройден — все вопросы самопроверки отвечены верно