Управление доступом в кластере Managed Kubernetes с помощью пользовательских ролей
Вы можете создавать новые пользовательские роли для управления доступом к ресурсам сервиса Managed Kubernetes, если стандартных ролей Kubernetes API недостаточно.
Чтобы создать пользовательскую роль, которая предоставляет права администратора в определенном пространстве имен:
От имени сервисного аккаунта, которому вы назначите новую роль, можно будет просматривать ресурсы и работать с ними только в выбранном пространстве имен. Вместо сервисного аккаунта также можно использовать федеративного пользователя.
Перед началом работы
sa-adminс рольюmk8s.clusterAdmin;sa-userбез ролей — для этого сервисного аккаунта будет создана пользовательская роль Kubernetes API.
Создайте авторизованные ключи для сервисных аккаунтов.
Аутентифицируйтесь в MWS CLI от имени сервисного аккаунта
sa-admin:bashmws init --service-account-authorized-key "<путь к файлу с авторизованным ключом sa-admin>"Создайте кластер Managed Kubernetes любой подходящей вам конфигурации.
1. Создайте пространство имен
Создайте пространство имен в кластере:
bashkubectl create namespace my-namespaceОжидаемый результат:
bashnamespace/my-namespace created
2. Создайте роль
Сохраните спецификацию объекта
ClusterRoleв файлrole.yaml:yamlapiVersion: 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.Создайте объект:
bashkubectl apply -f role.yamlОжидаемый результат:
bashclusterrole.rbac.authorization.k8s.io/namespace-admin created
3. Назначьте роль сервисному аккаунту
Сохраните спецификацию объекта
RoleBindingв файлrole-binding.yaml:yamlapiVersion: 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.Создайте объект:
bashkubectl apply -f role-binding.yamlОжидаемый результат:
bashrolebinding.rbac.authorization.k8s.io/binding-for-role created
Примечание
Чтобы выдать доступ к нескольким пространствам имен, создайте несколько объектов RoleBinding — по одному на каждое пространство имен. Создавать несколько объектов ClusterRole не нужно.
4. Подготовьте сервисный аккаунт к работе с кластером
Укажите в kubeconfig пространство имен по умолчанию:
yaml... - context: cluster: mws-mk8s-mk8s-<имя проекта>-<имя кластера> user: mws-mk8s-mk8s-<имя проекта>-<имя кластера> namespace: my-namespace ...Аутентифицируйтесь в MWS CLI от имени сервисного аккаунта
sa-user:bashmws init --service-account-authorized-key "<путь к файлу с авторизованным ключом sa-user>"
5. Проверьте права
Убедитесь, что есть доступ к пространству имен
my-namespace:bashkubectl auth can-i get pods -n my-namespaceОжидаемый результат:
yes.Убедитесь, что нет доступа к другим пространствам имен:
bashkubectl auth can-i get pods -n kube-systemОжидаемый результат:
no.(опционально) Передайте kubeconfig и файл с авторизованным ключом для аутентификации в MWS CLI тому, кто будет работать в пространстве имен
my-namespaceот имени сервисного аккаунтаsa-user.
Удалите платные ресурсы
Кластер Managed Kubernetes, созданный в руководстве, тарифицируется. Если вы больше не планируете использовать его, удалите кластер.