1. Ingress:K8S流量管理的核心组件
当你在Kubernetes集群中部署了多个服务后,如何优雅地暴露这些服务给外部用户?这就是Ingress要解决的核心问题。与传统的NodePort或LoadBalancer不同,Ingress提供了基于HTTP/HTTPS的路由规则管理能力,允许你通过域名和路径来区分不同的后端服务。
我在生产环境中管理过数十个微服务,最初使用NodePort时经常遇到端口冲突问题,而LoadBalancer又会产生高昂的云服务成本。直到全面采用Ingress后,才真正实现了:
- 单入口点管理所有服务
- 基于域名的灵活路由
- 集中式的TLS终止
- 细粒度的流量控制
2. Ingress核心架构解析
2.1 Ingress资源与控制器
Ingress的实现分为两个关键部分:
- Ingress资源:K8S API中的一种资源类型,定义路由规则
- Ingress控制器:实际执行路由规则的组件
常见的控制器实现包括:
- Nginx Ingress Controller(最流行)
- Traefik(适合云原生环境)
- HAProxy(高性能场景)
- AWS ALB Ingress Controller(AWS专用)
提示:选择控制器时需要考虑性能特性、支持的注解(annotations)以及与企业现有技术栈的兼容性
2.2 典型Ingress资源配置示例
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: example-ingress annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: rules: - host: api.example.com http: paths: - path: /user-service pathType: Prefix backend: service: name: user-service port: number: 80 - path: /order-service pathType: Prefix backend: service: name: order-service port: number: 80这个配置实现了:
- 将api.example.com/user-service路由到user-service
- 将api.example.com/order-service路由到order-service
- 使用nginx-ingress的rewrite-target注解处理路径重写
3. 高级Ingress功能实战
3.1 TLS证书配置
为Ingress配置HTTPS只需三步:
- 准备证书和私钥
openssl req -x509 -nodes -days 365 -newkey rsa:2048 \ -keyout tls.key -out tls.crt \ -subj "/CN=example.com/O=example"- 创建K8S Secret
kubectl create secret tls example-tls --key tls.key --cert tls.crt- 在Ingress中引用
spec: tls: - hosts: - example.com secretName: example-tls3.2 流量切分与金丝雀发布
通过注解实现按权重路由:
annotations: nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-weight: "20"这会将20%流量路由到该Ingress定义的后端,剩余80%走默认路由。
3.3 基于Header的路由
实现更精细的流量控制:
annotations: nginx.ingress.kubernetes.io/canary-by-header: "X-Env" nginx.ingress.kubernetes.io/canary-by-header-value: "test"当请求包含X-Env: test头时,才会路由到该后端。
4. 生产环境最佳实践
4.1 性能优化配置
annotations: # 连接池配置 nginx.ingress.kubernetes.io/upstream-keepalive-connections: "100" nginx.ingress.kubernetes.io/upstream-keepalive-timeout: "60" nginx.ingress.kubernetes.io/upstream-keepalive-requests: "1000" # 超时设置 nginx.ingress.kubernetes.io/proxy-connect-timeout: "15" nginx.ingress.kubernetes.io/proxy-send-timeout: "20" nginx.ingress.kubernetes.io/proxy-read-timeout: "20" # 缓冲区配置 nginx.ingress.kubernetes.io/proxy-body-size: "20m"4.2 安全加固建议
- 禁用不必要的方法
nginx.ingress.kubernetes.io/limit-whitelist: "GET,POST,PUT"- 防止DDoS攻击
nginx.ingress.kubernetes.io/limit-connections: "100" nginx.ingress.kubernetes.io/limit-rps: "50"- CSP策略
nginx.ingress.kubernetes.io/content-security-policy: "default-src 'self'"4.3 监控与日志
- 启用访问日志
annotations: nginx.ingress.kubernetes.io/enable-access-log: "true" nginx.ingress.kubernetes.io/configuration-snippet: | log_format custom '$remote_addr - $remote_user [$time_local] ' '"$request" $status $body_bytes_sent ' '"$http_referer" "$http_user_agent" $request_time'; access_log /var/log/nginx/access.log custom;- Prometheus监控
annotations: prometheus.io/scrape: "true" prometheus.io/port: "10254"5. 常见问题排查指南
5.1 502 Bad Gateway
检查步骤:
- 确认后端服务健康状态
kubectl get endpoints <service-name> - 检查Ingress控制器日志
kubectl logs -n ingress-nginx <ingress-pod-name> - 验证网络策略是否允许流量
5.2 路由规则不生效
排查方法:
- 检查Ingress资源状态
kubectl describe ingress <ingress-name> - 验证控制器版本是否支持使用的注解
- 检查hosts文件或DNS解析
5.3 TLS证书问题
诊断流程:
- 检查Secret是否存在且类型为kubernetes.io/tls
kubectl get secret <secret-name> - 验证证书有效期
openssl x509 -in tls.crt -noout -dates - 检查证书链是否完整
6. Ingress与其他方案的对比
6.1 与NodePort对比
| 特性 | Ingress | NodePort |
|---|---|---|
| 端口管理 | 统一80/443端口 | 需要管理多个端口 |
| 路由能力 | 基于域名/路径 | 仅端口转发 |
| TLS支持 | 集中管理 | 需各服务单独配置 |
| 适用场景 | 生产环境 | 开发测试环境 |
6.2 与LoadBalancer对比
| 特性 | Ingress | LoadBalancer |
|---|---|---|
| 成本 | 只需一个LB | 每个服务都需要独立LB |
| 功能 | 提供高级路由功能 | 基本四层转发 |
| 云供应商 | 需要额外部署控制器 | 直接集成云厂商LB |
| 性能开销 | 七层处理有额外开销 | 四层转发性能更高 |
7. 新兴趋势:Gateway API
Kubernetes正在发展新一代的Gateway API,旨在解决Ingress的一些局限性:
- 更丰富的路由匹配条件(Header、Query等)
- 跨命名空间的路由支持
- 更清晰的职责分离(GatewayClass、Gateway、Route)
示例配置:
apiVersion: gateway.networking.k8s.io/v1beta1 kind: HTTPRoute metadata: name: http-route-example spec: parentRefs: - name: example-gateway rules: - matches: - path: type: PathPrefix value: /orders backendRefs: - name: order-service port: 80虽然Gateway API前景广阔,但当前Ingress仍是生产环境最成熟的选择。建议新项目可以尝试Gateway API,现有系统继续使用Ingress。