Qingular

RBAC 权限控制

·CKAk8s练习

RBAC (Role-Based Access Control) 是 Kubernetes 的权限控制机制,用于管理集群资源的访问权限。

← 返回 CKA 练习目录

概述

RBAC (Role-Based Access Control) 是 Kubernetes 的核心授权机制,通过定义角色(Role)和角色绑定(RoleBinding)来控制用户或 ServiceAccount 对集群资源的访问权限。CKA 考试中 RBAC 是必考内容。


核心概念

1. ServiceAccount

ServiceAccount 为 Pod 中运行的进程提供身份标识,用于 API Server 认证。

apiVersion: v1
kind: ServiceAccount
metadata:
  name: my-sa
  namespace: default
# 创建 ServiceAccount
kubectl create serviceaccount my-sa

# 查看 ServiceAccount
kubectl get serviceaccounts
kubectl describe sa my-sa

# 查看 ServiceAccount 的 Secret(自动创建)
kubectl get secrets | grep my-sa

2. Role vs ClusterRole

特性RoleClusterRole
作用范围特定 Namespace整个集群
可授权资源命名空间资源集群资源 + 命名空间资源
适用场景细粒度命名空间权限集群级别管理权限

Role 示例:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: pod-reader
  namespace: default
rules:
- apiGroups: [""]
  resources: ["pods"]
  verbs: ["get", "list", "watch"]
# 创建 Role
kubectl create role pod-reader --verb=get,list,watch --resource=pods
kubectl create role pod-reader --verb=get,list,watch --resource=pods --namespace=default

# 查看 Role
kubectl get roles --all-namespaces
kubectl describe role pod-reader -n default

ClusterRole 示例:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: cluster-admin
rules:
- apiGroups: [""]
  resources: ["nodes", "persistentvolumes", "namespaces"]
  verbs: ["get", "list", "watch", "create", "delete"]
# 创建 ClusterRole
kubectl create clusterrole node-admin --verb=get,list,watch --resource=nodes

# 查看 ClusterRole
kubectl get clusterroles
kubectl describe clusterrole cluster-admin

3. RoleBinding vs ClusterRoleBinding

特性RoleBindingClusterRoleBinding
作用范围特定 Namespace整个集群
绑定对象Role 或 ClusterRole仅 ClusterRole
可绑定主体User, Group, ServiceAccountUser, Group, ServiceAccount

RoleBinding 示例:

apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: read-pods
  namespace: default
subjects:
- kind: ServiceAccount
  name: my-sa
  namespace: default
roleRef:
  kind: Role
  name: pod-reader
  apiGroup: rbac.authorization.k8s.io
# 创建 RoleBinding
kubectl create rolebinding read-pods --role=pod-reader --serviceaccount=default:my-sa
kubectl create rolebinding read-pods --clusterrole=view --serviceaccount=default:my-sa -n default

# 查看 RoleBinding
kubectl get rolebindings --all-namespaces
kubectl describe rolebinding read-pods -n default

ClusterRoleBinding 示例:

# 创建 ClusterRoleBinding
kubectl create clusterrolebinding my-admin --clusterrole=cluster-admin --user=admin-user

# 查看 ClusterRoleBinding
kubectl get clusterrolebindings
kubectl describe clusterrolebinding my-admin

4. RBAC Verbs

Verb含义适用场景
get读取单个资源查询 Pod 详情
list列出资源集合列出所有 Pod
watch监听资源变化实时监控资源
create创建资源创建 Deployment
update更新资源更新副本数
patch部分更新打标签/注解
delete删除资源删除 Pod
deletecollection批量删除删除所有 Pod

5. 常用 RBAC 命令速查

# --- Role 操作 ---
kubectl create role <name> --verb=<verbs> --resource=<resources> [-n <namespace>]
kubectl get roles [-n <namespace>]
kubectl describe role <name> [-n <namespace>]
kubectl delete role <name> [-n <namespace>]

# --- ClusterRole 操作 ---
kubectl create clusterrole <name> --verb=<verbs> --resource=<resources>
kubectl get clusterroles
kubectl describe clusterrole <name>
kubectl delete clusterrole <name>

# --- RoleBinding 操作 ---
kubectl create rolebinding <name> --role=<role-name> --user=<user> [--serviceaccount=<sa>] [-n <namespace>]
kubectl create rolebinding <name> --clusterrole=<clusterrole-name> --user=<user> [-n <namespace>]
kubectl get rolebindings [-n <namespace>]

# --- ClusterRoleBinding 操作 ---
kubectl create clusterrolebinding <name> --clusterrole=<clusterrole-name> --user=<user>
kubectl get clusterrolebindings

# --- 批量操作组合示例 ---
# 创建只读用户
kubectl create serviceaccount readonly-sa
kubectl create rolebinding readonly-binding --clusterrole=view --serviceaccount=default:readonly-sa

