RBAC (Role-Based Access Control) 是 Kubernetes 中用于控制访问权限的机制。
- 通过 RBAC,管理员可以细粒度地控制用户和服务账户对 Kubernetes 资源的访问权限。
- RBAC 的核心思想是根据角色(Role)来授予权限,角色可以是用户、组或服务账户。
1. RBAC 组件简介
在 Kubernetes 中,RBAC 基于以下几个重要的资源:
- Role:定义了在特定命名空间内的权限。例如,某个用户可以读取某个命名空间中的 Pod,但不能修改它们。
- ClusterRole:与 Role 类似,但它适用于集群级别的资源。ClusterRole 可以赋予跨所有命名空间的权限,或者集群级别的权限(例如访问节点、查看集群状态等)。
- RoleBinding:将 Role 或 ClusterRole 与一个用户或服务账户(ServiceAccount)绑定,并且指定该用户或服务账户可以在指定的命名空间中执行的操作。
- ClusterRoleBinding:将 ClusterRole 与一个用户、服务账户或用户组绑定,并赋予该角色跨集群的权限。
2. RBAC 权限的授予流程
RBAC 权限授予包括以下步骤:
- 定义 Role 或 ClusterRole :定义某个角色所拥有的权限(可以是资源的
get
、list
、create
、update
、delete
权限)。 - 创建 RoleBinding 或 ClusterRoleBinding:将用户或服务账户与某个 Role 或 ClusterRole 绑定,从而赋予其相应的权限。
3. 创建和配置 RBAC 资源
1. 定义 Role 和 ClusterRole
-
Role 示例:限制一个用户只能在某个命名空间内查看 Pods 和 Deployments。
yamlapiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: namespace: mynamespace # 适用于某个命名空间 name: pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list"] - apiGroups: ["apps"] resources: ["deployments"] verbs: ["get", "list"]
-
ClusterRole 示例:授予用户访问集群内所有命名空间的 Pods 和 Deployments 的权限。
yamlapiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cluster-pod-reader rules: - apiGroups: [""] resources: ["pods"] verbs: ["get", "list"] - apiGroups: ["apps"] resources: ["deployments"] verbs: ["get", "list"]
2. 绑定 Role 或 ClusterRole
-
RoleBinding:将 Role 绑定到某个用户或服务账户,在特定的命名空间内授予权限。
yamlapiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: read-pods-binding namespace: mynamespace # 绑定到特定命名空间 subjects: - kind: User name: "johndoe" # 被绑定的用户 apiGroup: rbac.authorization.k8s.io roleRef: kind: Role name: pod-reader # 绑定到之前定义的 Role apiGroup: rbac.authorization.k8s.io
-
ClusterRoleBinding:将 ClusterRole 绑定到用户、服务账户或用户组,以便其具有跨所有命名空间的权限。
yamlapiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cluster-read-pods-binding subjects: - kind: User name: "johndoe" # 被绑定的用户 apiGroup: rbac.authorization.k8s.io roleRef: kind: ClusterRole name: cluster-pod-reader # 绑定到之前定义的 ClusterRole apiGroup: rbac.authorization.k8s.io
4. 管理 Kubernetes 权限
-
查看当前权限 :使用
kubectl auth can-i
命令查看某个用户、服务账户或角色是否有某项操作权限。例如,查看johndoe
用户是否可以查看 Pods:bashkubectl auth can-i get pods --as johndoe
-
查看 Role 和 RoleBinding :可以通过
kubectl get
命令查看所有 Role 和 RoleBinding。查看所有命名空间的 Role:
bashkubectl get roles --all-namespaces
查看指定命名空间的 RoleBinding:
bashkubectl get rolebindings -n mynamespace
-
更新权限:如果需要修改某个用户的权限,只需编辑对应的 Role 或 ClusterRole,或者更新 RoleBinding 或 ClusterRoleBinding。修改后,Kubernetes 会自动生效。
-
调试权限问题 :当用户或服务账户无法访问资源时,可以使用
kubectl describe
命令查看 RBAC 配置并检查是否有误,或者使用kubectl auth can-i
命令来测试权限。
5. 权限控制策略
- 最小权限原则:只授予必要的权限,避免过多的权限分配。通过精细化的 Role 和 ClusterRole,可以确保每个用户或服务账户仅能执行其职责所需的操作。
- Role 和 ClusterRole 的区别 :
- Role 适用于命名空间级别的权限管理,而 ClusterRole 则是集群级别的权限管理,可以跨命名空间。
- 如果一个应用需要跨多个命名空间的权限,则使用 ClusterRole 和 ClusterRoleBinding;如果只是需要在某个特定命名空间内进行管理,则使用 Role 和 RoleBinding。
总结
- RBAC 是 Kubernetes 中重要的权限控制机制,可以通过 Role 、ClusterRole 、RoleBinding 和 ClusterRoleBinding 资源来管理集群内的访问权限。
- 通过定义适当的角色和角色绑定,可以控制用户、服务账户或组对 Kubernetes 资源的访问权限。
- 最小权限原则应始终作为权限管理的最佳实践,以确保安全性并减少潜在的风险。