Kubernetes Ingress 解析 — 路由、TLS 与真实案例
Source: Dev.to
Ingress 是您集群的智能 HTTP 入口点。它将流量路由与 Service 暴露分离,并让您能够集中管理 TLS。
为什么 Ingress 很重要
| 问题 | 未使用 Ingress 时会发生什么 |
|---|---|
| 服务暴露 | 每个 Service 都需要自己的 NodePort 或 LoadBalancer。 |
| 成本 | 100 个 Service → 100 个 LoadBalancer → 100 个公网 IP → 100 条独立计费项。 |
| 路由逻辑 | 在 Kubernetes 之外处理(外部负载均衡、手动 DNS)。Kubernetes 对此没有可见性或控制。 |
| TLS 管理 | 每个 Service 都需要自己的证书 → 续订、轮换和配置变得容易出错。 |
Ingress 通过提供单一的第 7 层(HTTP/HTTPS)入口点来解决上述所有问题,它可以:
- 按 主机 和/或 路径 路由流量
- 集中终止 TLS(HTTPS)
- 将流量转发到相应的 Service
⚠️ Ingress 只是一个声明式资源。它需要一个 Ingress Controller(NGINX、Traefik、HAProxy、云特定控制器等)来实际处理流量。
Ingress 工作原理(示意图)
Client (Browser)
↓
Ingress Controller (NGINX / Traefik / …)
↓
Ingress Rules (host / path / TLS)
↓
Service (stable endpoint)
↓
Pods (managed by Deployment)
Source: …
Ingress 基础 – YAML 示例
1️⃣ 简单的基于 Host 的 Ingress
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-ingress
spec:
rules:
- host: app.sharon.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app-service
port:
number: 80
功能说明
- 接收
app.sharon.com的流量 - 将所有请求路由到 Service
app-service - Service 将流量负载均衡到其 Pods
2️⃣ 基于路径的路由(多个 Service)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: multi-app-ingress
spec:
rules:
- host: sharon.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- path: /web
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
路由行为
| 请求 | Service |
|---|---|
sharon.com/api | api-service |
sharon.com/web | web-service |
3️⃣ 基于 Host 的路由(多个域名)
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: host-ingress
spec:
rules:
- host: api.sharon.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: api-service
port:
number: 80
- host: web.sharon.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
路由行为
| 主机名 | Service |
|---|---|
api.sharon.com | api-service |
web.sharon.com | web-service |
4️⃣ 使用 Secret 的 TLS 终止
创建 TLS Secret(每个域名一次):
kubectl create secret tls app-tls \
--cert=cert.pem \
--key=key.pem
使用该 Secret 的 Ingress:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: tls-ingress
spec:
tls:
- hosts:
- app.sharon.com
secretName: app-tls
rules:
- host: app.sharon.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: app-service
port:
number: 80
功能说明
- 在 Ingress Controller 处终止 HTTPS
- 集群内部流量仍为 HTTP(无需在 Pod 中配置 TLS)
- 证书统一管理,而不是每个 Service 单独管理
Ingress 与 LoadBalancer(功能比较)
| 特性 | Ingress | LoadBalancer |
|---|---|---|
| OSI 层 | L7(HTTP/HTTPS) | L4(TCP/UDP) |
| 路由 | 基于主机和路径 | 无(单一 Service) |
| TLS | 是(集中式 secret) | 受限(每个 LB) |
| 成本 | 低 – 单个外部负载均衡器 | 高 – 每个 Service 一个 LB |
| 可扩展性 | 高(多个 Service 共享一个入口) | 受限(每个 Service 一个 LB) |
| 典型用例 | HTTP/HTTPS 应用 | 非 HTTP 工作负载或简单暴露 |
常见陷阱(不要做的事)
- 在没有 Ingress 控制器的情况下创建 Ingress – 该资源永远不会激活。
- 为每个 Service 使用 LoadBalancer – 会导致不必要的成本和复杂性。
- 忘记 DNS 配置 – Ingress 规则中的主机名必须解析到 Ingress 控制器的外部 IP。
- 混合 Service 暴露和路由逻辑 – 将 Service 类型(
ClusterIP)与 Ingress 路由分开。 - 为每个 Service 单独管理 TLS – 这违背了集中式 TLS 终止的目的。
何时使用 Ingress
当您满足以下情况时使用 Ingress:
- 运行 HTTP/HTTPS 应用程序。
- 需要 按域名或路径进行路由(多租户或微服务架构)。
- 想要 集中管理 TLS(每个域名一个 secret)。
- 想要 通过共享单个外部 IP 来降低云负载均衡器成本。
端到端流程(完整视图)
Internet
|
v
DNS(域名 → Ingress Controller 的外部 IP)
|
v
Ingress Controller(NGINX / Traefik / …)
|
v
Ingress Rules(主机 / 路径 / TLS)
|
v
Service(ClusterIP – 稳定端点)
|
v
Pods(由 Deployment / ReplicaSet 管理)
健康 Ingress 设置快速检查清单
- 部署 Ingress 控制器(NGINX、Traefik、HAProxy、云厂商专用等)。
- 创建 DNS 记录,将你的域名指向控制器的外部 IP。
- 定义 Ingress 资源,并写好所需的 host/path 规则。
- 创建 TLS secret(如果需要 HTTPS),并在 Ingress 规范中引用它们。
- 将 Service 类型设为
ClusterIP(不需要对外暴露)。 - 验证 流量是否通过
curl/浏览器到达正确的 Pod,以及 TLS 终止是否正常(openssl s_client -connect …)。
TL;DR
- Ingress = 为多个 Service 提供单一、智能的 HTTP 入口点。
- Ingress Controller = 使 Ingress 规则生效的引擎。
- 优势: 成本低、路由集中、TLS 管理统一。
祝你集群愉快! 🚀
每个 Service 都需要自己的 TLS 证书。
证书必须进行续期、轮换,并针对每个 Service 进行配置。
为数十个 Service 管理 HTTPS 容易出错且难以扩展。
在生产环境中 Ingress 并非可选——它是 Kubernetes 中 HTTP 流量的控制平面。