Kubernetes v1.25.6中cicd服务账号无法列出Namespaces的解决方法
解决Kubernetes ServiceAccount访问Namespaces时的403权限问题
你的问题是典型的Kubernetes RBAC权限缺失导致的——ServiceAccount默认没有任何API访问权限,必须通过绑定对应的角色规则才能获取资源访问权限。错误提示里的system:serviceaccount:default:cicd账号没有list namespaces的权限,所以返回403。
解决步骤:
Kubernetes中namespaces是集群级资源,需要用ClusterRole定义权限,再通过ClusterRoleBinding绑定到你的cicd ServiceAccount上。
创建允许列出命名空间的ClusterRole
新建namespace-list-role.yaml文件,内容如下:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: namespace-list-role rules: - apiGroups: [""] # 核心API组对应空字符串 resources: ["namespaces"] verbs: ["list"] # 仅允许list操作,如需其他权限可添加get、watch等绑定ClusterRole到cicd ServiceAccount
新建cicd-namespace-binding.yaml文件,内容如下:apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cicd-namespace-list-binding subjects: - kind: ServiceAccount name: cicd namespace: default # 你的ServiceAccount所在命名空间 roleRef: kind: ClusterRole name: namespace-list-role apiGroup: rbac.authorization.k8s.io应用配置并验证
执行命令应用配置:kubectl apply -f namespace-list-role.yaml kubectl apply -f cicd-namespace-binding.yaml验证权限是否生效:
kubectl auth can-i list namespaces --as=system:serviceaccount:default:cicd如果返回
yes,说明权限配置成功,此时再用token调用API就能正常列出命名空间了。
额外说明
如果需要给cicd账号更多权限(比如查看命名空间详情、监控命名空间变化),只需修改ClusterRole中的verbs数组,例如:
verbs: ["list", "get", "watch"]
内容的提问来源于stack exchange,提问作者Peter Penzov
相关产品推荐
相关产品推荐

