Bird
Raised Fist0
Kubernetesdevops~5 mins

Roles and ClusterRoles in Kubernetes - Commands & Configuration

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Introduction
In Kubernetes, you need to control who can do what inside your cluster. Roles and ClusterRoles help you set these permissions safely. They let you decide which users or apps can access or change resources.
When you want to allow a user to only read pods in a specific namespace without giving full access.
When you need to let a service account create deployments across all namespaces.
When you want to restrict access so a user can only update config maps in one namespace.
When you want to give cluster-wide permissions to monitor nodes and system components.
When you want to separate permissions for different teams working in different namespaces.
Config File - role.yaml
role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  namespace: example-namespace
  name: pod-reader
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "watch", "list"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: node-reader
rules:
- apiGroups: [""]
  resources: ["nodes"]
  verbs: ["get", "watch", "list"]

This file defines two permission sets:

  • Role: Named pod-reader limited to example-namespace. It allows reading pods only in that namespace.
  • ClusterRole: Named node-reader with permissions to read nodes across the whole cluster.
Commands
This command creates the Role and ClusterRole in Kubernetes so you can assign them to users or service accounts.
Terminal
kubectl apply -f role.yaml
Expected OutputExpected
role.rbac.authorization.k8s.io/pod-reader created clusterrole.rbac.authorization.k8s.io/node-reader created
This command lists all Roles in the example-namespace to verify the pod-reader Role was created.
Terminal
kubectl get roles -n example-namespace
Expected OutputExpected
NAME AGE pod-reader 10s
-n - Specifies the namespace to look in
This command lists all ClusterRoles in the cluster to verify the node-reader ClusterRole was created.
Terminal
kubectl get clusterroles
Expected OutputExpected
NAME AGE node-reader 10s admin 1d cluster-admin 1d view 1d
This command shows detailed information about the pod-reader Role, including its permissions.
Terminal
kubectl describe role pod-reader -n example-namespace
Expected OutputExpected
Name: pod-reader Labels: <none> Annotations: <none> PolicyRule: Resources Non-Resource URLs Resource Names Verbs --------- ----------------- -------------- ----- pods [] [] [get watch list]
-n - Specifies the namespace of the Role
Key Concept

Roles define permissions within a namespace, while ClusterRoles define permissions cluster-wide.

Common Mistakes
Trying to use a Role to grant permissions across all namespaces.
Roles only work inside a single namespace and cannot grant cluster-wide access.
Use a ClusterRole when you need permissions across all namespaces.
Not specifying the namespace when creating or viewing a Role.
Roles are namespace-scoped, so missing the namespace causes errors or shows no results.
Always use the -n flag with kubectl commands for Roles.
Assigning ClusterRoles without proper binding to users or service accounts.
Roles and ClusterRoles alone do not grant access until bound with RoleBinding or ClusterRoleBinding.
Create RoleBinding or ClusterRoleBinding to link roles to users or service accounts.
Summary
Create Roles for permissions limited to a namespace and ClusterRoles for cluster-wide permissions.
Use kubectl apply to create these roles from YAML files.
Verify roles with kubectl get and kubectl describe commands specifying namespaces when needed.

Practice

(1/5)
1. What is the main difference between a Role and a ClusterRole in Kubernetes?
easy
A. Role applies permissions within a single namespace, ClusterRole applies cluster-wide.
B. Role applies cluster-wide, ClusterRole applies within a single namespace.
C. Role is for users, ClusterRole is for service accounts only.
D. Role manages nodes, ClusterRole manages pods.

Solution

  1. Step 1: Understand Role scope

    A Role defines permissions limited to a specific namespace in Kubernetes.
  2. Step 2: Understand ClusterRole scope

    A ClusterRole defines permissions that can apply across all namespaces or cluster-wide resources.
  3. Final Answer:

    Role applies permissions within a single namespace, ClusterRole applies cluster-wide. -> Option A
  4. Quick Check:

    Role = namespace, ClusterRole = cluster-wide [OK]
Hint: Role = namespace only, ClusterRole = whole cluster [OK]
Common Mistakes:
  • Confusing Role and ClusterRole scopes
  • Thinking ClusterRole is only for nodes
  • Assuming Role applies cluster-wide
2. Which of the following is the correct YAML snippet to create a Role that allows reading pods in a namespace?
easy
A. apiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n name: pod-reader\nrules:\n- apiGroups: ['']\n resources: ['pods']\n verbs: ['get', 'watch', 'list']
B. apiVersion: rbac.authorization.k8s.io/v1\nkind: ClusterRole\nmetadata:\n name: pod-reader\nrules:\n- apiGroups: ['']\n resources: ['pods']\n verbs: ['create', 'delete']
C. apiVersion: rbac.authorization.k8s.io/v1\nkind: RoleBinding\nmetadata:\n name: pod-reader-binding\nroleRef:\n kind: Role\n name: pod-reader\nsubjects:\n- kind: User\n name: alice
D. apiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n name: pod-reader\nrules:\n- apiGroups: ['apps']\n resources: ['pods']\n verbs: ['get', 'watch', 'list']

