# 实验目标
创建一个名为 cluster-manager-sa 的服务账号,赋予它:
- 集群级权限:可以查看(get/list)集群中所有的 Nodes(节点)。
- 全空间权限:可以查看 所有命名空间 下的 Deployments。
# 实验过程大纲
- 创建服务账号
- 创建 ClusterRole 和 ClusterRoleBinding
- 验证权限
# 实验过程
# 阶段一:创建服务账号
我们统一把这个账号放在 kube-system 命名空间下(模拟系统级管理账号)。
kubectl create serviceaccount cluster-manager-sa -n kube-system
# 阶段二:创建 ClusterRole 与 ClusterRoleBinding
注意:这里不需要指定 -n 或 --namespace,因为 ClusterRole 是全局生效的。
1. 创建集群角色 (ClusterRole) 定义对节点和所有 Deployment 的读取权限。
kubectl create clusterrole node-and-deploy-reader \
--verb=get,list,watch \
--resource=nodes,deployments
2. 创建集群角色绑定 (ClusterRoleBinding) 将全局角色绑定到刚才的 ServiceAccount 上。
kubectl create clusterrolebinding cluster-manager-binding \
--clusterrole=node-and-deploy-reader \
--serviceaccount=kube-system:cluster-manager-sa
# 阶段三:验证权限(多维度检查)
1. 验证集群资源(Nodes):
kubectl auth can-i list nodes --as=system:serviceaccount:kube-system:cluster-manager-sa
预期输出:
yes
2. 验证跨命名空间资源(Deployments): 检查它是否能看 default 空间的 Deployment:
kubectl auth can-i list deployments --as=system:serviceaccount:kube-system:cluster-manager-sa -n default
预期输出:
yes
检查它是否能看 kube-system 空间的 Deployment:
kubectl auth can-i list deployments --as=system:serviceaccount:kube-system:cluster-manager-sa -n kube-system
预期输出:
yes
3. 越权检查(验证安全性): 检查它是否能删除节点(我们只给了 get/list):
kubectl auth can-i delete nodes --as=system:serviceaccount:kube-system:cluster-manager-sa
预期输出:
no
清除实验痕迹:
kubectl delete clusterrolebinding cluster-manager-binding
kubectl delete clusterrole node-and-deploy-reader
kubectl delete serviceaccount cluster-manager-sa -n kube-system
# 知识总结
有时候考试会考一些冷门的资源,你不知道它的英文全称或是否支持 ClusterRole。这时候执行这条命令:
kubectl api-resources
- NAME 列:填入
--resource=的准确名称。 - NAMESPACED 列:如果显示
false,则必须使用 ClusterRole。
- 资源的作用域:Namespaced vs Non-Namespaced
- 知识点: Kubernetes 的资源分为两种。一种是躲在命名空间里的(如 Pods, Deployments, Services),另一种是漂浮在命名空间之上的集群级资源(如 Nodes, PersistentVolumes, Namespaces)。
- 动词(Verbs)与资源(Resources)的精准匹配
- 知识点: RBAC 的核心三要素:Who (Subject), What (Verbs), Which (Resources)。
- 避坑指南:
- 复数形式: 在 YAML 或命令行中,资源必须用复数,如
nodes而不是node。 - 子资源(Subresources): 考试有时会考
deployment/status或pod/log,这种斜杠写法代表对资源的特定部分进行授权。 - API 组: 有些资源属于不同的 API Group(如 Deployment 属于
apps组)。使用命令kubectl create clusterrole --resource=deployments.apps可以确保精准匹配。
- 复数形式: 在 YAML 或命令行中,资源必须用复数,如