Что такое Kubernetes forbidden: User cannot get resource?

Ошибка Kubernetes forbidden: User cannot get resource возникает, когда пользователь или сервисный аккаунт не имеет необходимых прав доступа для выполнения операции с ресурсом в кластере Kubernetes.

Причины возникновения

  • Отсутствие необходимых RBAC ролей
  • Неправильная конфигурация ClusterRole или Role
  • Отсутствие RoleBinding или ClusterRoleBinding
  • Неправильный namespace для ресурса
  • Истекший или недействительный токен
  • Проблемы с конфигурацией ServiceAccount
  • Ограничения в NetworkPolicy

Как отладить ошибку

  1. Проверь текущего пользователя - убедись в правильности контекста
  2. Проверь RBAC роли - изучи права доступа
  3. Проверь RoleBinding - убедись в привязке ролей
  4. Проверь namespace - убедись в правильности пространства имен
  5. Проверь токен - убедись в действительности credentials

Как исправить ошибку

1. Проверь текущего пользователя и права

1# Проверь текущего пользователя
2kubectl config view --minify
3
4# Проверь права доступа
5kubectl auth can-i get pods
6kubectl auth can-i create deployments
7
8# Проверь права для конкретного namespace
9kubectl auth can-i get pods --namespace=default

2. Создай правильную RBAC роль

 1# Создай Role для доступа к подам
 2apiVersion: rbac.authorization.k8s.io/v1
 3kind: Role
 4metadata:
 5  namespace: default
 6  name: pod-reader
 7rules:
 8- apiGroups: [""]
 9  resources: ["pods"]
10  verbs: ["get", "list", "watch"]
11
12# Создай ClusterRole для доступа ко всем namespace
13apiVersion: rbac.authorization.k8s.io/v1
14kind: ClusterRole
15metadata:
16  name: pod-reader-cluster
17rules:
18- apiGroups: [""]
19  resources: ["pods"]
20  verbs: ["get", "list", "watch"]

3. Создай RoleBinding

 1# Привяжи роль к пользователю
 2apiVersion: rbac.authorization.k8s.io/v1
 3kind: RoleBinding
 4metadata:
 5  name: pod-reader-binding
 6  namespace: default
 7subjects:
 8- kind: User
 9  name: your-username
10  apiGroup: rbac.authorization.k8s.io
11roleRef:
12  kind: Role
13  name: pod-reader
14  apiGroup: rbac.authorization.k8s.io
15
16# Или для сервисного аккаунта
17apiVersion: rbac.authorization.k8s.io/v1
18kind: RoleBinding
19metadata:
20  name: pod-reader-binding
21  namespace: default
22subjects:
23- kind: ServiceAccount
24  name: my-service-account
25  namespace: default
26roleRef:
27  kind: Role
28  name: pod-reader
29  apiGroup: rbac.authorization.k8s.io

4. Создай ServiceAccount с правильными правами

 1# Создай ServiceAccount
 2apiVersion: v1
 3kind: ServiceAccount
 4metadata:
 5  name: my-service-account
 6  namespace: default
 7
 8# Создай Role для ServiceAccount
 9apiVersion: rbac.authorization.k8s.io/v1
10kind: Role
11metadata:
12  namespace: default
13  name: my-service-role
14rules:
15- apiGroups: [""]
16  resources: ["pods", "services"]
17  verbs: ["get", "list", "create", "update", "delete"]
18
19# Привяжи роль к ServiceAccount
20apiVersion: rbac.authorization.k8s.io/v1
21kind: RoleBinding
22metadata:
23  name: my-service-binding
24  namespace: default
25subjects:
26- kind: ServiceAccount
27  name: my-service-account
28  namespace: default
29roleRef:
30  kind: Role
31  name: my-service-role
32  apiGroup: rbac.authorization.k8s.io

5. Используй ServiceAccount в поде

 1apiVersion: v1
 2kind: Pod
 3metadata:
 4  name: my-pod
 5  namespace: default
 6spec:
 7  serviceAccountName: my-service-account
 8  containers:
 9  - name: my-container
10    image: my-app:latest

6. Проверь и обнови токен

1# Создай новый токен для ServiceAccount
2kubectl create token my-service-account
3
4# Или получи токен из секрета
5kubectl get secret my-service-account-token-xyz -o jsonpath='{.data.token}' | base64 -d
6
7# Обнови kubeconfig с новым токеном
8kubectl config set-credentials my-user --token=new-token

Как мониторить подобные ошибки

  • Настрой алерты на forbidden ошибки
  • Мониторь попытки доступа к ресурсам
  • Отслеживай изменения в RBAC конфигурации
  • Логируй все попытки доступа
  • Настрой аудит для отслеживания доступа

FAQ

В: Как проверить права пользователя?

О: Используй kubectl auth can-i для проверки конкретных прав доступа.

В: Что делать, если ServiceAccount не работает?

О: Проверь существование ServiceAccount, правильность RoleBinding и действительность токена.

В: Как дать права на все namespace?

О: Используй ClusterRole и ClusterRoleBinding вместо Role и RoleBinding.

Лучшие практики

  • Следуй принципу минимальных привилегий
  • Регулярно пересматривай права доступа
  • Используй ServiceAccount для приложений
  • Документируй RBAC конфигурацию
  • Настрой мониторинг доступа к ресурсам