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: 803.2 高级路由策略
- 基于Cookie的流量切分:
nginx.ingress.kubernetes.io/canary: "true" nginx.ingress.kubernetes.io/canary-by-cookie: "canary_user"- 请求头重写:
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;- 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_connip_hashewma(指数加权移动平均,推荐用于混合长短连接场景)
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问题
排查步骤:
- 检查后端服务Endpoint是否就绪
kubectl get endpoints <service-name> - 查看Nginx错误日志
kubectl logs -n ingress-nginx <pod-name> -c controller - 验证网络策略是否放行
kubectl describe networkpolicy -n <namespace>
7.2 配置不生效问题
调试方法:
- 检查Ingress资源事件
kubectl describe ingress <ingress-name> - 获取当前生效的Nginx配置
kubectl exec -n ingress-nginx <pod-name> -c controller -- cat /etc/nginx/nginx.conf - 检查控制器同步状态
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-scripts8.2 动态配置热更新
启用Lua动态配置:
controller: config: enable-dynamic-configuration: "true" dynamic-configuration-retries: "3"实际部署中我们发现,当Ingress规则超过500条时,建议启用动态配置以避免Nginx频繁reload。在流量高峰期前,可以通过预热配置减少首次访问延迟:
curl http://localhost:10246/configuration/backends > /dev/null