Базовый RBAC
Что нужно знать перед уроком
- M1.05 — Namespace, labels, selectors — нужно понимать namespace-scoped vs cluster-scoped объекты
Что нужно знать перед уроком
M1 урок 5 — namespace-scoped vs cluster-scoped ресурсы. RBAC (Role-Based Access Control) — механизм, который решает, кто и что может делать с объектами Kubernetes API, и он напрямую использует это же разделение.
Теория
Фундаментальный принцип: «по умолчанию нет прав ни у кого»
RBAC в Kubernetes построен на принципе явного разрешения: субъект (пользователь, группа, ServiceAccount) не имеет никаких прав на объекты API, пока это право не выдано явным биндингом. Нет прав «по умолчанию» ни у кого, кроме встроенных системных ролей.
Role/ClusterRole — что разрешено
Role — namespace-scoped набор правил, ClusterRole — тот же формат правил, но действует cluster-wide (либо применим сразу ко всем namespace через ClusterRoleBinding, либо к одному через RoleBinding, см. ниже):
| |
apiGroups ("" — core API group, где живут Pod/Service/ConfigMap/Secret), resources (тип объекта), verbs (get/list/watch/create/update/patch/delete) — три оси, которые вместе определяют «что разрешено».
RoleBinding/ClusterRoleBinding — кому разрешено
RoleBinding привязывает Role или ClusterRole к конкретному субъекту (ServiceAccount/User/Group):
| |
RoleBinding может ссылаться не только на Role, но и на ClusterRole (тот же roleRef.kind: ClusterRole) — в этом случае право действует только в namespace самого биндинга, а не во всём кластере. Это удобный, широко используемый паттерн: определить один общий ClusterRole (например, «read-only доступ к стандартным ресурсам») и переиспользовать его во множестве namespace через отдельные RoleBinding, не дублируя правила заново в каждом namespace.ClusterRoleBinding, в отличие от RoleBinding, действует во всём кластере сразу — используется для по-настоящему cluster-wide прав (администраторские роли, системные компоненты).
ServiceAccount — identity для Pod’ов, не для людей
ServiceAccount — объект identity именно для процессов внутри Pod’а (люди авторизуются через User/Group, обычно через внешний OIDC-провайдер, вне рамок этого курса). У каждого namespace автоматически существует ServiceAccount с именем default, без каких-либо прав по умолчанию (кроме базового доступа к API-серверу как аутентифицированный субъект).
| |
Практический смысл для Application-разработчика: если вашему приложению нужно обращаться к Kubernetes API самостоятельно (например, читать список своих же ConfigMap или мониторить статус других объектов, как это иногда делает Grafana-плагины для service discovery) — создайте отдельный ServiceAccount с минимально необходимым набором прав через Role+RoleBinding, а не полагайтесь на default (у которого прав нет, значит, такой код просто не будет работать) и тем более не расширяйте права default SA для всех Pod’ов namespace бездумно.
Частые ошибки и подводные камни
- Расширять права
defaultServiceAccount вместо создания отдельного. Это негласно расширяет права всех Pod’ов namespace, у которых явно не указанserviceAccountName— грубое нарушение принципа минимальных привилегий. - Использовать
ClusterRoleBinding, когда достаточноRoleBindingсClusterRole. Если права нужны только в одном namespace —ClusterRoleBindingдаёт избыточные права во всём кластере, хотя тот жеClusterRoleможно переиспользовать точечно черезRoleBinding. - Забыть про
apiGroups: [""]для core-ресурсов. Частая опечатка — указыватьapiGroups: ["core"], тогда как правильное значение для core API group (Pod/Service/ConfigMap/Secret/Namespace) — пустая строка"".
Практика в кластере
Grafana — платформа визуализации метрик/дашбордов — хороший пример для RBAC, т.к. в реальных сценариях ей может требоваться собственный ServiceAccount для service discovery источников данных внутри кластера.
| |
- Проверьте права через
kubectl auth can-i— самый быстрый способ диагностики RBAC:
| |
- Проверьте, что
defaultServiceAccount того же namespace не получил прав «за компанию»:
| |
- Создайте
ClusterRoleи продемонстрируйте паттерн «один ClusterRole — много RoleBinding в разных namespace»:
| |
Практика разработки
Используется официальный образ grafana/grafana; собственная сборка — в M3.
Шпаргалка команд урока
| |
Вопросы для самопроверки
Фундаментальный принцип RBAC Kubernetes — «по умолчанию нет прав ни у кого», всё выдаётся явными Role/ClusterRoleBinding.
Источник: Kubernetes — rbac
Ключевой факт: RoleBinding, даже ссылаясь на ClusterRole, ограничивает действие права namespace'ом самого биндинга — удобный способ переиспользовать один ClusterRole в разных namespace.
Источник: Kubernetes — rbac
ServiceAccount — identity именно для Pod'ов; аутентификация людей обычно идёт через User/Group и внешний identity-провайдер.
Источник: Kubernetes — rbac
Core API group в правилах RBAC указывается пустой строкой — частая ошибка новичков писать "core".
Источник: Kubernetes — rbac
kubectl auth can-i с флагом --as позволяет напрямую и быстро проверить конкретное право без ручного разбора цепочки Role/RoleBinding.
Источник: Kubernetes — authorization
Рекомендуемая литература
Официальная документация
Статьи и блоги
- Основные концепции сетевой архитектуры Kubernetes (RBAC, ServiceAccount) — Habr.
- 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.10 — Jobs/CronJobs.
- Следующий модуль: M2 — Deckhouse Platform глазами Application-разработчика, урок 1 — Application vs Module.
- Уже пройдено с той же логикой разделения прав: M1.09 — Gateway API (ролевая модель Ian/Chihiro/Ana).
✓ Урок пройден — все вопросы самопроверки отвечены верно