Skip to content

Управление доступом в кластере Managed Kubernetes с помощью пользовательских ролей

Вы можете создавать новые пользовательские роли для управления доступом к ресурсам сервиса Managed Kubernetes, если стандартных ролей Kubernetes API недостаточно.

Чтобы создать пользовательскую роль, которая предоставляет права администратора в определенном пространстве имен:

От имени сервисного аккаунта, которому вы назначите новую роль, можно будет просматривать ресурсы и работать с ними только в выбранном пространстве имен. Вместо сервисного аккаунта также можно использовать федеративного пользователя.

Перед началом работы

  1. Создайте сервисные аккаунты:

    • sa-admin с ролью mk8s.clusterAdmin;
    • sa-user без ролей — для этого сервисного аккаунта будет создана пользовательская роль Kubernetes API.
  2. Создайте авторизованные ключи для сервисных аккаунтов.

  3. Аутентифицируйтесь в MWS CLI от имени сервисного аккаунта sa-admin:

    bash
    mws init --service-account-authorized-key "<путь к файлу с авторизованным ключом sa-admin>"
  4. Создайте кластер Managed Kubernetes любой подходящей вам конфигурации.

1. Создайте пространство имен

  1. Создайте пространство имен в кластере:

    bash
    kubectl create namespace my-namespace

    Ожидаемый результат:

    bash
    namespace/my-namespace created

2. Создайте роль

  1. Сохраните спецификацию объекта ClusterRole в файл role.yaml:

    yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: ClusterRole
    metadata:
      name: namespace-admin
    rules:
    - apiGroups: ["", "apps", "batch", "extensions", "networking.k8s.io"]
      resources: ["*"]
      verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]

    Здесь:

    • rules.resources — ресурсы, на которые предоставляются разрешения.
    • rules.verbs — действия, которые разрешается выполнять с ресурсами.

    Подробнее о спецификации ClusterRole читайте в документации Kubernetes.

  2. Создайте объект:

    bash
    kubectl apply -f role.yaml

    Ожидаемый результат:

    bash
    clusterrole.rbac.authorization.k8s.io/namespace-admin created

3. Назначьте роль сервисному аккаунту

  1. Сохраните спецификацию объекта RoleBinding в файл role-binding.yaml:

    yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: binding-for-role
      namespace: my-namespace
    subjects:
    - kind: User
      name: mws:projects/<имя проекта>/serviceAccounts/sa-user
      apiGroup: rbac.authorization.k8s.io
    roleRef:
      kind: ClusterRole
      name: namespace-admin
      apiGroup: rbac.authorization.k8s.io

    Здесь metadata.namespace указывает на пространство имен, к которому будет выдан доступ.

    Подробнее о спецификации RoleBinding читайте в документации Kubernetes.

  2. Создайте объект:

    bash
    kubectl apply -f role-binding.yaml

    Ожидаемый результат:

    bash
    rolebinding.rbac.authorization.k8s.io/binding-for-role created

Примечание

Чтобы выдать доступ к нескольким пространствам имен, создайте несколько объектов RoleBinding — по одному на каждое пространство имен. Создавать несколько объектов ClusterRole не нужно.

4. Подготовьте сервисный аккаунт к работе с кластером

  1. Укажите в kubeconfig пространство имен по умолчанию:

    yaml
    ...
    - context:
        cluster: mws-mk8s-mk8s-<имя проекта>-<имя кластера>
        user: mws-mk8s-mk8s-<имя проекта>-<имя кластера>
        namespace: my-namespace
    ...
  2. Аутентифицируйтесь в MWS CLI от имени сервисного аккаунта sa-user:

    bash
    mws init --service-account-authorized-key "<путь к файлу с авторизованным ключом sa-user>"

5. Проверьте права

  1. Убедитесь, что есть доступ к пространству имен my-namespace:

    bash
    kubectl auth can-i get pods -n my-namespace

    Ожидаемый результат: yes.

  2. Убедитесь, что нет доступа к другим пространствам имен:

    bash
    kubectl auth can-i get pods -n kube-system

    Ожидаемый результат: no.

  3. (опционально) Передайте kubeconfig и файл с авторизованным ключом для аутентификации в MWS CLI тому, кто будет работать в пространстве имен my-namespace от имени сервисного аккаунта sa-user.

Удалите платные ресурсы

Кластер Managed Kubernetes, созданный в руководстве, тарифицируется. Если вы больше не планируете использовать его, удалите кластер.