Solution

  1. Step 1: Check kind and apiVersion

    The resource is a Role with apiVersion rbac.authorization.k8s.io/v1, which is correct for RBAC.
  2. Step 2: Verify rules for reading pods

    Pods are in the core API group (empty string), and verbs for reading are get, watch, and list. apiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n name: pod-reader\nrules:\n- apiGroups: ['']\n resources: ['pods']\n verbs: ['get', 'watch', 'list'] matches this exactly.
  3. Final Answer:

    The YAML snippet with kind: Role, apiGroups: [''], resources: ['pods'], verbs: ['get', 'watch', 'list']. -> Option A
  4. Quick Check:

    Role + core API + read verbs = apiVersion: rbac.authorization.k8s.io/v1\nkind: Role\nmetadata:\n name: pod-reader\nrules:\n- apiGroups: ['']\n resources: ['pods']\n verbs: ['get', 'watch', 'list'] [OK]
Hint: Role for namespace, core API group is empty string [''] [OK]
Common Mistakes:
  • Using ClusterRole instead of Role for namespace scope
  • Wrong apiGroups value like 'apps' for pods
  • Confusing RoleBinding with Role definition
3. Given this RoleBinding YAML snippet, what namespace will the binding apply to?
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: dev
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
subjects:
- kind: User
  name: jane
medium
A. default namespace
B. Cluster-wide
C. kube-system namespace
D. dev namespace

Solution

  1. Step 1: Check metadata namespace in RoleBinding

    The RoleBinding has namespace: dev in its metadata, so it applies in the 'dev' namespace.
  2. Step 2: Understand RoleBinding scope

    RoleBindings are namespace-scoped, so they only apply in the namespace where they are created.
  3. Final Answer:

    The RoleBinding applies to the dev namespace. -> Option D
  4. Quick Check:

    RoleBinding namespace = binding scope [OK]
Hint: RoleBinding namespace field sets scope [OK]
Common Mistakes:
  • Assuming RoleBinding applies cluster-wide
  • Confusing RoleBinding with ClusterRoleBinding
  • Ignoring the metadata namespace field
4. You created a ClusterRoleBinding but users report they cannot access cluster resources. Which is the most likely mistake?
medium
A. The subjects field is missing the user names.
B. The roleRef kind is set to Role instead of ClusterRole.
C. The ClusterRoleBinding is created in a namespace.
D. The apiVersion is set to v1 instead of rbac.authorization.k8s.io/v1.

Solution

  1. Step 1: Check roleRef kind for ClusterRoleBinding

    A ClusterRoleBinding must reference a ClusterRole in its roleRef.kind. Using Role is invalid and prevents access.
  2. Step 2: Verify other fields

    While missing subjects or wrong apiVersion cause issues, the most common cause is wrong roleRef.kind. ClusterRoleBindings are cluster-scoped and do not belong to namespaces.
  3. Final Answer:

    The roleRef kind must be ClusterRole, not Role. -> Option B
  4. Quick Check:

    ClusterRoleBinding needs ClusterRole in roleRef [OK]
Hint: ClusterRoleBinding must reference ClusterRole kind [OK]
Common Mistakes:
  • Using Role instead of ClusterRole in roleRef
  • Creating ClusterRoleBinding in a namespace
  • Forgetting to specify subjects
5. You want to allow a user to list pods in all namespaces but only create pods in the 'test' namespace. Which combination of Kubernetes RBAC objects should you create?
hard
A. A ClusterRoleBinding granting create pods cluster-wide.
B. A single Role with both permissions in the 'test' namespace.
C. A ClusterRole with list pods permission and a Role with create pods permission, plus respective bindings.
D. A RoleBinding in 'test' namespace granting list and create pods.

Solution

  1. Step 1: Understand permission scopes

    Listing pods in all namespaces requires a ClusterRole because it is cluster-wide permission.
  2. Step 2: Restrict create pods to 'test' namespace

    Creating pods only in 'test' namespace requires a Role scoped to that namespace.
  3. Step 3: Bind roles to user

    Use a ClusterRoleBinding for the cluster-wide list permission and a RoleBinding for the create permission in 'test'.
  4. Final Answer:

    Create a ClusterRole for list pods and a Role for create pods with bindings. -> Option C
  5. Quick Check:

    ClusterRole = cluster-wide, Role = namespace [OK]
Hint: Use ClusterRole for cluster-wide, Role for namespace-specific [OK]
Common Mistakes:
  • Trying to use a single Role for cluster-wide permissions
  • Using ClusterRoleBinding for namespace-only permissions
  • Not creating separate bindings for each role