Что такое ролевая модель доступа (RBAC) в Kubernetes?

Ответ

RBAC (Role-Based Access Control) в Kubernetes — это механизм управления доступом, который регулирует, какие действия (verbs) могут выполнять пользователи, группы или сервисные аккаунты (субъекты) над ресурсами (objects) в кластере. Это стандартный и наиболее рекомендуемый способ контроля доступа в K8s.

Основные компоненты RBAC:

  1. Role / ClusterRole: Определяет набор правил доступа.
    • Role: Действует в пределах конкретного namespace.
    • ClusterRole: Действует на уровне всего кластера (для кластерных ресурсов типа Nodes, PersistentVolumes) или может быть использован для предоставления доступа к ресурсам во всех/определённых namespaces.
  2. RoleBinding / ClusterRoleBinding: Связывает Role или ClusterRole с одним или несколькими субъектами.
    • RoleBinding: Привязывает Role к субъектам в рамках одного namespace.
    • ClusterRoleBinding: Привязывает ClusterRole к субъектам на уровне всего кластера.

Практический пример: Предоставление сервисному аккаунту права читать Pods в namespace monitoring.

1. Создаём ServiceAccount:

apiVersion: v1
kind: ServiceAccount
metadata:
  name: pod-reader-sa
  namespace: monitoring

2. Создаём Role с правами на чтение Pods:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: monitoring
  name: pod-reader-role
rules:
- apiGroups: [""] # Ядро API группы (пустая строка)
  resources: ["pods"] # Ресурс
  verbs: ["get", "list", "watch"] # Разрешённые действия

3. Связываем Role с ServiceAccount через RoleBinding:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods-binding
  namespace: monitoring
subjects:
- kind: ServiceAccount
  name: pod-reader-sa
  namespace: monitoring
roleRef:
  kind: Role
  name: pod-reader-role
  apiGroup: rbac.authorization.k8s.io

Типичные сценарии использования в DevOps:

  • Доступ для CI/CD: Сервисному аккаунту Jenkins/GitLab Runner дают права на деплой (create, update) в определённых namespaces.
  • Изоляция команд: Разработчикам команды "А" дают полный доступ в namespace team-a, но только чтение в team-b.
  • Мониторинг: Сервисному аккаунту Prometheus дают права на get, list, watch для Pods, Services, Endpoints во всех namespaces через ClusterRole и ClusterRoleBinding.
  • Минимальные привилегии: Для каждого приложения создаётся отдельный ServiceAccount с правами, строго необходимыми для его работы (принцип least privilege).

Проверка прав: Утилиты kubectl auth can-i помогают отлаживать политики:

kubectl auth can-i list pods --as=system:serviceaccount:monitoring:pod-reader-sa -n monitoring
# Ответ: yes

Ответ 18+ 🔞

А, RBAC в кубере! Ну это ж классика, ёпта. Система, которая пытается сделать так, чтобы всякие левые сервисные аккаунты не шарились там, где им не положено. Типа чтоб какой-нибудь прометеус не начал вдруг удалять поды, а дженкинс — секреты читать. В общем, чтоб бардака не было, а то потом волнение ебать — кто что натворил, и подозрение ебать чувствую на каждого.

Смотри, суть проще пареной репы, если не заморачиваться. Есть у нас Роли (Role) и КластерРоли (ClusterRole). Первые — как местные пацаны, только в своём неймспейсе рулят. Вторые — уже хуй с горы, на весь кластер замах. В них ты пишешь правила: что можно трогать (поды, сервисы, деплойменты) и что с этим делать (смотреть, создавать, удалять — это verbs).

А чтобы эти правила кому-то применить, нужны Привязки (RoleBinding и ClusterRoleBinding). Это как пропуск выписать. Связал роль с сервисным аккаунтом — и всё, чувак может работать в отведённых рамках. Не связал — сидит, бздит, и нихуя не может.

Вот смотри, реальный пример, как дать какому-то сервису право только смотреть на поды в неймспейсе monitoring, но не трогать. Чисто для мониторинга.

1. Делаем сервисный аккаунт — нашего наблюдателя.

apiVersion: v1
kind: ServiceAccount
metadata:
  name: pod-reader-sa
  namespace: monitoring

Просто создали учётку. Пока что это просто имя, доверия ебать ноль.

2. Пишем роль — инструкцию, что можно.

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: monitoring
  name: pod-reader-role
rules:
- apiGroups: [""] # Это ядро API, группы типа pods, services
  resources: ["pods"] # Конкретно поды
  verbs: ["get", "list", "watch"] # Только смотреть, вынюхивать, но не менять!

Вот эта штука говорит: в неймспейсе monitoring можно листать и читать поды. Всё. Попробуй удалить — получишь отлуп.

3. Выдаём пропуск — привязываем роль к аккаунту.

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods-binding
  namespace: monitoring
subjects:
- kind: ServiceAccount
  name: pod-reader-sa
  namespace: monitoring
roleRef:
  kind: Role
  name: pod-reader-role
  apiGroup: rbac.authorization.k8s.io

Всё, готово. Теперь pod-reader-sa — законный зритель.

А где это в жизни нужно? Да овердохуища где!

  • Твоему CI/CD (типа Jenkins): Даёшь сервисному аккаунту роль на create и update деплойментов в неймспейсе prod, но НИКОГДА не даёшь delete или доступ в kube-system. А то будет вам хиросима и нигерсраки.
  • Изоляция команд: Чуваки из команды "А" — боги в своём team-a неймспейсе. А в team-b у них роль только на чтение, чтобы не шаловливые ручки тянули.
  • Для прометеуса: Делаешь ClusterRole (чтоб во всех неймспейсах мог смотреть) с правами get, list, watch на поды, эндпоинты и всё такое. Привязываешь через ClusterRoleBinding к его сервисному аккаунту. И он летает по всему кластеру и собирает метрики.
  • Главный принцип — минимальные привилегии. Не надо каждой мартышлюшке-приложению давать админские права. Создал для неё отдельный сервисный аккаунт, выдал ровно то, что нужно для работы, и спи спокойно.

А если что-то не работает? Не охуевай, есть команда для проверки:

kubectl auth can-i list pods --as=system:serviceaccount:monitoring:pod-reader-sa -n monitoring

Спросишь у системы: "А можно этому чуваку листать поды?". Она тебе честно ответит yes или no. Если no — значит, где-то накосячил в привязках, иди ищи, распиздяй.

Вот и вся магия. Сначала кажется, что хуй в пальто, но привыкнешь — удобная хуйня. Главное — не давать лишнего, а то потом сам от себя охуеешь, когда всё полетит к чёрту.