| name | debugging-k8s-rbac |
| description | Debugs Kubernetes RBAC and permission issues including Forbidden errors, ServiceAccount permissions, Role/RoleBinding, and ClusterRole/ClusterRoleBinding problems. Use when seeing permission denied, forbidden errors, or ServiceAccount access issues. |
| allowed-tools | Bash |
Debugging Kubernetes RBAC
Investigates permission and access control issues.
Common RBAC Issues
| Symptom | Likely Cause | First Check |
|---|
| Forbidden error | Missing permission | auth can-i test |
| ServiceAccount can't access | Missing RoleBinding | Check bindings |
| Cross-namespace access denied | Need ClusterRole | Scope of role |
| API access denied in pod | Wrong ServiceAccount | Pod's SA |
Investigation Workflow
Step 1: Test Permissions
kubectl auth can-i <verb> <resource> -n <ns>
kubectl auth can-i <verb> <resource> -n <ns> \
--as=system:serviceaccount:<namespace>:<serviceaccount>
kubectl auth can-i --list \
--as=system:serviceaccount:<namespace>:<serviceaccount>
Common verbs: get, list, watch, create, update, patch, delete
Step 2: Check Pod's ServiceAccount
kubectl get pod <pod> -n <ns> -o jsonpath='{.spec.serviceAccountName}'
kubectl get serviceaccount <sa> -n <ns> -o yaml
kubectl get serviceaccount -n <ns>
Step 3: Check RoleBindings
kubectl get rolebinding -n <ns>
kubectl describe rolebinding <binding> -n <ns>
kubectl get clusterrolebinding
kubectl get rolebinding,clusterrolebinding -A -o json | \
jq '.items[] | select(.subjects[]?.name=="<serviceaccount>") | .metadata.name'
Step 4: Check Roles
kubectl get role -n <ns>
kubectl describe role <role> -n <ns>
kubectl get clusterrole
kubectl describe clusterrole <role>
RBAC Components
ServiceAccount (identity)
↓
RoleBinding/ClusterRoleBinding (connects identity to permissions)
↓
Role/ClusterRole (defines permissions)
| Component | Scope | Use For |
|---|
| Role | Namespace | Namespace-scoped resources |
| ClusterRole | Cluster | Cluster-scoped or cross-namespace |
| RoleBinding | Namespace | Grants Role/ClusterRole in namespace |
| ClusterRoleBinding | Cluster | Grants ClusterRole cluster-wide |
Specific Issues
Pod Can't Access Kubernetes API
kubectl get pod <pod> -n <ns> -o jsonpath='{.spec.serviceAccountName}'
kubectl auth can-i --list --as=system:serviceaccount:<ns>:<sa>
kubectl get pod <pod> -n <ns> -o jsonpath='{.spec.automountServiceAccountToken}'
Forbidden on Specific Resource
kubectl auth can-i get pods -n <ns> --as=system:serviceaccount:<ns>:<sa>
kubectl get roles -n <ns> -o json | jq '.items[] | select(.rules[].resources[] | contains("pods"))'
Cross-Namespace Access
For cross-namespace access, need:
- ClusterRole (not Role)
- RoleBinding in each target namespace, OR
- ClusterRoleBinding
kubectl get clusterrole <role>
kubectl get rolebinding -n <target-ns>
Quick Permission Check
SA="system:serviceaccount:<ns>:<sa>"
kubectl auth can-i get pods -n <ns> --as=$SA
kubectl auth can-i list secrets -n <ns> --as=$SA
kubectl auth can-i create deployments -n <ns> --as=$SA
kubectl auth can-i get nodes --as=$SA
Debugging Pattern
kubectl auth can-i get pods -n default --as=system:serviceaccount:default:myapp
kubectl get rolebinding,clusterrolebinding -A -o wide | grep myapp
kubectl describe role <role> -n <ns>
Notes
- Default ServiceAccount has minimal permissions
- Pods use
default ServiceAccount unless specified
- ClusterRoleBindings affect all namespaces
- Token automounting can be disabled for security