Thank you for reading this post, don't forget to subscribe!
Создание изолированной среды пользователя Kubernetes в Docker Enterprise
Как контролировать пользователей
Управлять кластером Kubernetes с одним пользователем просто.
Когда вы выходите за пределы одного пользователя, вам нужно начать использовать управление доступом на основе ролей (RBAC).
рассмотрим для начала:
Создание изолированной среды пользователя Kubernetes в Docker Enterprise
Когда вы создаете пользователя в Docker Enterprise Edition (EE), этот пользователь может немедленно создать службу Swarm в кластере.
Все, что ему нужно сделать, это сгенерировать, загрузить, распаковать и «выполнить» их клиентский пакет.
Однако на стороне Kubernetes управление доступом на основе ролей (RBAC) и пользовательские разрешения по умолчанию немного отличаются.
Я покажу вам, как настроить подобный опыт с Kubernetes, который вы получаете с готовым Swarm.
Docker EE создает клиентский пакет, который содержит сертификаты, переменные среды и т. д., необходимые для настройки системы для взаимодействия с кластером с помощью команд docker и kubectl.
В системе Windows 10 вы используете приведенную ниже команду в окне PowerShell.
В системе Linux вы должны использовать env.sh в командной строке Bash.
ken> Import-Module .\env.ps1
Cluster "ucp_ken-ucp.lab.capstonec.net:6443_ken.rider" set.
User "ucp_ken-ucp.lab.capstonec.net:6443_ken.rider" set.
Context "ucp_ken-ucp.lab.capstonec.net:6443_ken.rider" modified.
ken> docker service create --name nginx nginx:1.14-alpine
zaslrujj7y0rrp53b1ds9q7as
overall progress: 1 out of 1 tasks
1/1: running [==================================================>] verify: Service converged
ken> kubectl create deployment nginx --image=nginx:1.14-alpine
Error from server (Forbidden):
deployments.extensions is forbidden: User
"8f796584-5683-4c24-baf8-554ad21ad86f" cannot create
deployments.extensions in the namespace "default": access denied
Когда пользователь создает сервис, он развертывается в этой коллекции.
В случае с Kubernetes Docker EE поддерживает RBAC Kubernetes, но не настраивает пространства имен, роли или привязки ролей для пользователя.
Проще говоря, пространства имен позволяют нам разделять объекты в кластере Kubernetes; роли определяют, что пользователь или группа могут делать с объектами; а привязки ролей связывают пользователей и группы с ролями в пространстве имен. (Более полное обсуждение RBAC в Kubernetes см. В разделе Использование авторизации RBAC в справочной документации по Kubernetes.)
Чтобы (в некоторой степени) воспроизвести действия Docker EE для пользователей Swarm для пользователей Kubernetes, нам необходимо определить соответствующее пространство имен, роль и связывание ролей для них.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
kind: Namespace apiVersion: v1 metadata: name: user-kenrider --- kind: Role apiVersion: rbac.authorization.k8s.io/v1 metadata: name: user-kenrider-full-access namespace: user-kenrider rules: - apiGroups: ["", "extensions", "apps"] resources: ["*"] verbs: ["*"] - apiGroups: ["batch"] resources: - jobs - cronjobs verbs: ["*"] --- kind: RoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: labels: subjectName: ken.rider name: ken.rider:user-kenrider-full-access namespace: user-kenrider roleRef: apiGroup: rbac.authorization.k8s.io kind: Role name: user-kenrider-full-access subjects: - apiGroup: rbac.authorization.k8s.io kind: User name: ken.rider |
admin> kubectl apply -f .\user-ken.rider.yml
namespace "user-kenrider" created
role.rbac.authorization.k8s.io "user-kenrider-full-access" created
rolebinding.rbac.authorization.k8s.io "ken.rider:user-kenrider-full-access" created
ken> kubectl --namespace user-kenrider create deployment nginx --image=nginx:1.14-alpine
deployment.extensions "nginx" created
Как контролировать пользователей Kubernetes
Но как только вы выйдете за пределы пары пользователей и / или команд и нескольких пространств имен для них, вам быстро станет трудно отследить, кто может что делать и где.
И со временем, и все больше и больше людей принимают участие в настройке вашего RBAC, это может стать еще более запутанным.
Вы должны иметь свои определения ресурсов RBAC в управлении исходным кодом, но их нелегко прочитать и сложно визуализировать.
Поробуйте плагин с открытым исходным кодом who-can kubectl от Aqua Security.
Он дает вам возможность показать, кто (субъекты) может делать, что (действия), c чем (ресурсы) и где (пространства имен).
Установите менеджер плагинов Krew
Для плагина who-can для kubectl требуется менеджер плагинов krew.
Если у вас еще не установлен krew, инструкции по его установке можно найти в его репозитории GitHub, https://github.com/kubernetes-sigs/krew/.
Чтобы убедиться, что он установлен правильно, вы можете получить список доступных плагинов от kubectl.
$ kubectl plugin list
The following kubectl-compatible plugins are available:
/home/ken.rider/.krew/bin/kubectl-krew
Установите плагин Who-Can
Если у вас есть менеджер плагинов krew для kubectl, установить плагин who-can довольно легко.
1 |
$ kubectl krew install who-can |
Настройка RBAC для нашего кластера
У меня есть кластер Kubernetes, который я собрал в Azure с помощью Docker Enterprise.
Существует 3 (не по умолчанию) пространства имен для разработки, тестирования и производства.
У меня также есть команды для разработки, тестирования, эксплуатации и безопасности, которые я создал как администратор кластера.
Я определил набор RoleBindings для каждого из них.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ kubectl apply -f development-namespace.yaml namespace/development created rolebinding.rbac.authorization.k8s.io/dev-team:development-edit created rolebinding.rbac.authorization.k8s.io/test-team:development-view created rolebinding.rbac.authorization.k8s.io/ops-team:development-admin created rolebinding.rbac.authorization.k8s.io/sec-team:development-view created $ kubectl apply -f test-namespace.yaml namespace/test created rolebinding.rbac.authorization.k8s.io/dev-team:test-view created rolebinding.rbac.authorization.k8s.io/test-team:test-edit created rolebinding.rbac.authorization.k8s.io/ops-team:test-admin created rolebinding.rbac.authorization.k8s.io/sec-team:test-view created $ kubectl apply -f production-namespace.yaml namespace/production created rolebinding.rbac.authorization.k8s.io/dev-team:production-view created rolebinding.rbac.authorization.k8s.io/test-team:production-view created rolebinding.rbac.authorization.k8s.io/ops-team:production-admin created rolebinding.rbac.authorization.k8s.io/sec-team:production-view created |
Использование who-can
После того, как вы установили who-can, вы увидите, что его использование будет очень простым.
1 |
$ kubectl kubectl who-can VERB (TYPE | TYPE/NAME | NONRESOURCEURL) [flags] |
Типичный набор действий, которые могут вас заинтересовать, это get
list
watch
create
update
patch
delete
.
Есть еще несколько других действий для определенных типов ресурсов, но, как правило, вы будете наиболее заинтересованы в get
create
delete
.
Типичный набор типов ресурсов, которые могут вас заинтересовать, включают pods
deployments
services
persistentvolumeclaims
configmaps
secrets
Кроме того, с постоянно расширяющимся использованием CustomResourceDefinitions, список типов ресурсов не является бесконечным.
Пример использование Who-Can
Давайте сначала спросим: «Кто может увидеть поды в пространстве имен development?»
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$ kubectl who-can get pods -n development ROLEBINDING NAMESPACE SUBJECT TYPE SA-NAMESPACE dev-team:development-edit development dev-team Group ops-team:development-admin development ops-team Group sec-team:development-view development sec-team Group test-team:development-view development test-team Group CLUSTERROLEBINDING SUBJECT TYPE SA-NAMESPACE cluster-admin system:masters Group compose compose ServiceAccount kube-system compose-auth-view compose ServiceAccount kube-system system:controller:clusterrole-aggregation-controller clusterrole-aggregation-controller ServiceAccount kube-system system:controller:deployment-controller deployment-controller ServiceAccount kube-system system:controller:endpoint-controller endpoint-controller ServiceAccount kube-system system:controller:generic-garbage-collector generic-garbage-collector ServiceAccount kube-system system:controller:namespace-controller namespace-controller ServiceAccount kube-system system:controller:persistent-volume-binder persistent-volume-binder ServiceAccount kube-system system:controller:pvc-protection-controller pvc-protection-controller ServiceAccount kube-system system:controller:statefulset-controller statefulset-controller ServiceAccount kube-system system:kube-scheduler system:kube-scheduler User tiller tiller ServiceAccount kube-system ucp-kube-system:cni-plugin:cluster-admin cni-plugin ServiceAccount kube-system ucp-kube-system:kube-dns:cluster-admin kube-dns ServiceAccount kube-system ucp-kube-system:ucp-metrics:cluster-admin ucp-metrics ServiceAccount kube-system |
Теперь давайте спросим: «Кто может создавать поды в пространстве имен development?».
Здесь мы увидим, что только наши группы development и operations могут создавать там поды.
И список учетных записей системных служб короче:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
$ kubectl who-can create pods -n development ROLEBINDING NAMESPACE SUBJECT TYPE SA-NAMESPACE dev-team:development-edit development dev-team Group ops-team:development-admin development ops-team Group CLUSTERROLEBINDING SUBJECT TYPE SA-NAMESPACE cluster-admin system:masters Group system:controller:clusterrole-aggregation-controller clusterrole-aggregation-controller ServiceAccount kube-system system:controller:daemon-set-controller daemon-set-controller ServiceAccount kube-system system:controller:job-controller job-controller ServiceAccount kube-system system:controller:persistent-volume-binder persistent-volume-binder ServiceAccount kube-system system:controller:replicaset-controller replicaset-controller ServiceAccount kube-system system:controller:replication-controller replication-controller ServiceAccount kube-system system:controller:statefulset-controller statefulset-controller ServiceAccount kube-system tiller tiller ServiceAccount kube-system ucp-kube-system:cni-plugin:cluster-admin cni-plugin ServiceAccount kube-system ucp-kube-system:kube-dns:cluster-admin kube-dns ServiceAccount kube-system ucp-kube-system:ucp-metrics:cluster-admin ucp-metrics ServiceAccount kube-system |
Затем мы спросим «кто может обновить что-либо в пространстве имен development?»
1 2 3 4 5 6 7 8 9 10 11 |
$ kubectl who-can update '*' -n development No subjects found with permissions to update * assigned through RoleBindings CLUSTERROLEBINDING SUBJECT TYPE SA-NAMESPACE cluster-admin system:masters Group system:controller:clusterrole-aggregation-controller clusterrole-aggregation-controller ServiceAccount kube-system system:controller:generic-garbage-collector generic-garbage-collector ServiceAccount kube-system tiller tiller ServiceAccount kube-system ucp-kube-system:cni-plugin:cluster-admin cni-plugin ServiceAccount kube-system ucp-kube-system:kube-dns:cluster-admin kube-dns ServiceAccount kube-system ucp-kube-system:ucp-metrics:cluster-admin ucp-metrics ServiceAccount kube-system |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$ kubectl who-can delete services -n production ROLEBINDING NAMESPACE SUBJECT TYPE SA-NAMESPACE ops-team:production-admin production ops-team Group CLUSTERROLEBINDING SUBJECT TYPE SA-NAMESPACE cluster-admin system:masters Group system:controller:clusterrole-aggregation-controller clusterrole-aggregation-controller ServiceAccount kube-system system:controller:generic-garbage-collector generic-garbage-collector ServiceAccount kube-system system:controller:namespace-controller namespace-controller ServiceAccount kube-system system:controller:persistent-volume-binder persistent-volume-binder ServiceAccount kube-system tiller tiller ServiceAccount kube-system ucp-kube-system:cni-plugin:cluster-admin cni-plugin ServiceAccount kube-system ucp-kube-system:kube-dns:cluster-admin kube-dns ServiceAccount kube-system ucp-kube-system:ucp-metrics:cluster-admin ucp-metrics ServiceAccount kube-system |