在K8S中,Service分发后端的策略是什么?

在 Kubernetes 中,Service 向后端 Pod 分发流量的核心策略是 负载均衡(Load Balancing),但其具体机制和可配置策略因实现方式不同而有所差异。以下是关键策略和细节:


一、核心分发策略

Service 默认使用 基于客户端 IP 或会话的简单轮询(Round Robin),但实际行为取决于底层代理模式(iptables 或 IPVS):

  1. 默认策略:轮询(Round Robin)

    • 行为:将新连接/请求依次分发给后端所有健康的 Pod。
    • 示例:若后端有 3 个 Pod(P1, P2, P3),流量分发顺序为:P1 → P2 → P3 → P1 → ...
    • 适用场景:无状态应用(如 HTTP API 服务)。
  2. 会话保持(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

  1. Ingress 控制器(如 Nginx, Traefik)

    • 支持基于路径、Header、Cookie 的流量分发。
    • 示例:将 /api 路由到后端 Service A,/web 路由到 Service B。
  2. Service Mesh(如 Istio, Linkerd)

    • 支持权重分流、故障注入、重试策略等。
    • 示例:将 10% 流量分发给新版本(Canary 发布)。

四、流量分发关键依赖

Service 的分发有效性依赖于以下机制:

机制 作用
EndpointSlice API 动态跟踪后端 Pod IP 和端口变化(Service 通过 Selector 关联 Pod)。
kube-proxy 监听 实时更新节点上的 iptables/IPVS 规则,确保流量转发到最新健康的 Pod。
Readiness Probe 标记 Pod 是否就绪,未就绪的 Pod 会被移出负载均衡池。

五、配置示例及验证

  1. 查看后端 Pod 分布

    # 查看 Service 关联的 Endpoints
    kubectl describe svc/my-service
    


    输出示例:Endpoints 列表显示当前接收流量的 Pod IP

  2. 测试流量分发
    连续发起请求观察 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 模式并选择合适的调度算法。
  • 复杂路由需求使用 IngressService Mesh
posted @ 2025-08-17 15:49  天道酬勤zjh  阅读(20)  评论(0)    收藏  举报