Skip to content

第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 时连接被丢弃
性能通常更优,无额外一跳

选择建议

场景推荐策略
需要保留真实客户端 IPLocal
后端 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 可携带 zonenodeName 等拓扑信息,配合 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 是否能接收流量。

本章练习

  1. 为一个 Service 开启 sessionAffinity: ClientIP,用多个请求验证是否命中同一 Pod。
  2. 分别测试 externalTrafficPolicy=ClusterLocal,比较 Pod 内看到的源 IP。
  3. 思考:你的业务是否需要保留真实源 IP?如果需要,如何配置?