RBAC的核心是创建角色(Role/ClusterRole)定义权限,然后通过绑定(RoleBinding、 ClusterRoleBinding)将角色与主体关联。需要根据需求选择适当的作用域(命名空间或集群),合理分配最小必要权限,避免过度授权。用于精细化管理用户、服务账号等对集群资源的访问权限。
使用 Role + RoleBinding,限制用户在特定命名空间的操作
#testrole.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
namespace: default # 该 Role 仅在 default 命名空间生效
name: pod-reader # Role 的名称
rules:
- apiGroups: [""] # 空字符串表示核心 API 组(Pod、Service 等)
resources: ["pods"] # 授权的资源类型是 Pod
verbs: ["get", "list", "watch"] # 允许的操作:查看、列表、只读权限
- Role:作用于特定命名空间,定义一组权限(如对 Pod、Service 的读写操作)。
- ClusterRole:作用于集群范围或非资源端点,可授权集群级资源Node、PV(PersistentVolume) 或跨命名空间权限。
#testrolebind.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: read-pods
namespace: default # 该 RoleBinding 仅在 default 命名空间生效
subjects:
- kind: ServiceAccount # 绑定的主体类型是服务账号
name: myapp-sa # 服务账号的名称
namespace: default # 必须与 RoleBinding 的命名空间一致
roleRef:
kind: Role # 引用的角色类型是 Role(命名空间级别)
name: pod-reader # 引用的 Role 名称
apiGroup: rbac.authorization.k8s.io # 角色所属的 API 组
- RoleBinding:将 Role 或 ClusterRole 绑定到主体,作用在特定命名空间。
- ClusterRoleBinding:将 ClusterRole 绑定到主体,作用在整个集群。
使用 ClusterRole + ClusterRoleBinding,授权查看所有命名空间中的资源
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
name: global-view
rules:
- apiGroups: [""]
resources: ["namespaces"]
verbs: ["list"]
复用 ClusterRole 到命名空间
通过 RoleBinding 引用 ClusterRole,将集群角色权限限制在单个命名空间内
# 引用 ClusterRole 的 RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
name: limited-admin
namespace: dev
subjects: #主体
- kind: User
name: dev-user
roleRef:
kind: ClusterRole
name: admin # 预定义 ClusterRole
apiGroup: rbac.authorization.k8s.io
主体(Subject)
- User:外部用户(如通过证书认证)。
- ServiceAccount:Pod 内使用的内部账号。
- Group:用户或服务账号的集合,便于批量授权。
ClusterRole
- view:只读权限。
- edit:允许修改资源(如创建/删除 Pod)。
- admin:命名空间的管理员权限。
- cluster-admin:超级用户权限需通过
ClusterRoleBinding
绑定。
权限检查工具
使用 kubectl auth can-i
验证权限:
kubectl auth can-i delete pods --namespace=test # 检查当前用户权限
kubectl auth can-i create deployments --as=system:serviceaccount:default:myapp-sa # 模拟服务账号权限
kubernetes集群使用建议
- 最小权限原则:仅授予必要权限。
- 避免使用
cluster-admin
:除非绝对需要。 - 服务账号管理:为每个应用创建专用 ServiceAccount,避免使用默认账号。
- 定期审计权限:
kubectl get rolebindings --all-namespaces
检查绑定情况。