role,sa,rolebinding三者之间的关系
在 Kubernetes 的 RBAC(基于角色的访问控制)模型中,ServiceAccount(SA)、Role 和 RoleBinding 三者之间的关系可以用以下方式清晰描述:
1. 核心组件的作用
| 组件 | 作用 | 类比(公司权限场景) |
|---|---|---|
| ServiceAccount | 定义一种身份(通常是 Pod 或服务使用的机器身份) | 某个员工(如财务部的会计软件) |
| Role | 定义权限规则(能操作哪些资源,如 get pods) |
职位描述(如“会计可以查看财务报表”) |
| RoleBinding | 将 Role 绑定到 ServiceAccount(即给身份分配权限) | 给员工分配职位(让会计软件拥有会计权限) |
2. 三者关系图解
graph LR
A[ServiceAccount] -->|被绑定| C[RoleBinding]
B[Role] -->|被引用| C[RoleBinding]
C -->|最终效果| D[SA获得Role定义的权限]
- Role 规定“能做什么”(如
get pods)。 - RoleBinding 决定“谁(SA)能做什么(Role)”。
- ServiceAccount 是“谁”(身份标识)。
3. 具体工作流程
步骤 1:创建 ServiceAccount(身份)
kubectl create serviceaccount app-account
此时创建了一个身份标识:system:serviceaccount:default:app-account。
步骤 2:创建 Role(权限规则)
# pod-reader-role.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
定义了一个允许 get/list pods 的 Role。
步骤 3:创建 RoleBinding(绑定权限)
# pod-reader-binding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: app-account-reader
subjects:
- kind: ServiceAccount
name: app-account # 绑定到 SA
namespace: default
roleRef:
kind: Role
name: pod-reader # 引用 Role
apiGroup: rbac.authorization.k8s.io
将 pod-reader Role 绑定到 app-account SA。
4. 关键规则
-
一个 RoleBinding 可以绑定:
- 1 个 Role → 多个 ServiceAccounts(通过
subjects列表)。 - 但不能绑定多个 Roles(
roleRef是单一条目)。
- 1 个 Role → 多个 ServiceAccounts(通过
-
一个 ServiceAccount 可以通过多个 RoleBinding 获得多个 Roles 的权限。
-
Role 是命名空间资源(
Role和RoleBinding需在相同命名空间)。
5. 示例场景
场景:一个 SA 拥有多个 Roles
# Role 1:允许读取 Pods
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: pod-reader
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list"]
# Role 2:允许读取 ConfigMaps
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
name: configmap-reader
rules:
- apiGroups: [""]
resources: ["configmaps"]
verbs: ["get", "list"]
# RoleBinding 1:绑定 pod-reader
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: binding1
subjects:
- kind: ServiceAccount
name: app-account
roleRef:
kind: Role
name: pod-reader
apiGroup: rbac.authorization.k8s.io
# RoleBinding 2:绑定 configmap-reader
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: binding2
subjects:
- kind: ServiceAccount
name: app-account
roleRef:
kind: Role
name: configmap-reader
apiGroup: rbac.authorization.k8s.io
最终效果:app-account SA 可以同时 get/list pods 和 get/list configmaps。
6. 验证权限
# 检查 SA 是否有权限
kubectl auth can-i get pods --as=system:serviceaccount:default:app-account # 返回 yes
kubectl auth can-i get configmaps --as=system:serviceaccount:default:app-account # 返回 yes
7. 总结
| 关系 | 说明 |
|---|---|
| ServiceAccount | 身份标识(“谁”) |
| Role | 权限定义(“能做什么”) |
| RoleBinding | 将 Role 绑定到 ServiceAccount(“让谁拥有什么权限”) |
| 多对多关系 | 一个 SA 可以绑定多个 Roles,一个 Role 可以绑定多个 SAs(通过多个 RoleBinding) |
简记口诀:
- Role 是能力,SA 是人,RoleBinding 是任命书。
- 想要权限生效,三者缺一不可!
浙公网安备 33010602011771号