Управление доступом на основе ролей в Kubernetes

KubernetesBeginner
Практиковаться сейчас

Введение

В кластере Kubernetes для управления доступом к ресурсам и операциям в рамках кластера используется система контроля доступа на основе ролей (Role-Based Access Control, RBAC). RBAC позволяет администраторам кластера определять роли и разрешения для пользователей, групп и учетных записей служб, чтобы контролировать доступ к ресурсам и операциям в кластере. В этом лабораторном занятии (LabEx) вы научитесь использовать RBAC для управления доступом к ресурсам в кластере Kubernetes.

Запустите кластер Minikube

Перед созданием ресурсов вам нужен работающий кластер Kubernetes. Minikube - это легковесная среда Kubernetes, которая запускается на вашем локальном компьютере.

  1. Перейдите в рабочую директорию:

    Откройте терминал и перейдите в папку проекта по умолчанию:

    cd /home/labex/project
    
  2. Запустите Minikube:

    Запустите Minikube для инициализации кластера Kubernetes:

    minikube start
    
    • Эта команда настраивает однодневный кластер Kubernetes на вашем локальном компьютере.
    • В зависимости от производительности вашей системы запуск Minikube может занять несколько минут.
  3. Проверьте, что Minikube запущен:

    Проверьте статус кластера Minikube:

    minikube status
    
    • Проверьте, чтобы компоненты, такие как kubelet и apiserver, были перечислены как Running (работающие).
    • Если кластер не запущен, запустите команду minikube start снова.

Если у вас возникли проблемы при запуске Minikube, используйте команду minikube delete для сброса среды при необходимости.

Создайте пространство имен (Namespace)

Создайте новое пространство имен с именем myapp с помощью следующей команды:

kubectl create namespace myapp

Создайте роль (Role)

Создайте новую роль с именем myapp-reader в пространстве имен (namespace) myapp, которая позволяет пользователям читать поды (pods) и сервисы (services) в этом пространстве имен, используя следующий YAML-файл с именем myapp-reader-role.yaml:

kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  namespace: myapp
  name: myapp-reader
rules:
  - apiGroups: [""]
    resources: ["pods", "services"]
    verbs: ["get", "watch", "list"]

Эта роль позволяет пользователям читать (получать, отслеживать и перечислять) поды и сервисы в пространстве имен myapp.

Создайте роль с помощью следующей команды:

kubectl apply -f myapp-reader-role.yaml

Создайте привязку роли (Role Binding)

Создайте привязку роли, которая связывает роль myapp-reader с пользователем или группой в пространстве имен (namespace) myapp. Например, чтобы связать роль myapp-reader с пользователем developer в пространстве имен myapp, создайте следующий YAML-файл с именем myapp-reader-binding.yaml:

kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: myapp-reader-binding
  namespace: myapp
subjects:
  - kind: User
    name: developer
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: Role
  name: myapp-reader
  apiGroup: rbac.authorization.k8s.io

Эта привязка роли связывает роль myapp-reader с пользователем developer в пространстве имен myapp.

Создайте привязку роли с помощью следующей команды:

kubectl apply -f myapp-reader-binding.yaml

Тестирование доступа

Протестируйте доступ к пространству имен (namespace) myapp, попробовав получить список подов (pods) в этом пространстве имен с помощью следующей команды:

kubectl get pods -n myapp --as developer

Вы должны увидеть сообщение, которое указывает на то, что в пространстве имен myapp нет ресурсов, так как в вашем кластере, возможно, нет подов. Когда вы закончите работу с лабораторной работой, используйте эту команду, и вы должны увидеть список подов в пространстве имен myapp.

Протестируйте доступ к пространству имен default, попробовав получить список подов в этом пространстве имен с помощью следующей команды:

kubectl get pods --as developer

Вы должны увидеть сообщение об ошибке, которое указывает на то, что у вас нет доступа к пространству имен default.

Создайте кластерную роль (ClusterRole)

Создайте новую кластерную роль с именем myapp-admin, которая позволяет пользователям создавать, удалять и обновлять поды (pods) и сервисы (services) во всех пространствах имен (namespaces), используя следующий YAML-файл с именем myapp-admin-clusterrole.yaml:

kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: myapp-admin
rules:
  - apiGroups: [""]
    resources: ["pods", "services"]
    verbs: ["get", "list", "watch", "create", "update", "delete"]

Эта кластерная роль позволяет пользователям выполнять все операции (получать, перечислять, отслеживать, создавать, обновлять и удалять) с подами и сервисами во всех пространствах имен.

Создайте кластерную роль с помощью следующей команды:

kubectl apply -f myapp-admin-clusterrole.yaml

Создайте привязку кластерной роли (ClusterRole Binding)

Создайте привязку кластерной роли, которая связывает кластерную роль myapp-admin с пользователем или группой в кластере. Например, чтобы связать кластерную роль myapp-admin с пользователем cluster-admin, создайте следующий YAML-файл с именем myapp-admin-binding.yaml:

kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
  name: myapp-admin-binding
subjects:
  - kind: User
    name: cluster-admin
    apiGroup: rbac.authorization.k8s.io
roleRef:
  kind: ClusterRole
  name: myapp-admin
  apiGroup: rbac.authorization.k8s.io

Эта привязка кластерной роли связывает кластерную роль myapp-admin с пользователем cluster-admin.

Создайте привязку кластерной роли с помощью следующей команды:

kubectl apply -f myapp-admin-binding.yaml

Тестирование доступа

Протестируйте доступ для создания пода (pod) в пространстве имен (namespace) myapp, создав под с использованием следующего YAML-файла с именем myapp-pod.yaml:

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  namespace: myapp
spec:
  containers:
    - name: myapp-container
      image: nginx
      ports:
        - containerPort: 80

Создайте под с помощью следующей команды:

kubectl apply -f myapp-pod.yaml --as cluster-admin

Вы должны увидеть сообщение, которое указывает на то, что под был создан.

Протестируйте доступ для создания развертывания (deployment) в пространстве имен myapp, создав развертывание с использованием следующего YAML-файла myapp-deployment.yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: myapp-deployment
  namespace: myapp
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp-deployment
  template:
    metadata:
      labels:
        app: myapp-deployment
    spec:
      containers:
        - name: nginx
          image: nginx:latest
          ports:
            - containerPort: 80

Создайте под с помощью следующей команды:

kubectl apply -f myapp-deployment.yaml --as cluster-admin

Вы должны увидеть сообщение об ошибке, которое указывает на то, что у вас нет доступа для создания развертывания в пространстве имен myapp.

Резюме

В этой лабораторной работе вы научились использовать систему управления доступом на основе ролей (Role-Based Access Control, RBAC) в Kubernetes для контроля доступа к ресурсам и операциям в кластере. Вы создали пространство имен (namespace), роль (Role) и привязку роли (Role Binding) для контроля доступа к ресурсам в определенном пространстве имен. Вы также создали кластерную роль (ClusterRole) и привязку кластерной роли (ClusterRole Binding) для контроля доступа к ресурсам во всех пространствах имен. По завершении этой лабораторной работы вы должны хорошо понимать, как использовать RBAC для контроля доступа к ресурсам и операциям в кластере Kubernetes.