Как обеспечить доступ пользователей к приложениям в Kubernetes?

Ответ

Доступ пользователей к приложениям в 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. Добавляю пару аннотаций — и теперь, прежде чем запрос доползёт до приложения, его перехватит прокся и спросит: «А ты кто такой, бздун?». Нет логина — иди нахуй. Получилось как будто швейцар у входа в клуб.

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