Kubernetes Ingress 是管理集群外部访问的核心组件,它提供了灵活的流量路由、TLS 终止和负载均衡能力。然而,Ingress 的类型和功能因控制器不同而有所差异,选择合适的 Ingress 策略对架构设计至关重要。
本文将系统介绍 Kubernetes Ingress 的不同类型、适用场景,并提供详细的配置示例,帮助读者掌握 Ingress 的高级用法。
Ingress 是 Kubernetes 的一种 API 对象,用于定义外部访问集群服务的规则。它不同于 Service(仅提供内部负载均衡),而是通过 Ingress 控制器(如 Nginx、Traefik) 实现 L7 路由、SSL 卸载和域名管理。
核心功能:
最常见的类型,适用于 Web 应用。支持基于路径或域名的路由,并可配置 TLS 证书。
示例配置:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: http-ingress
spec:
rules:
- host: example.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
tls:
- hosts:
- example.com
secretName: tls-secret # 引用存储证书的 Secret适用于非 HTTP 服务(如 MySQL、Redis)。需通过 Ingress 控制器的扩展功能实现。
Nginx 示例:
修改 Nginx Ingress 控制器配置:
# nginx-tcp-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: tcp-services
namespace: ingress-nginx
data:
3306: "default/mysql-service:3306" # 将 3306 端口映射到 MySQL Service更新 Ingress 控制器启动参数:
args:
- --tcp-services-configmap=$(POD_NAMESPACE)/tcp-services直接转发所有流量到指定服务,适用于简单场景。
spec:
defaultBackend:
service:
name: default-service
port:
number: 80如 /api 转发到后端 API 服务,/static 转发到静态资源服务。
不同域名(如 a.example.com 和 b.example.com)路由到不同服务。
在 Ingress 控制器处解密 HTTPS,明文转发到后端。
tls:
- hosts:
- example.com
secretName: tls-secret加密流量直达后端(如金融类应用)。需 Nginx 或 Traefik 支持。
annotations:
nginx.ingress.kubernetes.io/ssl-passthrough: "true"控制器 | 特点 |
|---|---|
Nginx | 支持 HTTP/HTTPS、TCP/UDP、重写规则、Canary 发布 |
Traefik | 动态配置,支持中间件(熔断、重试) |
AWS ALB | 深度集成 AWS,支持 ALB 特性(如 WAF、跨可用区负载均衡) |
Istio | 基于 Gateway + VirtualService,提供高级流量管理(如 A/B 测试) |
逐步灰度发布新版本,适用于 CI/CD。
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "20" # 20% 流量到新版本路由到集群外服务(类似 ExternalName Service)。
功能 | Nginx | Traefik | AWS ALB | Istio |
|---|---|---|---|---|
HTTP/HTTPS | ✅ | ✅ | ✅ | ✅ |
TCP/UDP | ✅ | ✅ | ❌ | ❌ |
动态配置 | ❌ | ✅ | ❌ | ✅ |
金丝雀发布 | ✅ | ✅ | ❌ | ✅ |
服务网格集成 | ❌ | ❌ | ❌ | ✅ |
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: web-ingress
spec:
rules:
- host: myapp.com
http:
paths:
- path: /
backend:
service:
name: frontend
port:
number: 80apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: canary-ingress
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "30"
spec:
rules:
- host: myapp.com
http:
paths:
- path: /
backend:
service:
name: frontend-v2 # 30% 流量到新版本
port:
number: 80whitelist-source-range 注解限制 IP 访问。Kubernetes Ingress 提供了强大的流量管理能力,但选择合适的类型和控制器至关重要。本文介绍了 HTTP/HTTPS、TCP/UDP、Canary 等常见模式,并提供了 Nginx、Traefik 的配置示例。
在实际生产环境中,建议:
通过合理设计 Ingress 策略,可以显著提升 Kubernetes 应用的可用性、安全性和可维护性。