前端进阶之旅前端进阶之旅
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
  • 基础篇HTML/CSS/JS 打底
  • 进阶篇原理与工程化
  • 高频篇面试最常问的那批
  • 精选篇按模块收敛的总结
  • 手写篇常考代码手写实现
  • 面经篇真实面试问题复盘
  • AI 篇NEWAI 时代的前端考点
  • 历年面经NEW按年份追踪真实考点
  • 每日一题每天一道,攒手感
  • 专项自测100 题快速查漏
  • 小程序题库小程序专项刷题
  • 算法题库NEW在线编码即时判题
  • 知识卡片NEW碎片时间过考点
  • 面试题大全常见问题解析
  • AI 答疑NEW随时提问,即时解析
  • AI 模拟面试NEW模拟真实面试 + 报告
  • AI 定制路线NEW按你的简历现排
  • AI 知识地图NEW串起全站知识点
  • 原理篇React / Vue 源码拆解
  • HTTP从报文一路讲到 HTTPS
  • 浏览器渲染、事件循环、进程
  • 计算机基础Linux、网络、操作系统
  • 设计模式23 种模式怎么用
  • Node学习指南从环境搭建到服务端
  • NPM工作流script、依赖与发布
  • Docker容器化部署上手
  • Canvas图形与动画实战
  • 前端系统进阶学习大型项目工程化
  • 前端综合文章长期沉淀的实践文
  • 思维导图知识点全景图
  • 学习路线按图索骥不跑偏
  • AI 热点NEWAI 每日动态
  • 公众号动态公众号历史文章
  • 博客动态站长的技术博客
  • 开发者导航常用工具与文档站
首页程序员面试题库Kubernetes Service sessionAffinity 会话保持
KuKubernetes网络与运维

Kubernetes Service 的 sessionAffinity 如何实现会话保持,有什么局限?

Kubernetes Service 的 sessionAffinity 基于源 IP 在传输层做哈希分流,由 kube-proxy 实现,无法感知应用层会话,超时可配,后端变动会失效。

前端进阶之旅 · 一题精讲更新于 2026.09.05
Kubernetes#网络与运维
先看核心答案
理解线索

会话粘滞与负载均衡的取舍

  1. 实现位置kube-proxy 为 Service 维护源 IP 到后端的映射
  2. 判定键仅用源 IPv4/6 地址,不含端口或 Cookie
  3. 超时窗口默认为 10800 秒,可在 spec 中调整

只适合无状态服务需要短时绑定后端的场景,不能替代应用层会话复制或一致性路由。

核心回答

先记住这个答案

设置 sessionAffinity: ClientIP 后,kube-proxy 会为来自同一源 IP 的新连接分到同一个后端 Pod,并在 timeoutSeconds(默认10800秒)内保持。它只识别 IP,不解析 HTTP,因此带 Cookie 的应用会话仍需自身处理;多个客户端共用出口 IP 会导致流量倾斜。该功能对 ClusterIP、NodePort 有效,对 headless 不适用。

  • kube-proxy 层实现,基于源 IP 哈希粘滞
  • 不解析 HTTP,Cookie 需应用自己处理
  • 后端变动或 NAT 共源 IP 会造成会话偏移

kube-proxy 如何在数据面完成客户端粘滞

当 Service 定义中设置 sessionAffinity: ClientIP 时,kube-proxy 会启动虚拟 IP 转发逻辑,为每个源 IP 计算一个后端索引。iptables 模式利用内核连接跟踪和自定义链路记录选择结果;IPVS 模式则启用基于源 IP 的持久性调度。规则中会保存源 IP、目标后端和过期时间,同源新连接在超时内直接复用同一选择,实现粘滞效果。

默认超时 timeoutSeconds 为 10800 秒,可通过 sessionAffinityConfig.clientIP.timeoutSeconds 调整,最小值为 1。

购物车服务在 NAT 后端的错误假设

假设某微服务商城使用三个 Pod 副本,Service 以 NodePort 暴露并设置 sessionAffinity: ClientIP,期望每个用户的购物车数据固定在同一个 Pod 上。压测从一台跳板机发起,该跳板机源 IP 固定,模拟 500 个在线用户,预期所有请求都会打到一个 Pod,其余两个几乎零负载,热点 Pod 可能会因 CPU 超限频繁重启,导致服务整体抖动。

