K8S RoleBinding问题:cert-manager-webhook-ovh服务账号无法访问ovh-credentials Secret
问题根因
从报错信息可定位两个核心配置错误:
- RBAC绑定的服务账号不匹配:你部署的
cert-manager-webhook-ovh运行在default命名空间,使用的服务账号为system:serviceaccount:default:cert-manager-webhook-ovh,但你配置的ClusterRoleBinding绑定的是cert-manager命名空间下的同名服务账号,权限未实际生效。 - Secret读取路径不匹配:你的
ovh-credentialsSecret存储在default命名空间,但当前webhook请求访问的是cert-manager命名空间下的同名Secret,资源路径不对应。
解决步骤
1. 修正ClusterRoleBinding配置
调整ClusterRoleBinding的subjects字段,将绑定的服务账号命名空间改为default,匹配实际运行的webhook服务账号:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: cert-manager-webhook-ovh:secret-reader roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: cert-manager-webhook-ovh:secret-reader subjects: - apiGroup: "" kind: ServiceAccount name: cert-manager-webhook-ovh namespace: default # 修正为webhook实际所在的命名空间
应用配置:
kubectl apply -f <上述配置对应的文件名>
2. 对齐Secret读取路径(二选一即可)
方案A:迁移Secret到cert-manager命名空间(推荐)
将ovh-credentials迁移到webhook当前请求的cert-manager命名空间,和cert-manager核心组件资源统一管理:
# 迁移Secret kubectl get secret ovh-credentials -n default -o yaml | sed 's/namespace: default/namespace: cert-manager/' | kubectl apply -f - # 删除原命名空间冗余Secret kubectl delete secret ovh-credentials -n default
方案B:指定Secret读取的命名空间
如果要保留Secret在default命名空间,需要修改ClusterIssuer的webhook solver配置,明确指定Secret所在的命名空间:
# ClusterIssuer的dns01 solver配置示例,补充namespace字段 solvers: - dns01: webhook: groupName: acme.ovh.com solverName: ovh config: endpoint: ovh-eu applicationKeyRef: name: ovh-credentials key: applicationKey namespace: default # 明确指定Secret所在命名空间 applicationSecretRef: name: ovh-credentials key: applicationSecret namespace: default consumerKeyRef: name: ovh-credentials key: consumerKey namespace: default
3. 验证权限配置
执行以下命令验证服务账号是否有对应Secret的读取权限,返回yes即为配置正确:
# <secret-namespace>替换为Secret实际所在的命名空间,default或者cert-manager kubectl auth can-i get secrets/ovh-credentials --as system:serviceaccount:default:cert-manager-webhook-ovh -n <secret-namespace>
4. 重新触发证书签发
删除已失败的挑战资源,让cert-manager重新走签发流程:
kubectl delete challenges.acme.cert-manager.io --all
等待1-2分钟后查看挑战状态即可确认是否恢复正常。
内容的提问来源于stack exchange,提问作者Magino
相关产品推荐
相关产品推荐

