KubernetesIngress配置HTTPS的关键步骤与常见误区,三处命名必须严格对齐

在 Kubernetes 中为 Ingress 启用 HTTPS 并非仅修改域名前缀即可,需明确 TLS 握手与路由分流的分离机制。本文梳理从证书存储、Secret 创建到 Ingress 规则配置的...

互联网/IT

当开发团队将预览服务从 http://preview.example.test 切换至 https://preview.example.test 时,浏览器却弹出证书警告——这并非配置遗漏,而是对 Kubernetes Ingress 工作机制的典型误解。Ingress 的核心职责是流量路由,而 HTTPS 所依赖的 TLS 握手发生在请求到达后端服务之前,由入口控制器(Ingress Controller)独立完成。若未显式提供匹配域名的 TLS 证书,即使路由规则正确,浏览器也会在握手阶段终止连接,后端 Pod 根本无法接收到请求。

图中清晰显示:HTTP 请求直接进入“入口按域名分流”环节;而 HTTPS 请求必须先通过“验证入口证书”关卡,失败即中断。这一边界常被忽视,导致开发者误以为“能打开页面=HTTPS 已就绪”。实际上,域名解析与 TLS 信任是两个正交问题。

文章配图

早期尝试将证书嵌入应用容器或直接写入 Ingress YAML 文件均不可行。前者因 TLS 终止点在入口层,后端证书对浏览器无意义;后者则使私钥随配置文件扩散,违背最小权限原则。Kubernetes 的标准解法是使用类型为 kubernetes.io/tls 的 Secret 独立管理证书与私钥,并通过 Ingress 的 tls.secretName 字段引用。

该 Secret 相当于入口控制器的“门禁凭证”:访客(浏览器)尚未被引导至具体部门(Service/Pod),前台(Ingress Controller)需先证明自身身份合法。此时,rules.host 定义的是后续路由目标地址,而 tls.hosts 指定的是证书应覆盖的域名范围,二者必须指向同一逻辑实体——例如均为 preview.example.test。官方文档明确指出,Ingress 默认在入口终止 TLS,内部链路(Ingress → Service → Pod)通常为明文,是否加密需额外设计,不应默认等同于端到端安全。

实践中,最小可行配置需满足三项命名一致性:

  • 证书中的 CN/SAN 域名:必须包含实际访问的 host,如 preview.example.test;
  • TLS Secret 名称:通过 kubectl create secret tls 创建时指定,如 preview-tls;
  • Ingress 中 tls.secretName 字段值:必须与上述 Secret 名称完全一致。
  • 对应 Ingress 清单片段:

    值得注意的是,Ingress 的 tls.hosts 与 rules.host 可不完全相同,但若 tls.hosts 为空或未覆盖访问域名,入口控制器将无法提供有效证书。部分控制器(如 Nginx Ingress)支持通配符证书,但需确保 SAN 字段包含实际请求域名。

    除基础配置外,生产环境还需考虑证书生命周期管理。虽然本文暂不展开自动续期方案(如 cert-manager),但需强调:私钥绝不可提交至 Git 仓库。敏感数据保护可进一步结合 KMS(密钥管理服务)实现静态加密。以京东云 KMS 为例,其通过 gRPC 插件与 kube-apiserver 集成,在 Secret 写入 etcd 前自动加密,读取时实时解密,确保即使 etcd 被未授权访问,Secret 内容仍为密文。

    HTTPS 请求失败时的排查顺序

    该架构中,kube-apiserver 通过 kms-plugin 与外部加密服务器通信,Secret 数据在传输与存储层面均受保护。配置涉及 EncryptionConfiguration、KMS 插件 JSON 参数及 socket 服务部署,适用于对合规性要求较高的金融、政务场景。但需注意,KMS 仅加密 Secret 存储内容,不影响 Ingress 运行时对证书的加载逻辑——入口控制器仍需从 API Server 获取解密后的 Secret 内容用于 TLS 握手。

    另一易混淆点在于 TLS 版本与性能。尽管 Ingress 层面通常由控制器(如 Nginx、Traefik)决定 TLS 协议版本,但底层依赖 OpenSSL 或 BoringSSL 实现。参考 C# 网络编程经验,TLS 1.3 相较 TLS 1.2 可将握手延迟从 500ms 降至 100ms 以内,CPU 开销降低约 30%。若集群内高并发 HTTPS 请求频繁,应确认 Ingress Controller 是否启用 TLS 1.3 支持,并避免兼容旧客户端导致的降级协商。

    此外,测试环境常用自签名证书,此时浏览器会提示“不安全”,需手动信任或配置 Ingress Controller 忽略验证(仅限内网测试)。生产环境务必使用受信任 CA 签发的证书,或通过私有 CA + 企业根证书分发机制建立信任链。

    综上,Kubernetes Ingress 启用 HTTPS 的关键不在复杂度,而在对分层模型的理解:TLS 握手是网络层前置动作,路由是应用层后续决策。三处命名(证书域名、Secret 名、Ingress 引用)必须严格对齐,否则配置即失效。这一机制保障了入口层的统一安全出口,也为后续集成 KMS 加密、TLS 优化等能力奠定基础。