类型定位
kubernetes.io/tls 是承载证书与私钥的标准 Secret 类型,键固定为 tls.crt(证书,含链)与 tls.key(私钥)。适用平台是 Kubernetes,Ingress 的 spec.tls[].secretName 和各网关实现都引用它。用专用类型而不是 Opaque 的价值在于字段名被规范约束,消费方不必猜键名,创建命令也能直接校验文件是否为有效 PEM。
基本信息
| 适用平台 | Kubernetes,命名空间级 Secret 类型 |
|---|---|
| 固定键 | tls.crt、tls.key |
| 创建方式 | kubectl create secret tls <名称> --cert=证书 --key=私钥 |
| 被谁引用 | Ingress 的 tls 段、网关实现、应用侧自定义挂载 |
典型使用场景
- 域名 HTTPS:为 Ingress 提供证书,控制器据此终结 TLS
- 证书续期:同名 Secret 覆盖新证书,控制器重载后生效
- 多域名共用:一个证书含多个 SAN,tls.hosts 列出全部域名
- 到期巡检:批量导出证书查看有效期,提前安排续期
- 本地验证:把证书挂进容器,供应用自建 TLS 监听
创建与检查
创建与检查
kubectl create secret tls app-tls -n prod \
--cert=fullchain.pem --key=privkey.pem
kubectl get secret app-tls -n prod -o jsonpath='{.type}' # kubernetes.io/tls
kubectl get secret app-tls -n prod -o jsonpath='{.data}' | head -c 200
kubectl get secret app-tls -n prod -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl x509 -noout -subject -dates
kubectl get secret app-tls -n prod -o jsonpath='{.data.tls\.crt}' | base64 -d | openssl crl2pkcs7 -nocrl -certfile /dev/stdin | openssl pkcs7 -print_certs -noout | head检查项与含义
| 检查项 | 命令要点 | 异常表现 |
|---|---|---|
| 证书主题与 SAN | openssl x509 -subject -ext subjectAltName | 域名不在 SAN 里,浏览器报不匹配 |
| 有效期 | openssl x509 -dates | 已过期,客户端直接拒绝连接 |
| 证书链 | 查看 crt 里是否含中间证书 | 部分客户端校链失败 |
| 键名 | jsonpath 取 tls.crt 与 tls.key | 键名写错,Ingress 引用无效 |
Ingress 侧通过 spec.tls[].secretName 引用;部分网关实现需要控制器重载后才生效,验证时用 curl -vk 看实际下发的证书。
证书文件是 PEM 文本,data 里存的是 base64 编码后的内容,排障时用 base64 -d 还原再交给 openssl 解析。
证书运维要点
- 创建前先核对证书文件包含完整链:叶子证书在前、中间证书在后,私钥单独一个文件
- 上线后用 openssl 检查主题与有效期,并把到期时间纳入告警,避免静默过期
- 续期采用同名覆盖 + 控制器重载的方式,改动面最小且不影响 Ingress 引用
- 多域名场景核对 SAN 列表与 tls.hosts 是否逐一对应,缺少任一项都会触发证书不匹配告警