
В этом руководстве будут рассмотрены основные объекты API Kubernetes, предназначенные для управления доступом на основе ролей (RBAC).
К концу этого руководства у вас должно появиться достаточно знаний для реализации политик RBAC в вашем кластере. Приведенные здесь примеры были протестированы в нашем созданном Kubernetes кластере, но они могут быть применены к абсолютно любому кластеру Kubernetes. Начиная с Kubernetes 1.6, политики RBAC включаются по умолчанию. Политики RBAC имеют жизненно важное значение для правильного управления вашим кластером, поскольку они позволяют вам указывать, какие типы действий разрешены для конкретного пользователя и его роли в вашей организации.
Примеры включают:
В следствие того, что в последних версиях Kubernetes RBAC включен по умолчанию, вы, возможно, уже обнаружили специфические ошибки при настройке решений по сетевой виртуализации (например, flunneld) или деплое Helm в вашем кластере. Обычно такие ошибки выглядят следующим образом:
the server does not allow access to the requested resource
Это руководство покажет вам, как правильно работать с RBAC, чтобы вы могли решать такого рода проблемы.
Это руководство предполагает, что перед тем, как двигаться дальше, у вас выполнены следующие требования:
$ minikube start --extra-config=apiserver.Authorization.Mode=RBAC
Одной из основных функций Kubernetes является то, что все его ресурсы представляют собой моделируемые API объекты, которые позволяют выполнять с ними операции CRUD (Create, Read, Update, Delete). Примерами ресурсов являются:
Примеры возможных операций над этими ресурсами:
Высокоуровнево ресурсы связаны с группами API (например, Pod относится к core группе API, а Deployments относятся к группе API apps). Дополнительные сведения обо всех доступных ресурсах, операциях и группах API см. в официальном справочнике API Kubernetes.
Для управления RBAC в Kubernetes, помимо ресурсов и операций, нам нужны следующие элементы:
Вы можете найти примеры каждого элемента API в официальной документации Kubernetes.
В этом примере мы создадим следующую учетную запись пользователя:
Мы добавим необходимые политики RBAC, чтобы этот пользователь мог полностью управлять развертываниями (т.е. использовать команду kubectl run) только внутри пространства имен office. В конце мы проверим созданные политики, чтобы убедиться, что они работают так, как мы их определили.
Выполните команду kubectl create для создания пространства имен office. Команду необходимо запустить от пользователя Kubernetes admin:
$ kubectl create namespace office
Как уже упоминалось ранее, в Kubernetes нет объектов API для управления учетными записями пользователей. Из доступных способов управления аутентификацией (см. официальную документацию Kubernetes) для простоты мы будем использовать сертификаты OpenSSL. Необходимые шаги:
$ openssl genrsa -out user1.key 2048
$ openssl req -new -key user1.key -out user1.csr -subj "/CN=user1/O=deparment1"
$ openssl x509 -req -in user1.csr -CA CA_LOCATION/ca.crt -CAkey CA_LOCATION/ca.key -CAcreateserial -out user1.crt -days 500
$ mkdir ~/.kube/certs
$ cp user1.crt ~/.kube/certs
$ cp user1.key ~/.kube/certs
$ kubectl config set-credentials user1 --client-certificate=$HOME/.kube/certs/user1.crt --client-key=$HOME/.kube/certs/user1.key
$ kubectl config set-context user1-context --cluster=minikube --namespace=office --user=user1
Примечание: если вы разворачивали кластер по нашему руководству, то примеры команд на создание контекста будут следующими:
$ kubectl config set-credentials user1 --client-certificate=$HOME/.kube/certs/user1.crt --client-key=$HOME/.kube/certs/user1.key
$ kubectl config set-context user1-context --cluster=kubernetes --namespace=office --user=user1
Теперь при попытке использовать kubectl с этим конфигурационным файлом мы будем получать отказ в доступе. Это ожидаемое поведение, поскольку мы не определили никаких разрешенных операций для только что созданного пользователя. Убедитесь в этом сами:
$ kubectl --context=user1-context get pods
Error from server (Forbidden): User "user1" cannot list pods in the namespace "office". (get pods)
Создайте файл role-deployment-manager.yaml с приведенным ниже содержимым. В этом yaml-файле мы создаем правило, которое позволяет пользователю выполнять несколько операций с Deployments, Pods и ReplicaSets (необходимых для создания Deployment), которые принадлежат к core (выделены “” в yaml-файле) extensions группам API:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
namespace: office
name: deployment-manager
rules:
- apiGroups: ["", "extensions", "apps"]
resources: ["deployments", "replicasets", "pods"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"] # вы таже можете использовать ["*"] вместо списка
Создайте Role в вашем кластере Kubernetes при помощи команды kubectl create:
$ kubectl create -f role-deployment-manager.yaml
Создайте файл rolebinding-deployment-manager.yaml так, как показано ниже. В этом файле мы привязываем Role deployment-manager к субъекту User Account user1 внутри пространства имен office:
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
name: deployment-manager-binding
namespace: office
subjects:
- kind: User
name: user1
apiGroup: ""
roleRef:
kind: Role
name: deployment-manager
apiGroup: ""
Применим эти настройки к нашему кластеру:
$ kubectl create -f rolebinding-deployment-manager.yaml
Теперь вы можете выполнять следующие команды без каких-либо проблем:
$ kubectl --context=user1-context run --image nginx mynginx
deployment "mynginx" created
$ kubectl --context=user1-context get pods
NAME READY STATUS RESTARTS AGE
mynginx-3071068301-05ssq 1/1 Running 0 12s
Однако, если вы запустите ту же команду с аргументом --namespace=default, она не выполнится, так как пользователь user1 не имеет доступа к пространству имен default.
$ kubectl --context=user1-context run --image nginx --namespace=default mynginx
Ошибка будет следующей:
Error from server (Forbidden): User "user1" cannot create deployments.extensions in the namespace "default". (post deployments.extensions)
Теперь у вас есть понимание того, как создавать пользователей с ограниченными полномочиями в вашем кластере.