RBAC (Role-Based Access Control) 是 Kubernetes 中用于授权的一种机制。其基本思想是将一系列的操作权限与角色(Role)关联,然后再将特定的角色与用户或用户组关联。
使用 RBAC,管理员可以按最小权限原则分配权限,只给予用户执行其任务所需的最小权限。这有助于限制潜在的恶意行为和误操作,并增强了安全性。
Role
是 namespace 级别的,只在一个 namespace 中有效。而 ClusterRole
是集群级别的,跨 namespaces。RoleBinding
或 ClusterRoleBinding
将角色绑定到特定的用户、组或 Service Accounts。kubectl auth can-i
命令,来检查权限。想象一个场景,你希望开发团队能够在 development
namespace 中管理 Pods,但不希望他们在其他 namespace 或修改其他资源。
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: development
name: pod-manager
rules:
- apiGroups: [""]
resources: ["pods"]
verbs: ["get", "list", "create", "update", "delete"]
将上面的 Role 绑定到一个用户 dev-user
:
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: pod-manager-binding
namespace: development
subjects:
- kind: User
name: "dev-user"
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: Role
name: pod-manager
apiGroup: rbac.authorization.k8s.io
你希望某个管理员能够管理所有 namespaces 的 Services。
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:
# "name" is the name of the ClusterRole
name: service-admin
rules:
- apiGroups: [""]
resources: ["services"]
verbs: ["get", "list", "create", "update", "delete"]
将上面的 ClusterRole 绑定到一个用户 admin-user
:
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:
name: service-admin-binding
subjects:
- kind: User
name: "admin-user"
apiGroup: rbac.authorization.k8s.io
roleRef:
kind: ClusterRole
name: service-admin
apiGroup: rbac.authorization.k8s.io
通过这些案例,我们可以看到 RBAC 是如何在 Kubernetes 中进行细粒度授权的,从而确保资源安全。