3. Ingress 概念:定义、Controller 作用与资源对象结构
在 Kubernetes 集群中,Service 和 Pod 的 IP 仅在集群内可达。要将集群内部服务暴露到外部,传统方式有 NodePort 和 LoadBalancer,但它们在七层路由、域名分发、TLS 终结等方面能力有限。Ingress 正是为解决这些七层流量管理问题而生的 API 资源。
3.1 Ingress 的定义
Ingress 是 Kubernetes 内置的 API 资源(位于 networking.k8s.io/v1 API 组),它定义了从集群外部到集群内部 Service 的 HTTP 和 HTTPS 路由规则。简单来说,Ingress 充当了“外部流量进入集群的七层网关”的角色。
| 对比维度 | NodePort / LoadBalancer | Ingress |
|---|---|---|
| 工作层级 | 四层(TCP/UDP) | 七层(HTTP/HTTPS) |
| 路由粒度 | 端口级别 | 域名 + 路径级别 |
| TLS 终结 | 不支持(需外部处理) | 原生支持 |
| 多服务复用 | 每个服务需独立端口/IP | 单个 IP 可路由多个服务 |
| 成本 | 高(每个服务消耗公网 IP) | 低(共享入口 IP) |
3.2 Ingress Controller 的作用
Ingress 资源本身只是一个声明式规则对象,它不会自动生效。真正负责“读取 Ingress 规则并实现流量转发”的组件是 Ingress Controller。Ingress Controller 是一个运行在集群中的 Pod,通常以 Deployment + Service(或 DaemonSet)形式部署。
Ingress Controller 的核心职责包括:
- 监听 Ingress 资源:通过 Kubernetes API 实时监听 Ingress、Service、Secret 等资源的变化。
- 生成代理配置:将 Ingress 规则转换为反向代理(如 Nginx、HAProxy、Envoy)的配置文件。
- 动态重载:当规则变更时,自动重载代理配置,实现零停机更新。
- 七层功能实现:包括 TLS 卸载、路径重写、跨域、限流、认证等高级特性。
常见的 Ingress Controller 实现包括:
| Controller 名称 | 底层代理 | 特点 |
|---|---|---|
| Nginx Ingress Controller | Nginx | 社区最成熟,性能稳定,功能全面 |
| Traefik | Go 原生 | 自动发现,支持多种协议,配置热更新 |
| HAProxy Ingress | HAProxy | 高并发场景,TCP/UDP 支持好 |
| Kong Ingress Controller | Kong (OpenResty) | 插件生态丰富,API 网关能力 |
| Istio Ingress Gateway | Envoy | 服务网格集成,精细流量治理 |
3.3 Ingress 资源对象的基本结构
一个标准的 Ingress YAML 资源包含以下核心字段:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: my-ingress
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /
spec:
ingressClassName: nginx
tls:
- hosts:
- app.example.com
secretName: example-tls
rules:
- host: app.example.com
http:
paths:
- path: /api
pathType: Prefix
backend:
service:
name: api-service
port:
number: 8080
- path: /web
pathType: Prefix
backend:
service:
name: web-service
port:
number: 80
- host: admin.example.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: admin-service
port:
number: 3000
各字段说明:
| 字段路径 | 说明 |
|---|---|
spec.ingressClassName |
指定使用哪个 Ingress Controller(对应 IngressClass 资源) |
spec.tls |
HTTPS 配置,指定域名与对应 Secret(含证书和私钥) |
spec.rules[].host |
虚拟主机域名,不指定则匹配所有 Host |
spec.rules[].http.paths[].path |
URL 路径匹配模式 |
spec.rules[].http.paths[].pathType |
路径匹配类型:Prefix(前缀)、Exact(精确)、ImplementationSpecific |
spec.rules[].http.paths[].backend |
后端 Service 引用,包含名称和端口 |
3.4 Ingress 流量路径与组件关系
下图展示了 Ingress 资源、Ingress Controller、后端 Service 之间的完整流量路径:
3.5 路径匹配类型详解
Ingress 支持三种路径匹配类型,选择合适的类型对路由准确性至关重要:
| pathType | 匹配规则 | 示例 | 匹配结果 |
|---|---|---|---|
Exact |
完全匹配 URL 路径,区分大小写 | /api |
仅匹配 /api,不匹配 /api/ 或 /api/v1 |
Prefix |
以指定路径为前缀匹配,支持最长前缀优先 | /api |
匹配 /api、/api/、/api/v1、/api/v2/users |
ImplementationSpecific |
由 Ingress Controller 自行解释,通常等同于 Prefix | — | 取决于具体 Controller 实现 |
Prefix 类型时,如果路径末尾不带 /,某些 Controller 可能不会自动添加斜杠重定向。建议在路径末尾显式添加 / 或通过 annotation 配置重写规则。
3.6 Ingress 与 IngressClass 的关联
在 Kubernetes 1.18+ 中,推荐使用 IngressClass 资源来解耦 Ingress 与具体 Controller 的绑定关系。一个集群中可以部署多个 Ingress Controller,通过 IngressClass 实现选择:
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: nginx
spec:
controller: k8s.io/ingress-nginx
---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
name: traefik
spec:
controller: traefik.io/ingress-controller
Ingress 资源通过 spec.ingressClassName 引用对应的 IngressClass,从而选择由哪个 Controller 处理:
spec:
ingressClassName: nginx # 引用名为 nginx 的 IngressClass