# 创建可操作 Pod 的用户(局限在 default 命名空间)
kubectl create role pod-manager --verb=get,list,watch,create,update,delete --resource=pods
kubectl create rolebinding pod-manager-binding --role=pod-manager --serviceaccount=default:ops-sa

6. 验证权限

# 检查当前用户是否有权限
kubectl auth can-i get pods
kubectl auth can-i create deployments

# 检查其他用户的权限
kubectl auth can-i get pods --as system:serviceaccount:default:my-sa

# 检查所有操作权限
kubectl auth can-i --list
kubectl auth can-i --list --as system:serviceaccount:default:my-sa

# 检查特定命名空间下的权限
kubectl auth can-i get pods -n kube-system --as system:serviceaccount:default:my-sa

7. 预置 ClusterRole

Kubernetes 自带四个预置 ClusterRole:

ClusterRole说明
cluster-admin超级管理员,拥有所有权限
admin命名空间管理员,允许读写大部分资源
edit允许读写资源(不含 RBAC 和配额)
view只读权限(不含 Secrets)
# 为用户授予只读权限
kubectl create clusterrolebinding view-binding --clusterrole=view --user=dev-user

# 为 ServiceAccount 授予管理员权限
kubectl create rolebinding sa-admin --clusterrole=admin --serviceaccount=default:app-sa

8. Subjects 字段详解

RoleBinding 和 ClusterRoleBinding 的 subjects 字段支持三种类型:

kind用途示例
UserKubernetes 用户name: "john"
Group用户组name: "developers"
ServiceAccountPod 身份name: "my-sa", namespace: "default"

CKA 考试要点

  1. 快速创建命令:熟练掌握 kubectl create role/clusterrole/rolebinding/clusterrolebinding 的语法
  2. 资源配置规则:Role + ClusterRoleBinding = 跨命名空间权限的重要模式
  3. ServiceAccount 自动挂载:每个 Namespace 自动创建 default ServiceAccount
  4. 权限最小化:考试中注意只授予必要的最小权限
  5. 验证权限:用 kubectl auth can-i 快速验证权限是否正确

🧪 完整操作实例:为应用团队创建受限 RBAC 权限

场景描述

在 namespace team-a 中创建 ServiceAccount ci-bot,授予其仅能创建和查看 Pod 与 Deployment 的权限,禁止删除操作。

前置条件

  • 一个运行中的 Kubernetes 集群
  • 具有 cluster-admin 权限的 kubectl 用户

操作步骤

Step 1: 创建命名空间

kubectl create namespace team-a
# namespace/team-a created

Step 2: 创建 ServiceAccount

kubectl create serviceaccount ci-bot -n team-a
# serviceaccount/ci-bot created

# 验证
kubectl get sa ci-bot -n team-a
# NAME     SECRETS   AGE
# ci-bot   1         5s

Step 3: 创建 Role(授予 Pod 和 Deployment 的 create/get/list/watch 权限)

kubectl create role ci-bot-role -n team-a \
  --verb=get,list,watch,create \
  --resource=pods,deployments
# role.rbac.authorization.k8s.io/ci-bot-role created

# 验证 Role 详情
kubectl describe role ci-bot-role -n team-a

Step 4: 创建 RoleBinding 将 SA 绑定到 Role

kubectl create rolebinding ci-bot-binding -n team-a \
  --role=ci-bot-role \
  --serviceaccount=team-a:ci-bot
# rolebinding.rbac.authorization.k8s.io/ci-bot-binding created

Step 5: 验证权限(auth can-i)

# 验证允许的操作
kubectl auth can-i get pods -n team-a --as system:serviceaccount:team-a:ci-bot
# yes

kubectl auth can-i create deployments -n team-a --as system:serviceaccount:team-a:ci-bot
# yes

# 验证禁止的操作(delete 未被授权)
kubectl auth can-i delete pods -n team-a --as system:serviceaccount:team-a:ci-bot
# no

kubectl auth can-i delete deployments -n team-a --as system:serviceaccount:team-a:ci-bot
# no

Step 6: 实际操作用 SA 的 token 验证(可选)

# 获取 SA 的 token
TOKEN=$(kubectl create token ci-bot -n team-a)

# 测试创建 Pod
kubectl run test-pod --image=nginx -n team-a --token=$TOKEN
# pod/test-pod created

# 测试删除 Pod(应失败)
kubectl delete pod test-pod -n team-a --token=$TOKEN
# Error from server (Forbidden): pods "test-pod" is forbidden: ... ci-bot" is forbidden

验证结果

# 最终权限清单
kubectl auth can-i --list -n team-a --as system:serviceaccount:team-a:ci-bot

考试提示

  • CKA 考试中优先使用 kubectl create rolekubectl create rolebinding 命令式方式,比写 YAML 更快
  • --as system:serviceaccount:<ns>:<sa-name> 是考试中验证 SA 权限的标准方法
  • 注意 Role 是 namespace-scoped,ClusterRole 是 cluster-scoped,不要混淆
  • 最小权限原则:只授予题目明确要求的 verb 和 resource

官方文档