Kubernetes配置Cert-Manager与Let's Encrypt后出现连接不私密错误
解决Kubernetes Ingress SSL连接不安全问题(组件状态正常但浏览器报错)
看起来你已经把ClusterIssuer、Certificate和Ingress都配置好了,状态也都显示Ready,但还是遇到了浏览器的“Your connection is not private”错误,咱们一步步来排查:
1. 先排除客户端侧的缓存与DNS问题
很多时候这个报错可能是客户端本地的问题,先快速验证:
- 用浏览器的无痕模式访问目标域名,避免旧证书缓存干扰
- 在终端执行
nslookup flower.testing.example.com,确认解析出的IP是你Ingress Controller的公网IP - 用
curl -v https://flower.testing.example.com查看返回的证书详情,看看是不是Let's Encrypt颁发的通配符证书,而不是自签名或者过期证书
2. 验证Secret中的证书是否真实有效
虽然Certificate状态显示Ready,但还是要确认证书已经正确写入到指定的Secret里:
- 执行命令查看Secret内容:
检查kubectl get secret acme-crt -n b1 -o yamldata字段下是否存在tls.crt和tls.key,且内容不是空字符串 - 用openssl解析证书,验证域名和有效期:
重点看kubectl get secret acme-crt -n b1 -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text -nooutSubject Alternative Name里有没有*.testing.example.com,以及Not After时间是否在有效期内
3. 检查Ingress Controller是否正确加载了证书
Ingress Controller可能没有及时同步Secret的更新,你可以:
- 查看Ingress Controller的pod日志(以nginx-ingress为例),搜索是否有证书加载相关的错误:
比如有没有“failed to load certificate”之类的报错信息kubectl logs -n kube-system deployment/nginx-ingress-controller - 尝试重启Ingress Controller的pod,强制它重新加载证书:
(注意替换成你的Ingress Controller所在的命名空间和资源名称)kubectl rollout restart deployment nginx-ingress-controller -n kube-system
4. 清理Ingress中的冲突注解
你的Ingress配置里同时使用了两个cert-manager相关的注解:kubernetes.io/tls-acme: "true"和cert-manager.io/cluster-issuer: "letsencrypt-prod",这可能会导致冲突:
kubernetes.io/tls-acme是cert-manager旧版本的注解,新版本已经推荐使用cert-manager.io/cluster-issuer- 建议去掉
kubernetes.io/tls-acme: "true"这一行,然后重新应用Ingress配置:
应用后观察Certificate和Ingress的事件,确认有没有异常kubectl apply -f your-ingress-config.yaml
5. 核对Ingress与Certificate的配置匹配度
最后再检查一遍关键配置是否一致:
- 确认Ingress的
tls.secretName是acme-crt,和Certificate配置中的spec.secretName完全一致(如果Certificate里指定了的话) - 确认Ingress的
tls.hosts中的*.testing.example.com和你访问的子域名(比如flower.testing.example.com)完全匹配,没有拼写错误
如果以上步骤都试过还是无法解决,可以把curl -v的输出或者Ingress Controller的日志片段贴出来,我再帮你进一步分析。
内容的提问来源于stack exchange,提问作者me25
相关产品推荐
相关产品推荐

