在K8S中,Service分发后端的策略是什么?
在 Kubernetes 中,Service 向后端 Pod 分发流量的核心策略是 负载均衡(Load Balancing),但其具体机制和可配置策略因实现方式不同而有所差异。以下是关键策略和细节:
一、核心分发策略
Service 默认使用 基于客户端 IP 或会话的简单轮询(Round Robin),但实际行为取决于底层代理模式(iptables 或 IPVS):
-
默认策略:轮询(Round Robin)
- 行为:将新连接/请求依次分发给后端所有健康的 Pod。
- 示例:若后端有 3 个 Pod(P1, P2, P3),流量分发顺序为:
P1 → P2 → P3 → P1 → ...
- 适用场景:无状态应用(如 HTTP API 服务)。
-
会话保持(Session Affinity / Sticky Sessions)
- 原理:基于客户端 IP 或 Cookie 将同一客户端的请求固定到同一 Pod。
- 配置方式:
apiVersion: v1 kind: Service spec: sessionAffinity: ClientIP # 可选 None(默认)或 ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 3600 # 会话保持超时时间(默认 10800 秒)
- 行为:
- 同一客户端 IP 的请求始终转发到同一 Pod。
- 超时后或 Pod 重启时重新分配。
- 适用场景:需要状态保持的应用(如用户登录会话、购物车)。
二、底层实现影响分发细节
Service 的负载均衡能力由 kube-proxy
组件提供,支持三种代理模式,不同模式的分发策略有差异:
代理模式 | 负载均衡策略 | 会话保持支持 | 性能 |
---|---|---|---|
iptables | 随机选择(Random) | ✅ 基于 ClientIP |
中等(规则链长) |
IPVS | 支持多种算法: • rr (轮询)• lc (最少连接)• sh (源地址哈希)• 等 |
✅ 基于算法(如 sh ) |
高 |
userspace | 轮询(Round Robin) | ✅ 基于 ClientIP |
低(已淘汰) |
📌 关键说明:
- iptables 模式:实际使用
statistic
模块的随机概率分发,非严格轮询。- IPVS 模式:需通过
kube-proxy
启动参数配置算法:kube-proxy --proxy-mode=ipvs --ipvs-scheduler=rr # 使用轮询算法
三、高级分发策略需求
若需要更精细的控制(如基于内容的路由、金丝雀发布),需使用 Ingress 或 Service Mesh:
-
Ingress 控制器(如 Nginx, Traefik)
- 支持基于路径、Header、Cookie 的流量分发。
- 示例:将
/api
路由到后端 Service A,/web
路由到 Service B。
-
Service Mesh(如 Istio, Linkerd)
- 支持权重分流、故障注入、重试策略等。
- 示例:将 10% 流量分发给新版本(Canary 发布)。
四、流量分发关键依赖
Service 的分发有效性依赖于以下机制:
机制 | 作用 |
---|---|
EndpointSlice API | 动态跟踪后端 Pod IP 和端口变化(Service 通过 Selector 关联 Pod)。 |
kube-proxy 监听 | 实时更新节点上的 iptables/IPVS 规则,确保流量转发到最新健康的 Pod。 |
Readiness Probe | 标记 Pod 是否就绪,未就绪的 Pod 会被移出负载均衡池。 |
五、配置示例及验证
-
查看后端 Pod 分布
# 查看 Service 关联的 Endpoints kubectl describe svc/my-service
输出示例:Endpoints 列表显示当前接收流量的 Pod IP -
测试流量分发
连续发起请求观察 Pod 响应:for i in {1..10}; do curl http://<SERVICE_IP>; done
总结:Service 分发策略全景
特性 | 支持能力 |
---|---|
基础策略 | 轮询(Round Robin)或随机(Random) |
会话保持 | 基于 ClientIP (所有模式)或 IPVS 的源地址哈希(sh ) |
高级调度 | 需通过 IPVS 模式配置(如 lc /wrr )或使用 Ingress/Service Mesh |
健康检查 | 依赖 Readiness Probe 自动剔除不健康 Pod |
动态更新 | 通过 EndpointSlice 实时更新后端 Pod 列表 |
生产建议:
- 多数场景默认策略即可满足需求。
- 需要会话保持时启用
sessionAffinity: ClientIP
。 - 高性能场景(如 10k+ 连接)启用 IPVS 模式并选择合适的调度算法。
- 复杂路由需求使用 Ingress 或 Service Mesh。