在Kubernetes中配置多主机Ingress并集成Let’s Encrypt证书
问题解决:GKE Ingress添加API子域名后SSL证书同步失败
根因分析
你遇到的404错误核心原因是证书覆盖范围不匹配:
- 你以为
<myDomain>.com的证书能覆盖www和api子域名,但Let's Encrypt的单域名证书默认只包含主域名本身,不会自动覆盖所有子域名。 - GCE类型的Ingress要求TLS证书必须包含Ingress规则里所有的
host域名,否则GCP负载均衡同步时会因为找不到匹配的SSL证书资源而报错。
解决方案
方案1:扩展证书覆盖的域名列表(推荐,无需DNS配置)
直接在Ingress的tls.hosts里添加所有需要的域名,让Cert-Manager生成包含主域名+两个子域名的多域名证书:
修改后的Ingress配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-ingress annotations: kubernetes.io/ingress.class: gce kubernetes.io/ingress.allow-http: "true" cert-manager.io/issuer: letsencrypt-staging spec: tls: - secretName: web-ssl hosts: - <myDomain>.com - www.<myDomain>.com - api.<myDomain>.com rules: - host: "www.<myDomain>.com" http: paths: - pathType: Prefix path: "/" backend: service: name: angular-service port: number: 80 - host: "api.<myDomain>.com" http: paths: - pathType: Prefix path: "/" backend: service: name: spring-boot-service port: number: 8080
方案2:使用通配符证书(适合未来新增子域名)
如果后续还要添加更多子域名,可配置通配符证书*.myDomain.com,但需要注意:
- Let's Encrypt通配符证书必须用DNS01挑战验证,所以你需要修改Cert-Manager的Issuer/ClusterIssuer配置,添加DNS服务商的API密钥(比如Cloudflare、GCP DNS等)。
- 修改Ingress的
tls.hosts为- *.myDomain.com。
后续排查步骤
- 检查证书状态:执行
kubectl get certificates,确认web-ssl的状态为Ready。 - 查看证书事件:如果证书未就绪,执行
kubectl describe certificate web-ssl,排查挑战失败的具体原因(比如HTTP01的临时Ingress是否正常,DNS01的解析记录是否生效)。 - 清理残留资源:如果之前的负载均衡资源有残留,先删除旧Ingress和证书,再重新应用配置:
kubectl delete ingress web-ingress kubectl delete secret web-ssl kubectl apply -f your-ingress.yaml
内容的提问来源于stack exchange,提问作者XintongTheCoder
相关产品推荐
相关产品推荐

