1. 为什么需要七层负载均衡
在Kubernetes集群中,Service资源提供了四层(TCP/UDP)负载均衡能力,这对于大多数基础服务来说已经足够。但当我们需要基于HTTP/HTTPS协议头、路径或主机名进行更细粒度的流量分发时,四层负载均衡就显得力不从心了。
七层负载均衡(即应用层负载均衡)能够解析HTTP/HTTPS协议内容,根据请求的URL路径、主机头、Cookie等信息进行智能路由。这在微服务架构中尤为重要,因为:
- 多个服务可能共享同一个IP地址
- 需要根据业务规则进行A/B测试
- 要实现灰度发布或蓝绿部署
- 需要对不同路径的请求进行限流或认证
Ingress作为Kubernetes原生的七层负载均衡解决方案,完美填补了这个空白。它通过定义一组规则,描述了外部流量应该如何转发到集群内部的服务。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Ingress核心架构解析
2.1 Ingress资源与控制器
Ingress的实现分为两个部分:
- Ingress资源:Kubernetes API中的一种资源类型,用于声明路由规则
- Ingress控制器:实际执行路由规则的组件,通常以Pod形式运行在集群中
常见的Ingress控制器实现包括:
- Nginx Ingress Controller
- Traefik
- HAProxy Ingress
- AWS ALB Ingress Controller
提示:Ingress控制器不是Kubernetes内置组件,需要用户自行选择和部署。不同控制器的功能和性能特点有所差异。
2.2 典型请求流程
当客户端发起一个HTTP请求时,完整的处理流程如下:
- DNS解析将域名指向Ingress控制器所在的服务外部IP
- 请求到达Ingress控制器(如Nginx Pod)
- 控制器根据Ingress资源定义的规则匹配请求的host和path
- 将请求转发到对应的Service
- Service通过Endpoint选择Pod进行最终处理
3. 实战:部署Nginx Ingress控制器
3.1 环境准备
在开始前,请确保:
- 已部署Kubernetes集群(v1.19+)
- 已安装kubectl并配置好集群访问
- 集群有足够的资源(建议至少2个节点,每个节点2CPU+4GB内存)
3.2 部署Ingress控制器
使用官方提供的清单文件部署Nginx Ingress控制器:
bash复制kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.1/deploy/static/provider/cloud/deploy.yaml
这个命令会创建:
- ingress-nginx命名空间
- Deployment和Pod运行控制器
- Service暴露控制器(默认类型为LoadBalancer)
- 各种RBAC资源
3.3 验证安装
检查控制器Pod是否正常运行:
bash复制kubectl get pods -n ingress-nginx -l app.kubernetes.io/name=ingress-nginx
获取外部访问地址:
bash复制kubectl get svc -n ingress-nginx
如果使用的是云服务商,应该能看到一个外部IP被分配。如果是本地环境(如Minikube),可能需要额外命令:
bash复制minikube service -n ingress-nginx ingress-nginx-controller
4. 配置Ingress资源
4.1 基本Ingress示例
假设我们有两个服务:
- frontend: 处理/web路径的请求
- backend: 处理/api路径的请求
对应的Ingress配置如下:
yaml复制apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: example-ingress
spec:
rules:
- host: "myapp.example.com"
http:
paths:
- path: /web
pathType: Prefix
backend:
service:
name: frontend
port:
number: 80
- path: /api
pathType: Prefix
backend:
service:
name: backend
port:
number: 80
4.2 高级配置选项
4.2.1 TLS终止
要为Ingress启用HTTPS,需要先创建Secret保存证书和私钥:
bash复制kubectl create secret tls myapp-tls --cert=path/to/cert.pem --key=path/to/key.pem
然后在Ingress中引用:
yaml复制spec:
tls:
- hosts:
- myapp.example.com
secretName: myapp-tls
4.2.2 路径重写
某些前端框架需要路径重写支持,可以通过注解实现:
yaml复制metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
spec:
rules:
- http:
paths:
- path: /web(/|$)(.*)
pathType: Prefix
backend:
service:
name: frontend
port:
number: 80
4.2.3 流量切分
实现A/B测试或灰度发布:
yaml复制metadata:
annotations:
nginx.ingress.kubernetes.io/canary: "true"
nginx.ingress.kubernetes.io/canary-weight: "20"
spec:
rules:
- http:
paths:
- backend:
service:
name: frontend-v2
port:
number: 80
5. 性能优化与问题排查
5.1 性能调优参数
在大型生产环境中,可能需要调整以下参数:
yaml复制metadata:
annotations:
nginx.ingress.kubernetes.io/proxy-connect-timeout: "30"
nginx.ingress.kubernetes.io/proxy-read-timeout: "1800"
nginx.ingress.kubernetes.io/proxy-body-size: "20m"
nginx.ingress.kubernetes.io/upstream-keepalive-connections: "100"
5.2 常见问题排查
5.2.1 502 Bad Gateway
可能原因:
- 后端服务未就绪
- 服务端口配置错误
- Pod没有通过健康检查
检查步骤:
- 确认Endpoint是否正确:
bash复制
kubectl get endpoints <service-name> - 检查Pod日志:
bash复制
kubectl logs <pod-name> - 检查Ingress控制器日志:
bash复制
kubectl logs -n ingress-nginx <ingress-controller-pod>
5.2.2 404 Not Found
可能原因:
- 路径配置错误
- 主机头不匹配
- 后端服务返回404
检查步骤:
- 确认Ingress规则:
bash复制
kubectl describe ingress <ingress-name> - 检查请求头是否匹配:
bash复制curl -v -H "Host: myapp.example.com" http://<ingress-ip>/path
6. 生产环境最佳实践
6.1 高可用部署
确保Ingress控制器的高可用性:
- 部署多个副本(至少2个)
- 分散到不同节点(使用PodAntiAffinity)
- 配置HPA自动扩缩容
示例Deployment配置:
yaml复制spec:
replicas: 3
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
template:
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app.kubernetes.io/name
operator: In
values: [ingress-nginx]
topologyKey: kubernetes.io/hostname
6.2 监控与日志
配置全面的监控:
- Prometheus指标采集:
yaml复制metadata: annotations: prometheus.io/scrape: "true" prometheus.io/port: "10254" - 日志收集:
- 配置JSON格式日志
- 使用Fluentd或Filebeat收集
- 发送到ELK或Loki
6.3 安全加固
生产环境必须考虑的安全措施:
- 限制客户端IP范围
- 启用WAF(如ModSecurity)
- 配置速率限制
- 禁用不必要的HTTP方法
示例安全配置:
yaml复制metadata:
annotations:
nginx.ingress.kubernetes.io/whitelist-source-range: "192.168.0.0/24"
nginx.ingress.kubernetes.io/enable-modsecurity: "true"
nginx.ingress.kubernetes.io/limit-rps: "100"
nginx.ingress.kubernetes.io/deny-methods: "PUT,DELETE"
7. 进阶话题:多集群Ingress管理
对于跨多个Kubernetes集群的流量管理,可以考虑以下方案:
7.1 全局负载均衡
使用云服务商的全局负载均衡器(如AWS Global Accelerator、Google Cloud Global LB)将流量分发到不同区域的集群Ingress控制器。
7.2 服务网格集成
将Ingress与服务网格(如Istio)结合使用:
- Ingress作为入口网关
- 服务网格处理集群内部的高级流量管理
- 统一的可观测性
7.3 自定义控制器开发
对于特殊需求,可以基于以下项目开发自定义Ingress控制器:
- ingress-nginx的代码库
- Envoy的Go控制平面
- Kubernetes的sigs.k8s.io/gateway-api
我在实际生产环境中发现,Ingress控制器的选择对系统稳定性和性能影响很大。Nginx Ingress虽然功能全面,但在极端高并发场景下可能需要额外调优。而基于Envoy的控制器(如Contour)通常能提供更好的长连接支持。关键是根据业务特点选择合适的解决方案,而不是盲目追求功能全面。
