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 是单一条目)。
  • 一个 ServiceAccount 可以通过多个 RoleBinding 获得多个 Roles 的权限

  • Role 是命名空间资源RoleRoleBinding 需在相同命名空间)。


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 podsget/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 是任命书
  • 想要权限生效,三者缺一不可!
posted on 2025-05-09 08:59  Leo-Yide  阅读(84)  评论(0)    收藏  举报