这段内容核心讲解了 如何在 Kubernetes(K8s)中为 Ingress 资源配置 TLS 加密(即实现 HTTPS 访问) ,涉及关键组件、规则和技术细节。下面从基础概念到实操逻辑进行逐点拆解。
一、先明确 3 个核心前置概念
在理解原文前,需要先理清 K8s 中与 “HTTPS 接入” 直接相关的 3 个组件:
- Ingress:K8s 中管理 “外部流量进入集群内部服务” 的 API 资源。简单说,它是集群的 “入口网关”,负责把外部的 HTTP/HTTPS 请求转发到集群内的 Service(进而转发到 Pod)。
- Secret:K8s 中用于存储敏感信息(如密码、证书、私钥)的资源,避免敏感数据明文写在配置文件里。它是一种 “安全的配置存储媒介”。
- TLS(Transport Layer Security) :用于在网络传输中加密数据的协议(HTTPS = HTTP + TLS)。实现 TLS 需两个核心文件:
-
- 证书(Certificate, .crt) :公开文件,用于告诉客户端 “服务端的身份是可信的”(由 CA 机构签发或自签)。
-
- 私钥(Private Key, .key) :保密文件,服务端用于解密客户端发来的加密数据,绝对不能泄露。
二、原文核心要点逐句解析
1. “You can secure an Ingress by specifying a Secret that contains a TLS private key and certificate.”
核心含义:给 Ingress 配置 HTTPS 的核心操作,是 “让 Ingress 引用一个存储了 TLS 私钥和证书的 Secret”。
- 为什么用 Secret?
TLS 私钥是极高敏感数据,若直接写在 Ingress 配置里,会有泄露风险。Secret 提供了加密存储和权限控制,是 K8s 官方推荐的敏感数据管理方式。
- 操作逻辑:先创建一个存了 tls.crt(证书)和 tls.key(私钥)的 Secret,再在 Ingress 配置中通过字段引用这个 Secret。
2. “The Ingress resource only supports a single TLS port, 443, and assumes TLS termination at the ingress point (traffic to the Service and its Pods is in plaintext).”
核心含义:Ingress 对 TLS 的两个关键限制与默认行为。
要点 | 解释 |
---|---|
仅支持 TLS 端口 443 | 这是 HTTPS 的标准端口,Ingress 规范强制 TLS 流量必须走 443 端口(无需手动指定其他端口)。 |
TLS 终止(Termination) | 这是最关键的概念: - 终止点:TLS 加密和解密的操作发生在 Ingress 控制器(如 Nginx Ingress Controller)上。 - 后端流量:Ingress 控制器解密后,会以 明文 HTTP 的方式将流量转发给后端的 Service 和 Pod。 - 类比:快递在小区门口(Ingress)拆包(解密),之后用普通方式(明文)送到住户家(Pod)。 |
补充:后端流量也可配置为加密(TLS 直通),但这是高级用法,原文描述的是 Ingress 的默认假设。
3. “If the TLS configuration section in an Ingress specifies different hosts, they are multiplexed on the same port according to the hostname specified through the SNI TLS extension (provided the Ingress controller supports SNI).”
核心含义:如何用一个 Ingress 为多个域名(Host)提供 HTTPS 服务(多域名复用 443 端口)。
- 解决方案:SNI(Server Name Indication) ,TLS 协议的扩展功能。
-
- 原理:客户端发起 HTTPS 连接时,会在 TLS 握手的第一步就告诉服务端(Ingress 控制器)“我要访问的域名是哪个”(比如 a.com)。
- 前提:Ingress 控制器必须支持 SNI(主流控制器如 Nginx Ingress、Traefik 均支持)。
4. “The TLS secret must contain keys named tls.crt and tls.key that contain the certificate and private key to use for TLS.”
核心含义:存储 TLS 信息的 Secret 有 “强制格式要求”—— 必须包含两个固定键名的条目。
K8s 对 “TLS 类型的 Secret” 有严格规范:
- Secret 的 type 必须指定为 kubernetes.io/tls(创建时需显式声明)。
- Secret 的 data 字段中,必须包含两个键:
-
- tls.crt:值为证书文件(.crt)的 Base64 编码字符串。
-
- tls.key:值为私钥文件(.key)的 Base64 编码字符串。
为什么要 Base64 编码?因为 Secret 的 data 字段要求值必须是 Base64 格式,这是 K8s 的存储规范。
三、实操示例:完整配置流程
结合原文要点,用一个 “为 a.com 和 b.com 配置 HTTPS” 的例子,直观展示整个流程。
步骤 1:准备 TLS 证书和私钥
假设已获取两个域名的证书和私钥:
步骤 2:创建 TLS 类型的 Secret
为每个域名创建一个 Secret(或用通配符证书创建一个 Secret 对应多个域名)。
以 a.com 为例,创建 a-com-tls-secret.yaml:
apiVersion: v1
kind: Secret
metadata:
name: a-com-tls # Secret 名称,后续 Ingress 会引用
namespace: default
type: kubernetes.io/tls # 必须是这个类型
data:
tls.crt: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUN5RENDQWJDZ0F3SUJBZ0lCQURBTkJna3Foa2lHOXcwQkFRc0ZBREFWTVJNd0VRWURWUVFERXdwcmRXSmwKY201bGRHVnpNQjRYRFRJek1EUXhNVEl4TURReE16SXhNRFEe... # a.com.crt 的 Base64 编码
tls.key: LS0tLS1CRUdJTiBQUklWQVRFIEtFWS0tLS0tCk1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBd2ZqM2... # a.com.key 的 Base64 编码
执行创建:kubectl apply -f a-com-tls-secret.yaml
同理创建 b-com-tls Secret。
步骤 3:创建引用 Secret 的 Ingress
创建 tls-ingress.yaml,同时配置 a.com 和 b.com 的 HTTPS 转发:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-demo-ingress
namespace: default
spec:
ingressClassName: nginx # 指定 Ingress 控制器(如 nginx)
tls: # TLS 配置段,对应原文的 "TLS configuration section"
- hosts: # 第一个域名组
- a.com # 要配置 HTTPS 的域名
secretName: a-com-tls # 引用对应的 Secret
- hosts: # 第二个域名组(通过 SNI 复用 443 端口)
- b.com
secretName: b-com-tls
rules: # 路由规则(解密后转发到后端 Service)
- host: a.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: a-service # 后端 Service 名称
port:
number: 80 # 后端 Service 的端口(明文 HTTP)
- host: b.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: b-service
port:
number: 80
执行创建:kubectl apply -f tls-ingress.yaml
四、核心总结
- 目的:通过 TLS 加密保护 Ingress 入口的流量,实现 HTTPS 访问。
- 关键依赖:TLS 证书 + 私钥(存于 kubernetes.io/tls 类型的 Secret 中,键名固定为 tls.crt/tls.key)。
- 端口限制:TLS 流量仅走标准端口 443。
- 转发逻辑:Ingress 控制器负责 TLS 终止(解密),后端 Service/Pod 接收明文流量。
- 多域名支持:通过 SNI 扩展实现多个域名复用 443 端口,需 Ingress 控制器支持。
通过这套配置,K8s 集群就能对外提供安全的 HTTPS 服务,同时满足多域名、高安全性的需求。