目录
[Ingress Controller 选型对比](#Ingress Controller 选型对比)
[Ingress Controller](#Ingress Controller)
[常见 Ingress Controller 实现](#常见 Ingress Controller 实现)
[(1) Nginx Ingress Controller](#(1) Nginx Ingress Controller)
[Istio Ingress Gateway](#Istio Ingress Gateway)
[云厂商专用 Controller](#云厂商专用 Controller)
[用户创建 Ingress 资源](#用户创建 Ingress 资源)
[Ingress Controller 监听并处理变化](#Ingress Controller 监听并处理变化)
[(1) 路径匹配策略](#(1) 路径匹配策略)
[(2) TLS 终止](#(2) TLS 终止)
[(3) 注解(Annotations)扩展功能](#(3) 注解(Annotations)扩展功能)
[(4) 多域名与多路径](#(4) 多域名与多路径)
[不同 Ingress Controller 的差异](#不同 Ingress Controller 的差异)
Ingress组成
在 Kubernetes 中,Ingress 是服务发布进阶的核心组件,它通过统一的入口管理外部流量到集群内部服务的路由,支持基于域名、路径的精细化控制,并提供负载均衡、SSL 终止、流量重定向等高级功能。
-
统一流量入口
- 通过单个 IP 或域名暴露多个服务,避免为每个服务单独配置
LoadBalancer
或NodePort
,简化集群外部访问管理。 - 示例:一个域名下通过路径
/api
和/web
分别路由到不同后端服务。
- 通过单个 IP 或域名暴露多个服务,避免为每个服务单独配置
-
基于域名和路径的路由
-
支持精确匹配(
Exact
)或前缀匹配(Prefix
),实现微服务架构下的流量拆分。 -
示例配置:
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: "api.example.com" http: paths: - path: /v1 pathType: Prefix backend: service: name: v1-service port: number: 80 - host: "web.example.com" http: paths: - path: / pathType: Prefix backend: service: name: web-service port: number: 80
-
-
负载均衡与高可用
- Ingress Controller(如 Nginx、Traefik)内置负载均衡算法(轮询、加权轮询等),自动分发流量到后端 Pod,提升服务可用性。
-
SSL/TLS 终止
-
集中管理 HTTPS 证书,解密请求后转发明文流量到后端服务,减轻后端负担。
-
示例:通过
Secret
引用证书:|----------------------------------|
|spec:
|
|tls:
|
|- hosts:
|
|- example.com
|
|secretName: example-tls-secret
|
-
-
流量重定向与重写
-
支持 HTTP 到 HTTPS 的强制跳转(
ssl-redirect
)、路径重写(rewrite-target
)等,满足复杂业务需求。 -
示例:将
/old-path
重写为/new-path
:|---------------------------------------------------------|
|metadata:
|
|annotations:
|
|nginx.ingress.kubernetes.io/rewrite-target: /new-path
|
-
Ingress Controller 选型对比
Controller | 优势 | 适用场景 |
---|---|---|
Nginx Ingress | 官方维护,社区活跃,功能稳定;支持丰富的注解(如重写、限流、CORS)。 | 传统 Web 服务、微服务架构。 |
Traefik | 动态配置自动发现,支持 Docker/K8s 原生集成;内置 Dashboard 监控。 | 云原生环境、需要快速迭代的场景。 |
Istio Ingress | 与 Service Mesh 深度集成,支持流量镜像、熔断、灰度发布等高级流量管理。 | 复杂微服务治理、需要观测性的场景。 |
ALB Ingress (AWS) | 云原生负载均衡器,支持 WebSocket、HTTP/2;按请求量计费,成本优化。 | AWS 云环境,大规模流量场景。 |
推荐选择:
- 通用场景:Nginx Ingress(功能全面,生态成熟)。
- 云原生环境:Traefik(轻量级,动态配置)。
- 复杂流量治理:Istio Ingress(结合 Service Mesh)。
Ingress Controller
Ingress Controller 是 Kubernetes 中实际执行 Ingress
资源规则的核心组件,它负责监听集群内 Ingress
对象的变化,并根据定义的路由规则(如域名、路径、TLS 终止等)动态配置底层负载均衡器(如 Nginx、Envoy 等),将外部流量转发到集群内部的服务。
核心定义
- 角色:Ingress Controller 是 Kubernetes 的"流量网关",充当集群外部流量与内部服务之间的桥梁。
- 与 Ingress 的关系 :
- Ingress 资源 :定义流量路由规则(如"将
app.example.com/api
转发到api-service
")。 - Ingress Controller :解析这些规则并实际转发流量(如配置 Nginx 的
server
和location
块)。
- Ingress 资源 :定义流量路由规则(如"将
类比:
Ingress
像"交通规则手册",定义了车辆(流量)如何行驶。Ingress Controller
像"交通警察",根据规则指挥车辆(转发请求)。
工作原理
动态监听与配置
- 监听 Ingress 变化 :
Ingress Controller 通过 Kubernetes API 监听Ingress
、Service
、Endpoint
等资源的变化(如新增、删除、更新)。 - 生成配置文件 :
根据Ingress
规则动态生成负载均衡器的配置文件(如 Nginx 的nginx.conf
、Traefik 的静态配置)。 - 热重载配置 :
无需重启,直接加载新配置(如 Nginx 通过nginx -s reload
)。
流量转发流程
- 外部请求到达 :
用户访问https://app.example.com/api
,DNS 解析到 Ingress Controller 的外部 IP(如 LoadBalancer 或 NodePort)。 - 匹配 Ingress 规则 :
Ingress Controller 根据域名(app.example.com
)和路径(/api
)找到对应的Ingress
资源。 - 选择后端服务 :
通过Ingress
中定义的backend
(如api-service:80
)找到目标 Service。 - 负载均衡转发 :
根据负载均衡算法(如轮询、IP 哈希)将请求转发到 Service 对应的 Pod。
常见 Ingress Controller 实现
(1) Nginx Ingress Controller
- 特点 :
- 官方维护,社区活跃,功能全面。
- 支持丰富的注解(如重写路径、限流、CORS、WebSocket)。
- 适合传统 Web 服务和微服务架构。
- 部署方式 :
-
通过
DaemonSet
(每个节点部署一个 Pod)或Deployment
(可伸缩)。 -
示例命令:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/main/deploy/static/provider/cloud/deploy.yaml
-
Traefi
- 特点 :
- 轻量级,动态配置自动发现(无需手动重启)。
- 内置 Dashboard 监控,支持 Docker/K8s 原生集成。
- 适合云原生环境和快速迭代的场景。
- 部署方式 :
-
通过 Helm Chart 安装:
helm repo add traefik https://traefik.github.io/charts helm install traefik traefik/traefik
-
Istio Ingress Gateway
- 特点 :
- 与 Istio Service Mesh 深度集成,支持高级流量治理(如熔断、灰度发布、流量镜像)。
- 基于 Envoy 代理,提供强大的可观测性(Metrics、Tracing、Logging)。
- 适合复杂微服务架构和需要精细化流量控制的场景。
- 部署方式 :
-
作为 Istio 的一部分安装:
istioctl install --set profile=demo -y kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.19/samples/addons/prometheus.yaml
-
云厂商专用 Controller
- AWS ALB Ingress Controller :
- 直接管理 AWS Application Load Balancer (ALB),支持 WebSocket、HTTP/2。
- 按请求量计费,适合大规模流量场景。
- GCP GCE Ingress Controller :
- 集成 Google Cloud Load Balancer,支持全局负载均衡。
核心功能对比
功能 | Nginx Ingress | Traefik | Istio Ingress |
---|---|---|---|
负载均衡算法 | 轮询、IP 哈希等 | 轮询、加权轮询 | 轮询、随机、最少连接 |
TLS 终止 | 支持 | 支持 | 支持 |
路径重写 | 支持(注解) | 支持 | 支持(VirtualService) |
流量镜像 | 不支持 | 不支持 | 支持 |
熔断限流 | 通过注解(有限支持) | 通过 Middleware | 支持(DestinationRule) |
可观测性 | 基础 Metrics | 内置 Dashboard | 集成 Prometheus/Grafana |
部署复杂度 | 中等 | 低 | 高(需配合 Istio) |
lngress工作原理
Ingress 是 Kubernetes 中管理外部流量进入集群的核心机制,其工作原理涉及多个组件的协同,包括 Ingress 资源 、Ingress Controller 、底层负载均衡器 (如 Nginx、Envoy)以及 Kubernetes 的 Service/Endpoint 机制
核心组件与角色
组件 | 角色 |
---|---|
Ingress 资源 | 定义流量路由规则(如域名、路径、TLS 终止、后端服务等)。 |
Ingress Controller | 监听 Ingress 变化,动态生成负载均衡器配置(如 Nginx 的 nginx.conf )。 |
负载均衡器 | 实际转发流量的代理(如 Nginx、Envoy、Traefik)。 |
Service/Endpoint | 提供后端服务的集群内访问地址(ClusterIP + Pod IP 列表)。 |
完整工作流程
用户创建 Ingress 资源
-
定义路由规则 :
用户通过 YAML 文件创建
Ingress
资源,指定域名、路径和后端服务。
示例:apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress spec: rules: - host: "app.example.com" http: paths: - path: /api pathType: Prefix backend: service: name: api-service port: number: 80
-
Ingress 存入 etcd :
Kubernetes API Server 将
Ingress
资源持久化到 etcd 数据库。
Ingress Controller 监听并处理变化
-
监听 Ingress 事件 :
Ingress Controller(如 Nginx Ingress)通过 Informer 机制 监听 Kubernetes API,捕获
Ingress
、Service
、Endpoint
等资源的创建/更新/删除事件。 -
生成配置模板 :
Controller 根据
Ingress
规则生成负载均衡器的配置模板。例如:- Nginx :生成
server
和location
块,匹配域名和路径。 - Traefik:动态创建 Router 和 Service 配置。
- Istio :生成
VirtualService
和Gateway
资源。
- Nginx :生成
-
填充后端信息 :
Controller 查询
Service
对应的Endpoint
(即健康 Pod 的 IP 和端口),将动态后端信息填入配置。
示例:# Nginx 生成的配置片段 server { listen 80; server_name app.example.com; location /api { proxy_pass http://10.244.1.5:8080; # Pod IP:Port proxy_pass http://10.244.2.3:8080; # 多副本 Pod } }
负载均衡器热重载配置
-
无中断更新 :
Controller 通过信号或 API 触发负载均衡器重新加载配置(如 Nginx 的
nginx -s reload
),无需重启进程。 -
健康检查 :
负载均衡器定期检查后端 Pod 的健康状态(通过
readinessProbe
),自动剔除不健康的 Pod。
外部流量转发
-
用户请求到达 :
用户访问
http://app.example.com/api
,DNS 解析到 Ingress Controller 的外部 IP(如 LoadBalancer 或 NodePort)。 -
匹配 Ingress 规则 :
Ingress Controller 根据域名和路径找到对应的
Ingress
资源,确定目标 Service。 -
负载均衡转发 :
根据配置的算法(如轮询、IP 哈希)将请求转发到 Service 对应的健康 Pod。
关键细节解析
(1) 路径匹配策略
Prefix
:路径前缀匹配(如/api
匹配/api/v1
)。Exact
:精确路径匹配(如/api
仅匹配/api
)。ImplementationSpecific
:由具体 Controller 实现(如 Nginx 默认使用前缀匹配)。
(2) TLS 终止
-
用户创建 TLS Secret:
apiVersion: v1 kind: Secret metadata: name: example-tls-secret type: kubernetes.io/tls data: tls.crt: <base64-encoded-cert> tls.key: <base64-encoded-key>
-
Ingress 引用 Secret:
spec: tls: - hosts: - app.example.com secretName: example-tls-secret
-
Controller 配置 HTTPS :
Nginx Controller 会生成包含 SSL 证书的
server
块,终止 HTTPS 并转发 HTTP 到后端。
(3) 注解(Annotations)扩展功能
-
Nginx 注解示例 :
metadata: annotations: nginx.ingress.kubernetes.io/rewrite-target: "/new-path" # 路径重写 nginx.ingress.kubernetes.io/ssl-redirect: "true" # 强制 HTTPS nginx.ingress.kubernetes.io/limit-rps: "10" # 限流
(4) 多域名与多路径
-
单个 Ingress 支持多规则 :
spec: rules: - host: "app1.example.com" http: paths: - path: / backend: { service: app1-service, port: 80 } - host: "app2.example.com" http: paths: - path: / backend: { service: app2-service, port: 80 }
不同 Ingress Controller 的差异
特性 | Nginx Ingress | Traefik | Istio Ingress |
---|---|---|---|
配置更新方式 | 热重载 nginx.conf |
动态 Router 发现 | 通过 VirtualService 更新 |
流量治理 | 基础负载均衡 | 支持 Middleware(限流、重试) | 熔断、灰度发布、流量镜像 |
可观测性 | 基础 Metrics | 内置 Dashboard | 集成 Prometheus/Grafana |
适用场景 | 传统 Web 服务 | 云原生、快速迭代 | 复杂微服务架构 |