根因是所有客户端经过跳板机出口 NAT,源 IP 被收敛为同一值,kube-proxy 按 IP 哈希自然全部映射到同一后端,毫无负载均衡可言。此场景下应在前端接入支持 Cookie 粘滞的 Ingress 或外部负载均衡器,将路由粒度提升到 HTTP 会话级别,并让后端使用独立的会话存储(如 Redis),才能既保留用户状态又避免单点热点。

适用边界与失效条件

sessionAffinity 只对虚拟 IP 服务生效,包括 ClusterIP 和 NodePort;Headless Service 没有 cluster IP,DNS 直接返回所有端点,因此该字段无意义。对于 NodePort 或 LoadBalancer 类型的 Service,若设置 externalTrafficPolicy: Cluster,节点转发时会做 SNAT,后端看到的源 IP 变为节点 IP,同样会导致粘滞错乱;此时应搭配 externalTrafficPolicy: Local 以保留真实源 IP。

当 Pod 集合变化(滚动发布、崩溃重启、扩缩容),哈希映射会重新计算,已建立的 TCP 连接仍依靠 conntrack 保持,但新连接可能被分到新 Pod,导致应用层会话中断。此外,客户端重启或更换网络导致源 IP 变化也会丢失粘滞。因此生产中通常不单独依赖此特性,而是结合应用层复制和外部一致性哈希实现高可用有状态服务。

回答前,多想一步

容易答错的地方

设置后会话永不迁移
纠正:sessionAffinity 的映射会在后端列表变化时重新计算。例如 Deployment 滚动更新导致 Pod IP 变化,新增或删除副本后,新连接可能分布到不同 Pod;超时默认 3 小时,到期也会触发重选。
能维持登录态的 Cookie 会话
纠正:它只按源 IP 四层识别,完全不解析 HTTP,不读取 Cookie、Session ID。应用自身或七层代理(如 Ingress)才具备 cookie 保持能力,Kubernetes Service 层面无法做到。
试着用自己的话回答

面试官还会怎么问?

ClientIP 与 Cookie 粘滞的可靠性差距在哪?

ClientIP 依赖网络层,存在 NAT 时海量用户共享 IP,粘滞粒度粗且易倾斜;Cookie 由服务端生成,隔离到会话,但需要代理层次支持。例如 Ingress 的 affinity 基于 Cookie,Service 的 affinity 基于 IP,二者不能混同。

timeoutSeconds 设多大合适?

默认 10800 秒适合一般 Web 场景,但若后端经常扩缩容,时间过长会放大失效可能性。建议参考应用会话生命周期,通常 300-3600 秒,并配合 readiness 探针避免把流量发给正在终止的 Pod。

如何验证 sessionAffinity 是否真正按 IP 粘滞?

在 Pod 里记录访问的来源 IP 和请求路径,从外部使用固定 IP 连续请求 Service 的 NodePort 或 LoadBalancer 地址(避免走后端 Pod 直接访问 ClusterIP),观察日志是否落在同一 Pod。注意集群网络可能做 SNAT,需确保使用 externalTrafficPolicy: Local 保留源 IP,或查看 kube-proxy 的 conntrack 表确认 NAT 情况。

从一道题,走向一组知识

把知识连起来

网络与运维

Kubernetes Service 的 ClusterIP、NodePort 和 LoadBalancer 在流量入口上有什么本质区别?

同属「网络与运维」专题,接着看 Kubernetes Service 类型区别 在具体场景中的处理方式。

网络与运维

Kubernetes Service 的 externalTrafficPolicy: Local 与 Cluster 对源 IP 和负载均衡有什么影响?

同属「网络与运维」专题,接着看 Kubernetes externalTrafficPolicy Local 源IP保留 在具体场景中的处理方式。

参考资料

  • Service

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. kube-proxy 如何在数据面完成客户端粘滞
  3. 购物车服务在 NAT 后端的错误假设
  4. 适用边界与失效条件
  5. 容易答错的地方
  6. 面试官还会怎么问
  7. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