# 实验目标

创建一个名为 cluster-manager-sa 的服务账号,赋予它:

  1. 集群级权限:可以查看(get/list)集群中所有的 Nodes(节点)。
  2. 全空间权限:可以查看 所有命名空间 下的 Deployments

# 实验过程大纲

  1. 创建服务账号
  2. 创建 ClusterRole 和 ClusterRoleBinding
  3. 验证权限

# 实验过程

# 阶段一:创建服务账号

我们统一把这个账号放在 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。
  1. 资源的作用域:Namespaced vs Non-Namespaced
  • 知识点: Kubernetes 的资源分为两种。一种是躲在命名空间里的(如 Pods, Deployments, Services),另一种是漂浮在命名空间之上的集群级资源(如 Nodes, PersistentVolumes, Namespaces)。
  1. 动词(Verbs)与资源(Resources)的精准匹配
  • 知识点: RBAC 的核心三要素:Who (Subject), What (Verbs), Which (Resources)。
  • 避坑指南:
    • 复数形式: 在 YAML 或命令行中,资源必须用复数,如 nodes 而不是 node
    • 子资源(Subresources): 考试有时会考 deployment/statuspod/log,这种斜杠写法代表对资源的特定部分进行授权。
    • API 组: 有些资源属于不同的 API Group(如 Deployment 属于 apps 组)。使用命令 kubectl create clusterrole --resource=deployments.apps 可以确保精准匹配。