自托管GitLab CI连接Kubernetes集群报Forbidden错误如何解决?
问题1:最初的secret访问禁止+空kubeconfig原因
- 空kubeconfig属于正常现象:GitLab集成Kubernetes集群后,会将访问凭证直接注入CI Job的环境变量中,不会写入默认的
~/.kube/config路径,因此直接执行kubectl config view会返回空配置,不影响kubectl正常调用。 - secret访问禁止的核心原因:报错显示请求使用的是
gitlab命名空间下的default服务账户,Kubernetes默认创建的服务账户没有任何API操作权限,必须通过RBAC配置为其分配对应资源的访问权限,才可以执行相关操作。
问题2:配置RBAC后仍无法创建Namespace的原因
你当前的RBAC配置存在两处核心问题:
- 权限范围不足:你定义的ClusterRole中只开放了
secrets资源的操作权限,并没有包含namespaces资源的相关权限,自然无法完成Namespace的创建、查询操作。 - 冗余配置:ClusterRole属于集群级资源,不需要在metadata中指定
namespace字段,该配置不会生效,属于多余项。
修正方案
只需修改ClusterRole配置,新增namespaces资源的权限即可,原有ClusterRoleBinding无需改动:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: gitlab-deploy rules: - apiGroups: [""] # 核心API组 resources: ["secrets", "namespaces"] # 新增namespaces资源权限 verbs: ["get", "list", "watch", "create", "update", "patch", "delete"]
应用该配置后即可正常创建Namespace。如果后续需要操作Deployment、Service等其他资源,只需在resources数组中添加对应资源类型即可。
内容的提问来源于stack exchange,提问作者user3142695
相关产品推荐
相关产品推荐

