You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为Kubernetes服务账号授予最小权限以查看全命名空间Pod?

为Kubernetes服务账号配置集群级Pod列表的最小权限

你提到已经通过绑定view ClusterRole实现了跨命名空间查看Pod的需求,但想要进一步缩小到最小必要权限——只允许查看所有命名空间的Pod,那我们可以自定义一个仅包含该权限的ClusterRole,再通过ClusterRoleBinding绑定到目标服务账号,这样就不会授予view角色附带的其他资源权限了。

步骤1:创建仅允许List Pods的ClusterRole

这个ClusterRole只定义对集群范围内pods资源的list权限,完全匹配你的需求:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: pod-list-clusterrole
rules:
- apiGroups: [""]  # 核心API组对应空字符串,Pods属于这个组
  resources: ["pods"]
  verbs: ["list"]  # 仅保留list操作,无其他权限

执行命令创建该ClusterRole:

kubectl apply -f <上述yaml文件的路径>

步骤2:绑定ClusterRole到目标服务账号

接下来用ClusterRoleBinding把这个自定义ClusterRole绑定到kube-system命名空间下的test服务账号——ClusterRoleBinding是实现跨所有命名空间(包括未来新建的)权限绑定的关键:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: test-pod-list-binding
subjects:
- kind: ServiceAccount
  name: test
  namespace: kube-system
roleRef:
  kind: ClusterRole
  name: pod-list-clusterrole
  apiGroup: rbac.authorization.k8s.io

执行命令创建绑定:

kubectl apply -f <上述yaml文件的路径>

验证权限

现在用你提取的令牌测试:

kubectl --token $token get pod --all-namespaces

此时应该能正常返回所有命名空间的Pod列表,且尝试执行其他操作(比如kubectl --token $token get deployments)会提示权限不足,完全符合最小权限原则。

提取服务账号令牌的命令(方便参考)

secret=$(kubectl get serviceaccount test -n kube-system -o=jsonpath='{.secrets[0].name}')
token=$(kubectl get secret $secret -n kube-system -o=jsonpath='{.data.token}' | base64 --decode -)

补充说明

  • 之所以用ClusterRole+ClusterRoleBinding,是因为单个命名空间的Role+RoleBinding无法覆盖未来新建的命名空间,而Cluster级别的绑定会自动作用于所有现有及未来的命名空间。
  • 自定义ClusterRole时,apiGroups设为空字符串对应Kubernetes的核心API组,verbs仅保留list,彻底限制了权限范围,避免了view角色附带的其他资源访问权限。

内容的提问来源于stack exchange,提问作者rookie099

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:02:29