主题
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.timeoutSeconds | ClientIP 亲和性超时时间,默认 10800 秒(3 小时) |
RKE2 1.33.4 的行为
RKE2 1.33.4 遵循上游 Kubernetes 的 Service 规范,没有对此行为做特殊改动:
- 默认
sessionAffinity: None - 使用
ClientIP时,kube-proxy 基于源 IP 维护亲和性映射 - 超时后,该客户端的后续请求可能重新分配到其他后端 Pod
注意事项
- 不是默认开启:文档或配置中若提到"基于 ClientIP 的会话亲和性策略",必须明确说明需要显式开启。
- NAT 场景的影响:如果多个客户端经过同一个 NAT 出口访问集群,它们的源 IP 相同,会被视为同一个"客户端",从而集中到同一个后端 Pod。
- Pod 变化时亲和性失效:后端 Pod 被删除、重建或缩容后,亲和性映射会失效,客户端可能被重新调度到其他 Pod。
- 有状态业务建议:对于强有状态需求,建议结合 StatefulSet + Headless Service,或在应用层维护会话状态,而不是仅依赖 Service 层的 ClientIP 亲和性。