主题
第12章 流量策略、会话保持与拓扑感知
本章讲解 Service 的高级话题:会话保持、外部/内部流量策略、拓扑感知路由。这些能力直接影响生产环境的行为和性能。
12.1 会话保持(Session Affinity)
默认情况下,Service 的流量是随机分发的。如果希望同一客户端的流量始终转发到同一个后端 Pod,可以开启会话保持。
yaml
spec:
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10800 # 默认 3 小时工作原理
基于 iptables/ipvs 的 recent 模块,记录客户端 IP 与后端 Pod 的对应关系。
注意事项
- 对 NAT 后的多客户端可能集中到同一 IP。
- 不是应用层会话保持,只是四层的源 IP 保持。
- 后端 Pod 变化后,新连接会重新分配。
12.2 外部流量策略(externalTrafficPolicy)
Cluster 模式(默认)
yaml
spec:
externalTrafficPolicy: Cluster| 项目 | 行为 |
|---|---|
| 流量路径 | 可能跨节点转发 |
| 源 IP | 被 SNAT 成节点 IP,Pod 看不到真实客户端 IP |
| 负载均衡 | 节点 + Pod 两层均衡,整体较均衡 |
| 空节点风险 | 无,任意节点都能转发到集群内任意 Pod |
| 性能 | 可能有额外一跳,延迟略高 |
Local 模式
yaml
spec:
externalTrafficPolicy: Local| 项目 | 行为 |
|---|---|
| 流量路径 | 只转发到本节点 Pod |
| 源 IP | 保留真实客户端 IP |
| 负载均衡 | 依赖 VIP 和 Pod 分布,可能不均衡 |
| 空节点风险 | 有,本节点无 Pod 时连接被丢弃 |
| 性能 | 通常更优,无额外一跳 |
选择建议
| 场景 | 推荐策略 |
|---|---|
| 需要保留真实客户端 IP | Local |
| 后端 Pod 分布均匀,且 LB 有健康检查 | Local |
| 追求简单、高可用、Pod 分布不均 | Cluster |
| 对延迟敏感,但可接受源 IP 丢失 | Cluster |
12.3 内部流量策略(internalTrafficPolicy)
控制集群内部流量的转发范围:
| 策略 | 行为 |
|---|---|
Cluster(默认) | 内部流量可转发到任意节点的 Pod |
Local | 只转发到与客户端同一节点的 Pod |
yaml
spec:
internalTrafficPolicy: Local适用场景
- 希望减少跨节点流量,降低延迟和带宽。
- 数据本地化要求高的应用(如大数据、缓存)。
风险
- 可能降低负载均衡效果。
- 如果本节点没有后端 Pod,需要回退到 Cluster(Kubernetes 1.25+ 支持自动回退)。
12.4 拓扑感知路由
EndpointSlice 可携带 zone 或 nodeName 等拓扑信息,配合 Service 注解,使流量优先在同一可用区或同一节点内路由。
yaml
metadata:
annotations:
service.kubernetes.io/topology-mode: Auto优点
- 降低跨可用区延迟。
- 减少跨区带宽费用。
- 提高容错能力(单可用区故障时自动切换)。
12.5 健康检查与就绪
只有 Readiness Probe 通过且未处于 Terminating 状态的 Pod 才会被加入 Endpoints/EndpointSlice。因此,务必为生产服务配置 readinessProbe。
12.6 本章小结
sessionAffinity: ClientIP实现基于源 IP 的会话保持。externalTrafficPolicy=Local保留源 IP,但可能导致空节点丢包。internalTrafficPolicy=Local减少跨节点流量。- 拓扑感知路由优先在同一可用区/节点转发。
- readinessProbe 决定 Pod 是否能接收流量。
本章练习
- 为一个 Service 开启
sessionAffinity: ClientIP,用多个请求验证是否命中同一 Pod。 - 分别测试
externalTrafficPolicy=Cluster和Local,比较 Pod 内看到的源 IP。 - 思考:你的业务是否需要保留真实源 IP?如果需要,如何配置?