Skip to content

ClientIP 会话亲和性是 Service 的默认行为吗?

不是。

在 Kubernetes(包括 RKE2 1.33.4)中,Service 的默认会话亲和性策略是 None,而不是 ClientIP。这意味着同一客户端的连续请求会被负载均衡到不同的后端 Pod,Kubernetes 不会自动保证会话粘性。

默认值

yaml
apiVersion: v1
kind: Service
spec:
  sessionAffinity: None   # 默认值

如何开启 ClientIP 会话亲和性

如果需要同一客户端在会话有效期内始终访问同一个后端 Pod,需要显式配置:

yaml
apiVersion: v1
kind: Service
metadata:
  name: my-service
spec:
  selector:
    app: my-app
  ports:
    - port: 80
      targetPort: 8080
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 10800   # 默认 10800 秒(3 小时),可选

配置说明:

字段说明
sessionAffinity会话亲和性策略,None(默认)或 ClientIP
sessionAffinityConfig.clientIP.timeoutSecondsClientIP 亲和性超时时间,默认 10800 秒(3 小时)

RKE2 1.33.4 的行为

RKE2 1.33.4 遵循上游 Kubernetes 的 Service 规范,没有对此行为做特殊改动:

  • 默认 sessionAffinity: None
  • 使用 ClientIP 时,kube-proxy 基于源 IP 维护亲和性映射
  • 超时后,该客户端的后续请求可能重新分配到其他后端 Pod

注意事项

  1. 不是默认开启:文档或配置中若提到"基于 ClientIP 的会话亲和性策略",必须明确说明需要显式开启。
  2. NAT 场景的影响:如果多个客户端经过同一个 NAT 出口访问集群,它们的源 IP 相同,会被视为同一个"客户端",从而集中到同一个后端 Pod。
  3. Pod 变化时亲和性失效:后端 Pod 被删除、重建或缩容后,亲和性映射会失效,客户端可能被重新调度到其他 Pod。
  4. 有状态业务建议:对于强有状态需求,建议结合 StatefulSet + Headless Service,或在应用层维护会话状态,而不是仅依赖 Service 层的 ClientIP 亲和性。

参考