配置定位
Ingress 的 TLS 通过 spec.tls 引用一个同命名空间的 kubernetes.io/tls 类型 Secret,控制器据此监听 443 并用该证书终结 HTTPS,再按 rules 里的 host 把请求转发给后端 Service。适用平台是 Kubernetes,具体证书加载行为由 Ingress 控制器实现(如 ingress-nginx 会监听 Secret 变化并重载)。证书、host、Secret 三者必须对得上,任一错位都会导致浏览器告警或直接 404。
基本信息
| 适用平台 | Kubernetes,Ingress 控制器(ingress-nginx 等) |
|---|---|
| Secret 类型 | kubernetes.io/tls,键固定为 tls.crt 与 tls.key |
| 命名空间约束 | Secret 必须与 Ingress 在同一命名空间 |
| 生效方式 | 控制器监听 Secret 变更后重载配置,通常秒级到分钟级 |
典型使用场景
- 给业务域名开 HTTPS:为每个域名准备证书并绑定到 Ingress
- 证书续期切换:新证书写入同名 Secret,控制器自动重载,无需改 Ingress
- 多域名共用一个证书:tls.hosts 列出全部域名,证书 SAN 需全部覆盖
- 排查证书与域名不匹配:用 curl -vk 看实际下发的证书主题与有效期
- 配合强制跳转:开启控制器注解把 HTTP 请求重定向到 HTTPS
TLS 配置
TLS 配置
spec:
tls:
- hosts: ["app.example.com"]
secretName: app-tls
rules:
- host: app.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web
port:
number: 80创建与验证
创建与验证
kubectl create secret tls app-tls --cert=tls.crt --key=tls.key -n prod # 创建证书 Secret
kubectl get secret app-tls -n prod -o jsonpath='{.type}' # 确认类型
kubectl describe ingress web-ing -n prod | grep -i -A2 tls # 确认引用生效
kubectl get secret app-tls -n prod -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -noout -subject -dates # 看证书主题与有效期
curl -vk https://app.example.com/ 2>&1 | grep -E 'subject|issuer|expire' # 看实际下发的证书常见问题对照
| 现象 | 原因 | 处理 |
|---|---|---|
| 浏览器提示证书不受信任 | 证书链不完整或用了自签 | 补中间证书或换受信 CA 签发 |
| 证书域名不匹配 | 证书 SAN 不覆盖 rules.host | 重新签发或调整 hosts 列表 |
| HTTP 不自动跳 HTTPS | 默认只监听,不做重定向 | 加 force-ssl-redirect 等注解 |
| 访问返回 404 | host 或 path 与请求不匹配 | 核对 rules 与 IngressClass |
| Secret 找不到 | 命名空间或被删 | 在同命名空间重建同名 Secret |
Secret 必须与 Ingress 同命名空间;证书域名要覆盖 tls.hosts 与 rules.host 列表,否则客户端校验失败。
证书更新一般只需覆盖同名 Secret 的内容,控制器会重新加载;如果验证发现仍在用旧证书,先确认控制器是否真的监听到了变更。