Kubernetes Nginx Ingress未关联已颁发的通配符域名SSL证书
根据你提供的Ingress和Certificate配置,证书已成功颁发但Nginx未加载,可从以下几个方向排查:
1. 验证IngressClassName是否匹配正确的Nginx Controller
你的Ingress使用了自定义ingressClassName: test-ingress-class,需确认该IngressClass对应的是负责处理TLS的Nginx Ingress Controller:
- 查看集群中的IngressClass列表:
kubectl get ingressclass - 检查
test-ingress-class的定义,确认其controller字段指向的是cert-manager集成的Nginx Controller(通常为k8s.io/ingress-nginx):kubectl describe ingressclass test-ingress-class
如果IngressClass不匹配,Nginx Controller会忽略该Ingress,自然不会加载对应的证书。
2. 确认证书Secret的有效性
虽然Certificate状态显示Ready,但需验证Secretk8s-tls-secret中确实包含有效的证书和密钥:
- 查看Secret的内容:
kubectl get secret k8s-tls-secret -o yaml - 解码证书内容验证是否为LetsEncrypt颁发:
kubectl get secret k8s-tls-secret -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -text -noout
若Secret中缺少tls.crt或tls.key,或证书内容不正确,Nginx会 fallback 到默认自签名证书。
3. 检查Ingress的TLS配置与实际访问域名是否匹配
你提到配置的是通配符域名,但Ingress的TLS hosts字段仅填写了test.domain.com(单个域名):
- 若实际访问的是通配符域名(如
*.domain.com),需将Ingress的TLS hosts改为通配符格式:tls: - hosts: - "*.domain.com" secretName: k8s-tls-secret
同时需确保Certificate的dnsNames也包含通配符域名(当前Certificate的dnsNames是test.domain.com,需同步修改)。域名不匹配时,Nginx无法找到对应证书,会使用默认证书。
4. 查看Nginx Ingress Controller日志
检查Controller的运行日志,排查证书加载失败的具体原因:
- 找到Nginx Controller所在的命名空间(通常为
kube-system或ingress-nginx):kubectl get pods -A | grep nginx-ingress - 查看Pod日志:
kubectl logs -n <命名空间> <nginx-controller-pod-name>
日志中若出现"secret not found"、"invalid certificate"等关键词,可定位具体问题。
5. 检查Ingress的事件状态
查看Ingress的事件记录,确认cert-manager是否成功将证书关联到Ingress:
kubectl describe ingress test-ingress
若Events中没有证书相关的成功关联记录,可能是Ingress与cert-manager的联动出现异常,可尝试删除Ingress后重新创建。
6. 验证microk8s插件配置
确保microk8s已正确启用Ingress和cert-manager插件:
- 查看已启用的插件:
microk8s status - 若未启用,执行启用命令:
microk8s enable ingress cert-manager
同时确认ClusterIssuertest-cluster-issuer的ACME挑战配置正常(如HTTP-01或DNS-01挑战是否成功完成)。
内容的提问来源于stack exchange,提问作者infinite_loop

