Helm Chart集成cert-manager证书配置疑问及资源未创建问题排查
首先回答你最开始的疑问:是的,只要把Certificate.yaml放在Helm Chart的templates目录下,Helm在安装/升级时会自动扫描并渲染这个目录里的所有模板文件,不需要额外配置告诉Helm去读取它——这是Helm的默认行为。
接下来针对你遇到的「Certificate资源未创建、Secret未生成,还有cert-manager的BadConfig警告」问题,我们一步步排查:
1. 先确认Certificate.yaml的位置是否正确
Helm只会自动处理templates目录下的模板文件,如果你的Certificate.yaml是放在Chart的根目录或者其他非templates的文件夹里,Helm根本不会识别它,自然不会部署到集群中。先检查文件路径是否为:your-chart/templates/Certificate.yaml。
2. 验证Helm模板渲染是否正常
用helm install --dry-run --debug <你的release名称> ./<你的chart目录>命令,查看Helm渲染后的Certificate YAML内容:
- 检查渲染后的
metadata.name、spec.secretName、spec.dnsNames等字段是否符合预期 - 有没有出现模板语法错误(比如
index函数使用不当,或者Values里的字段为空导致渲染失败)
如果这里有错误,Helm部署时会静默忽略有问题的资源,导致Certificate不会被创建。
3. 排查cert-manager的BadConfig警告
你提到已经在Certificate.yaml里指定了Issuer,但还是收到了警告,大概率是以下原因:
- 先确认
letsencrypt-prod这个ClusterIssuer是否真的存在且状态正常:
执行kubectl get clusterissuer letsencrypt-prod,看STATUS列是否为Ready。如果ClusterIssuer不存在,或者状态是NotReady(比如ACME注册失败、DNS01/HTTP01验证配置有问题),cert-manager会无法签发证书,甚至可能不会创建对应的Secret。 - 你Ingress里配置了
kubernetes.io/tls-acme: "true"注解,这个注解是cert-manager的ingress-shim组件用来自动生成Certificate资源的,而你又手动创建了Certificate.yaml,这会导致冲突——ingress-shim可能会尝试生成一个和你手动配置重复的Certificate,或者因为Issuer配置不匹配抛出警告。建议去掉这个注解,避免自动生成逻辑干扰你的手动配置。
4. 检查Helm实际部署的资源
执行helm get manifest <你的release名称>,查看Helm实际推送到集群的所有资源清单,确认Certificate资源是否在其中:
- 如果没有,说明模板文件位置不对或者渲染失败,回到步骤1和2排查
- 如果有,再执行
kubectl describe certificate <证书名称>(证书名称就是你渲染后的metadata.name),查看Events里的详细日志,里面会明确告诉你为什么证书没有被签发、Secret没有生成(比如Issuer不可用、DNS验证超时等)
5. 确认Namespace配置
你的Certificate.yaml里指定了namespace: default,而你的Helm release是否部署在default namespace?如果Helm是部署在其他namespace,而Certificate强制指定了default,需要确认该namespace下cert-manager是否有权限操作,或者调整namespace配置为和release一致。
备注:内容来源于stack exchange,提问作者JoSSte




