Kubernetes Ingress-Nginx部署与优化指南

Kubernetes Ingress-Nginx部署与优化指南

1. Ingress-Nginx核心概念解析

在Kubernetes生态中,Ingress-Nginx作为流量入口控制器扮演着关键角色。它本质上是一个基于Nginx的7层负载均衡器实现,通过监听Kubernetes API Server的Ingress资源变更,动态生成Nginx配置并实现流量路由。与传统的Nginx部署不同,Ingress-Nginx通过IngressClass机制支持多实例部署,允许集群内同时存在多个相互隔离的入口控制器。

典型应用场景包括:

  • 基于路径/域名的HTTP路由分发
  • TLS/SSL终端卸载
  • 灰度发布流量切分
  • 自定义请求头处理
  • 四层TCP/UDP代理(需配合ConfigMap)

当前主流版本分为两种分支:

  • Kubernetes社区维护的ingress-nginx(本文主要讨论对象)
  • Nginx官方维护的nginx-ingress(功能更接近商业版Nginx)

2. 安装部署最佳实践

2.1 生产级Helm部署方案

推荐使用Helm 3进行部署,相比直接应用YAML文件具有更好的可配置性:

helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx helm install ingress-nginx ingress-nginx/ingress-nginx \ --namespace ingress-nginx \ --create-namespace \ --set controller.replicaCount=3 \ --set controller.nodeSelector."kubernetes\.io/os"=linux \ --set controller.admissionWebhooks.enabled=false \ --set controller.metrics.enabled=true

关键参数说明:

  • replicaCount:根据节点数量设置,通常与工作节点数保持一致
  • admissionWebhooks:生产环境建议关闭ValidatingWebhook以降低延迟
  • metrics.enabled:开启Prometheus指标暴露

2.2 核心资源分配建议

通过resources字段配置资源限制:

controller: resources: requests: cpu: 500m memory: 1Gi limits: cpu: 2000m memory: 4Gi

容量规划参考值:

  • 每1000 RPS约需要1核CPU
  • 内存消耗与路由规则数量正相关,每100条规则约需额外100MB内存

3. 路由配置深度解析

3.1 多域名路由实战

以下是一个支持HTTPS的多域名配置示例:

apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-app annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: 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: / pathType: Prefix backend: service: name: web-service port: number: 80

3.2 高级路由策略

  1. 基于Cookie的流量切分
nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-cookie: "canary_user"
  1. 请求头重写
nginx.ingress.kubernetes.io/configuration-snippet: | proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  1. CORS配置
nginx.ingress.kubernetes.io/enable-cors: "true" nginx.ingress.kubernetes.io/cors-allow-origin: "https://*.example.com"

4. 性能调优指南

4.1 内核参数优化

通过controller.config配置Nginx核心参数:

controller: config: worker-processes: "4" keep-alive: "75" upstream-keepalive-connections: "1000" upstream-keepalive-requests: "100" upstream-keepalive-timeout: "60"

4.2 负载均衡算法选择

nginx.ingress.kubernetes.io/load-balance: "ewma"

可选算法:

  • round_robin(默认)
  • least_conn
  • ip_hash
  • ewma(指数加权移动平均,推荐用于混合长短连接场景)

5. 安全加固方案

5.1 TLS安全策略

controller: config: ssl-protocols: "TLSv1.2 TLSv1.3" ssl-ciphers: "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256" ssl-prefer-server-ciphers: "true" ssl-session-tickets: "false"

5.2 防DDoS配置

nginx.ingress.kubernetes.io/limit-connections: "100" nginx.ingress.kubernetes.io/limit-rps: "50" nginx.ingress.kubernetes.io/limit-burst-multiplier: "5"

6. 监控与日志方案

6.1 Prometheus监控指标

关键监控指标:

  • nginx_ingress_controller_requests:请求量统计
  • nginx_ingress_controller_request_duration_seconds:延迟分布
  • nginx_ingress_controller_connections:连接数

6.2 日志结构化输出

配置JSON格式访问日志:

controller: config: log-format-upstream: '{"time":"$time_iso8601","remote_addr":"$remote_addr","request":"$request","status":$status,"body_bytes_sent":$body_bytes_sent,"request_time":$request_time,"upstream_response_time":"$upstream_response_time","http_referrer":"$http_referer","http_user_agent":"$http_user_agent"}'

7. 常见问题排查

7.1 502 Bad Gateway问题

排查步骤:

  1. 检查后端服务Endpoint是否就绪
    kubectl get endpoints <service-name>
  2. 查看Nginx错误日志
    kubectl logs -n ingress-nginx <pod-name> -c controller
  3. 验证网络策略是否放行
    kubectl describe networkpolicy -n <namespace>

7.2 配置不生效问题

调试方法:

  1. 检查Ingress资源事件
    kubectl describe ingress <ingress-name>
  2. 获取当前生效的Nginx配置
    kubectl exec -n ingress-nginx <pod-name> -c controller -- cat /etc/nginx/nginx.conf
  3. 检查控制器同步状态
    kubectl get ingress -o jsonpath='{.items[*].metadata.annotations.nginx\.ingress\.kubernetes\.io/last-applied-configuration}'

8. 高级功能扩展

8.1 自定义模块加载

通过ConfigMap加载Lua脚本:

controller: extraVolumeMounts: - name: lua-scripts mountPath: /etc/nginx/lua extraVolumes: - name: lua-scripts configMap: name: nginx-lua-scripts

8.2 动态配置热更新

启用Lua动态配置:

controller: config: enable-dynamic-configuration: "true" dynamic-configuration-retries: "3"

实际部署中我们发现,当Ingress规则超过500条时,建议启用动态配置以避免Nginx频繁reload。在流量高峰期前,可以通过预热配置减少首次访问延迟:

curl http://localhost:10246/configuration/backends > /dev/null