Ответ
Доступ пользователей к приложениям в Kubernetes я разделяю на два уровня: доступ к API Kubernetes для административных задач и доступ к самим веб-приложениям.
1. Управление доступом к кластеру (Kubernetes API): Использую RBAC (Role-Based Access Control) в связке с внешним провайдером OIDC (например, Dex, подключённый к GitLab или GitHub).
- Пользователи аутентифицируются через корпоративный OIDC-провайдер.
- В Kubernetes создаю
ClusterRoleс необходимыми правами (например, только для чтения ресурсов в namespace). - Связываю пользователя или группу из OIDC с этой ролью через
ClusterRoleBinding.apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: dev-team-read-only subjects: - kind: Group name: "dev-team" # Группа из OIDC-провайдера apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: view # Встроенная роль "только для чтения" apiGroup: rbac.authorization.k8s.io
2. Публикация и защита веб-приложений:
- Ingress Controller: Разворачиваю контроллер (например, NGINX Ingress или Traefik) для маршрутизации внешнего HTTP(S)-трафика на внутренние сервисы.
- Ingress-ресурс: Определяю правила маршрутизации, TLS-терминацию и базовые аннотации для балансировки нагрузки.
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-ingress annotations: cert-manager.io/cluster-issuer: "letsencrypt-prod" spec: tls: - hosts: - app.example.com secretName: app-tls-secret rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: app-service port: number: 80 - Аутентификация на уровне Ingress: Для внутренних или админ-панелей настраиваю OAuth-прокси, например,
oauth2-proxy. Добавляю в аннотации Ingress правила, которые перенаправляют запросы на прокси для проверки аутентификации перед доступом к приложению.
Ответ 18+ 🔞
Давай разберём эту тему, а то у некоторых тут подход как у мартышлюшки с гранатой — сейчас накрутят дохуя сложностей, а потом орут, что ничего не работает.
Вот смотри, доступ к приложениям в кубере я делю на две абсолютно разные истории, чтобы не получился пиздопроебебена. Первое — это когда люди лезут в сам кластер, типа покомандовать. Второе — когда они просто хотят зайти на сайт через браузер.
1. Кластер (Kуber API) — тут доверия ебать ноль, пускать кого попало нельзя. Тут я использую RBAC, но не в одиночку, а с внешним провайдером OIDC. Представь, что это как пропускная система в офисе, только вместо карточки — твой аккаунт в GitLab или GitHub.
- Человек логинится через корпоративный OIDC (например, через Dex).
- В кубере у меня уже приготовлена роль (
ClusterRole) с чётко описанными правами. Например, роль «только смотреть» в определённом namespace. - Потом я связываю группу людей из OIDC с этой ролью через
ClusterRoleBinding. Всё, доступ есть.
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: dev-team-read-only
subjects:
- kind: Group
name: "dev-team" # Это группа из того самого OIDC-провайдера
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: view # Готовая встроенная роль «смотри, но не трогай»
apiGroup: rbac.authorization.k8s.io
Просто, чётко, и не надо никому раздавать админские конфиги. Э сабака сука, удобно же!
2. Веб-приложения — тут уже другая песня. Тут задача — выпустить приложение в мир и не дать всяким левым личностям в него вломиться.
- Ingress Controller: Ставлю шлюз (NGINX или Traefik), который будет принимать весь внешний трафик и разводить его по нужным сервисам внутри. Без него — нихуя не работает.
-
Ingress-ресурс: В нём я описываю правила: на какой домен что приходить должно, где брать SSL-сертификаты (обычно через cert-manager).
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-ingress annotations: cert-manager.io/cluster-issuer: "letsencrypt-prod" spec: tls: - hosts: - app.example.com secretName: app-tls-secret rules: - host: app.example.com http: paths: - path: / pathType: Prefix backend: service: name: app-service port: number: 80 - Аутентификация на входе: А вот это для особо хитрожопых случаев! Допустим, у тебя админка или внутренний инструмент. Нафиг пускать всех подряд? Я навешиваю на Ingress OAuth-прокси, типа
oauth2-proxy. Добавляю пару аннотаций — и теперь, прежде чем запрос доползёт до приложения, его перехватит прокся и спросит: «А ты кто такой, бздун?». Нет логина — иди нахуй. Получилось как будто швейцар у входа в клуб.
Вот и вся магия. Главное — не смешивать эти два уровня в одну кучу, а то будет ебушки-воробушки и ты сам от себя охуеешь, когда всё накроется медным тазом.