Skip to content

Kubernetes_rbac

Role-Based Access Control (RBAC) is a method of regulating access to Kubernetes resources based on the roles of individual users or service accounts within a cluster.

┌─────────────────────────────────────────────────────────────────┐
│ RBAC Authorization │
│ │
│ ┌────────────────┐ ┌────────────────┐ │
│ │ Role │────────▶│ RoleBinding │ │
│ │ (namespace) │ │ (namespace) │ │
│ └────────────────┘ └────────────────┘ │
│ │ │ │
│ │ ▼ │
│ │ ┌────────────────┐ │
│ └────────────────▶│ Subject │ │
│ │ (User/Group/ │ │
│ │ ServiceAccount│ │
│ └────────────────┘ │
│ │
│ ┌────────────────┐ ┌────────────────┐ │
│ │ ClusterRole │───────▶│ClusterRoleBinding│ │
│ │ (cluster-wide)│ │ (cluster-wide) │ │
│ └────────────────┘ └────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
ObjectScopeDescription
RoleNamespaceGrants permissions within a specific namespace
ClusterRoleClusterGrants permissions cluster-wide or to cluster-scoped resources
RoleBindingNamespaceBinds a Role or ClusterRole to subjects within a namespace
ClusterRoleBindingClusterBinds a ClusterRole to subjects cluster-wide
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: secret-reader
rules:
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list", "watch"]
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: myapp
name: myapp-admin
rules:
# Rule 1: Pods
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch", "create", "update", "delete"]
# Rule 2: ConfigMaps
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get", "list", "watch", "create", "update", "delete"]
# Rule 3: Services
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "list", "watch", "create", "update", "delete"]
# Rule 4: Deployments
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "watch", "create", "update", "delete", "patch"]

Common verbs:

  • get - Read single resource
  • list - List resources
  • watch - Watch for changes
  • create - Create new resources
  • update - Update existing resources
  • patch - Partially update resources
  • delete - Delete resources
  • deletecollection - Delete multiple resources
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default
subjects:
# User
- kind: User
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
subjects:
# Group
- kind: Group
name: developers
apiGroup: rbac.authorization.k8s.io
subjects:
# ServiceAccount
- kind: ServiceAccount
name: myapp-sa
namespace: myapp

Grant cluster-wide access:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: read-all-pods
subjects:
- kind: User
name: admin-user
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: pod-reader-cluster
apiGroup: rbac.authorization.k8s.io

ClusterRoles can be bound to specific namespaces:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods-in-namespace
namespace: myapp
subjects:
- kind: User
name: jane
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: pod-reader # Reuse cluster-wide role
apiGroup: rbac.authorization.k8s.io

Kubernetes provides many built-in ClusterRoles:

Terminal window
# List built-in ClusterRoles
kubectl get clusterroles

Key built-in roles:

ClusterRoleDescription
adminFull access within a namespace
editRead/write access to most resources
viewRead-only access to most resources
cluster-adminSuper-user access
system:nodeRequired for kubelet
system:kube-schedulerRequired for scheduler
system:controller:*Required for controllers
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: development
name: developer
rules:
# Deployments, StatefulSets, DaemonSets
- apiGroups: ["apps"]
resources: ["deployments", "statefulsets", "daemonsets"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
# Pods, Services, ConfigMaps, Secrets (read-only for secrets)
- apiGroups: [""]
resources: ["pods", "services", "configmaps", "endpoints"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
- apiGroups: [""]
resources: ["secrets"]
verbs: ["get", "list", "watch"]
# Jobs, CronJobs
- apiGroups: ["batch"]
resources: ["jobs", "cronjobs"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
# Ingress
- apiGroups: ["networking.k8s.io"]
resources: ["ingresses"]
verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: production
name: viewer
rules:
- apiGroups: ["*"]
resources: ["*"]
verbs: ["get", "list", "watch"]
# Create ServiceAccount
apiVersion: v1
kind: ServiceAccount
metadata:
name: ci-pipeline
namespace: myapp
---
# Create Role for deployments
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: myapp
name: ci-deployer
rules:
- apiGroups: ["apps"]
resources: ["deployments"]
verbs: ["get", "list", "watch", "update", "patch"]
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["pods/log"]
verbs: ["get", "list"]
---
# Bind Role to ServiceAccount
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: ci-deployer-binding
namespace: myapp
subjects:
- kind: ServiceAccount
name: ci-pipeline
namespace: myapp
roleRef:
kind: Role
name: ci-deployer
apiGroup: rbac.authorization.k8s.io

Use labels to aggregate rules:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: custom-metrics-reader
labels:
rbac.example.com/aggregate-to-monitoring: "true"
rules:
- apiGroups: ["custom.metrics.k8s.io"]
resources: ["*"]
verbs: ["get", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: monitoring-reader
aggregationRule:
clusterRoleSelectors:
- matchLabels:
rbac.example.com/aggregate-to-monitoring: "true"
rules: [] # Rules are automatically aggregated
Terminal window
# Check what permissions a user has
kubectl auth can-i get pods --as=jane
# Check namespace permissions
kubectl auth can-i get pods -n myapp --as=jane
# Check if user can create deployments
kubectl auth can-i create deployments --as=jane
# List all permissions (as admin)
kubectl auth can-i --list --as=jane
Terminal window
# Check RoleBindings in a namespace
kubectl get rolebindings -n <namespace>
# Describe a RoleBinding
kubectl describe rolebinding <name> -n <namespace>
# Check ClusterRoleBindings
kubectl get clusterrolebindings
# Describe a ClusterRoleBinding
kubectl describe clusterrolebinding <name>
# Show roles and bindings for a user
kubectl auth reconcile -f my-rbac-config.yaml
# Create namespace
apiVersion: v1
kind: Namespace
metadata:
name: team-a
---
# Grant admin access to namespace
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: team-a-admin
namespace: team-a
subjects:
- kind: Group
name: team-a
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: admin
apiGroup: rbac.authorization.k8s.io
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: cross-namespace-reader
rules:
- apiGroups: [""]
resources: ["pods", "services"]
verbs: ["get", "list", "watch"]
- apiGroups: [""]
resources: ["namespaces"]
resourceNames: ["frontend", "backend"]
verbs: ["get", "list", "watch"]
  1. Use ServiceAccounts for applications: Don’t use default user credentials
  2. Principle of least privilege: Grant minimum required permissions
  3. Use namespace-scoped roles: Prefer Role over ClusterRole when possible
  4. Document RBAC policies: Keep RBAC configuration in version control
  5. Audit regularly: Review who has access to what
  6. Use groups: Assign permissions to groups, not individual users
  7. Test before production: Verify permissions work as expected

RBAC is essential for:

  • Security: Control who can access what
  • Compliance: Meet regulatory requirements
  • Multi-tenancy: Isolate teams and workloads
  • Auditing: Track access patterns

Key concepts:

  • Role/ClusterRole: Define what can be done
  • RoleBinding/ClusterRoleBinding: Define who can do it
  • Subjects: Users, Groups, or ServiceAccounts
  • Verbs: Actions that can be performed
  • Resources: API objects being accessed