Skip to content

Создание изолированных сред для разработчиков с использованием RBAC

Создание изолированных сред для разработчиков и команд является важной практикой, особенно в контексте обучения и разработки. Это позволяет обеспечить безопасность, управляемость и контроль над доступом к ресурсам. В этой статье мы рассмотрим, как создать пространство имен (namespace) в Kubernetes и настроить Service Account с ограниченным доступом, используя систему контроля доступа на основе ролей (RBAC).

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

Прежде чем настроить доступ, необходимо создать пространство имен. Допустим, наше пространство имен называется mynamespace.

kubectl create namespace mynamespace

2. Создание Service Account и настройка RBAC

Создадим Service Account, который имеет доступ только к этому конкретному пространству имен, используя систему контроля доступа на основе ролей (RBAC) Kubernetes.

---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: mynamespace-user
  namespace: mynamespace

---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: mynamespace-user-full-access
  namespace: mynamespace
rules:
- apiGroups: ["", "extensions", "apps"]
  resources: ["*"]
  verbs: ["*"]
- apiGroups: ["batch"]
  resources:
  - jobs
  - cronjobs
  verbs: ["*"]

---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1beta1
metadata:
  name: mynamespace-user-view
  namespace: mynamespace
subjects:
- kind: ServiceAccount
  name: mynamespace-user
  namespace: mynamespace
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: mynamespace-user-full-access

3. Получение токена и сертификата

  1. получить имя секрета из сервисного аккаунта kubectl describe sa mynamespace-user -n mynamespace
  2. получить токены,допустим что получили имя токена mynamespace-user-token-xxxxx
    • Вот как получить токен пользователя: kubectl get secret mynamespace-user-token-xxxxx -n mynamespace -o "jsonpath={.data.token}" | base64 -D
    • А вот как получить сертификат: kubectl get secret mynamespace-user-token-xxxxx -n mynamespace -o "jsonpath={.data['ca\.crt']}"

4. Собираем kube config:

Соберем файл конфигурации для Kubernetes (kube config), используя полученные токен и сертификат.

apiVersion: v1
kind: Config
preferences: {}

# Define the cluster
clusters:
- cluster:
    certificate-authority-data: PLACE CERTIFICATE HERE
    # You'll need the API endpoint of your Cluster here:
    server: https://YOUR_KUBERNETES_API_ENDPOINT
  name: my-cluster

# Define the user
users:
- name: mynamespace-user
  user:
    as-user-extra: {}
    client-key-data: PLACE CERTIFICATE HERE
    token: PLACE USER TOKEN HERE

# Define the context: linking a user to a cluster
contexts:
- context:
    cluster: my-cluster
    namespace: mynamespace
    user: mynamespace-user
  name: mynamespace

# Define current context
current-context: mynamespace

Не забудьте заменить PLACE_CERTIFICATE_HERE на ваш сертификат, а PLACE_USER_TOKEN_HERE на ваш токен.

Примечание. Другой способ написать конфиг – напрямую использовать kubectl.

Теперь можно передать этот файл конфигурации Kube пользователю, которому предоставить доступ.