部署新实例后Certmanager失效,GitLab GCK集成变更RBAC问题求助
解决GitLab托管Certmanager的RBAC权限问题
首先明确一点:GitLab调整GKE集成逻辑后,已经无法再禁用RBAC了——这是官方为了集群安全合规做出的强制调整,所以咱们得把重心放在正确配置RBAC权限上,让Certmanager能正常完成证书验证流程。
下面是具体的操作步骤,亲测适配GitLab托管的集群:
1. 先确认Certmanager的ServiceAccount
GitLab托管的Certmanager一般会默认部署在cert-manager命名空间下,对应三个核心ServiceAccount:cert-manager、cert-manager-cainjector、cert-manager-webhook。你可以先执行命令确认它们的存在:
kubectl get serviceaccounts -n cert-manager
2. 配置必要的ClusterRole与ClusterRoleBinding
Certmanager要完成证书颁发、验证(比如HTTP01/DNS01校验),需要一系列集群级权限。你可以直接用下面的配置,或者基于官方模板调整:
第一步:创建ClusterRole
这个Role定义了Certmanager需要的所有核心权限:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: cert-manager-clusterrole rules: # 管理Certmanager自身的CRD资源 - apiGroups: ["cert-manager.io"] resources: ["certificates", "certificates/status", "issuers", "issuers/status", "clusterissuers", "clusterissuers/status"] verbs: ["create", "delete", "get", "list", "patch", "update", "watch"] # 管理基础K8s资源(用于验证流程) - apiGroups: [""] resources: ["pods", "services", "secrets", "endpoints"] verbs: ["create", "delete", "get", "list", "patch", "update", "watch"] # 读取/创建Ingress资源(HTTP01验证必需) - apiGroups: ["networking.k8s.io"] resources: ["ingresses"] verbs: ["create", "delete", "get", "list", "patch", "update", "watch"] # 生成事件日志 - apiGroups: [""] resources: ["events"] verbs: ["create", "patch"]
第二步:绑定Role到Certmanager的ServiceAccount
把上面的ClusterRole绑定给三个Certmanager的ServiceAccount:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cert-manager-clusterrolebinding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cert-manager-clusterrole subjects: - kind: ServiceAccount name: cert-manager namespace: cert-manager - kind: ServiceAccount name: cert-manager-cainjector namespace: cert-manager - kind: ServiceAccount name: cert-manager-webhook namespace: cert-manager
把这两个YAML文件保存后,执行kubectl apply -f <文件名>即可完成配置。
3. GitLab托管集群的特殊注意事项
- 如果你是通过GitLab的集群集成来部署Certmanager的,要确保GitLab的集群管理账户(通常是
gitlab-admin)有创建RBAC资源的权限——如果没权限,你可以在GitLab的集群设置界面手动添加集群级的RBAC权限。 - 要是用HTTP01验证,得确认集群里的Ingress控制器(比如NGINX)运行正常,并且Certmanager有权限创建临时Ingress资源。
- 如果用DNS01验证(比如GCP CloudDNS),还得给Certmanager的ServiceAccount配置云平台的DNS管理权限——可以通过GitLab的集群Secrets或者GKE的Workload Identity来实现。
4. 验证权限是否生效
配置完成后,先重启Certmanager的Pod让权限生效:
kubectl rollout restart deployment cert-manager -n cert-manager kubectl rollout restart deployment cert-manager-cainjector -n cert-manager kubectl rollout restart deployment cert-manager-webhook -n cert-manager
然后查看Certmanager的日志,确认没有权限相关的错误:
kubectl logs -n cert-manager deployment/cert-manager -f
如果日志里没有permission denied或forbidden的报错,就说明权限配置正确了,Certmanager应该能正常完成证书验证流程。
内容的提问来源于stack exchange,提问作者user9468014
相关产品推荐
相关产品推荐

