Что такое Kubernetes forbidden: User cannot get resource?
Ошибка Kubernetes forbidden: User cannot get resource
возникает, когда пользователь или сервисный аккаунт не имеет необходимых прав доступа для выполнения операции с ресурсом в кластере Kubernetes.
Причины возникновения
- Отсутствие необходимых RBAC ролей
- Неправильная конфигурация ClusterRole или Role
- Отсутствие RoleBinding или ClusterRoleBinding
- Неправильный namespace для ресурса
- Истекший или недействительный токен
- Проблемы с конфигурацией ServiceAccount
- Ограничения в NetworkPolicy
Как отладить ошибку
- Проверь текущего пользователя - убедись в правильности контекста
- Проверь RBAC роли - изучи права доступа
- Проверь RoleBinding - убедись в привязке ролей
- Проверь namespace - убедись в правильности пространства имен
- Проверь токен - убедись в действительности credentials
Как исправить ошибку
1. Проверь текущего пользователя и права
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 в поде
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 конфигурацию
- Настрой мониторинг доступа к ресурсам