news 2026/6/5 1:27:18

深入 Kubernetes Service 底层:解析 IPVS 流量转发与零中断平滑升级

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
深入 Kubernetes Service 底层:解析 IPVS 流量转发与零中断平滑升级

深入 Kubernetes Service 底层:解析 IPVS 流量转发与零中断平滑升级

前言

"老王,我们下周要升级K8s集群,线上服务会不会断啊?"实习生小周端着咖啡杯凑过来,眼神里满是焦虑。

我放下手里的键盘,指着屏幕上的监控面板:"放心,只要把IPVS模式和就绪探针配置好,流量可以做到零中断切换。"

"IPVS?那不是kube-proxy的一种模式吗?跟service有啥关系?"

"这就是今天要聊的——Kubernetes Service在IPVS模式下是如何实现流量转发的,以及如何利用这些机制保障集群升级时服务不中断。"


一、底层原理:IPVS模式下kube-proxy的流量分发机制

1.1 IPVS架构概览

IPVS(IP Virtual Server)是Linux内核提供的四层负载均衡技术,kube-proxy在IPVS模式下会在每个节点上维护虚拟服务(Virtual Server)和真实服务器(Real Server)的映射关系。

flowchart TD A[客户端请求] --> B[Node节点] B --> C[kube-proxy IPVS规则] C --> D{负载均衡算法} D -->|rr| E1[Pod 1] D -->|wrr| E2[Pod 2] D -->|lc| E3[Pod 3] D -->|dh| E4[Pod 4]

1.2 IPVS工作模式对比

模式转发方式优点缺点
NAT地址转换后端无需公网IP单节点瓶颈
TUNIP隧道高吞吐量需要隧道支持
DR直接路由性能最优需要同一广播域

1.3 kube-proxy IPVS模式工作流程

sequenceDiagram participant Client as 客户端 participant Node as Node节点 participant KubeProxy as kube-proxy participant IPVS as IPVS内核模块 participant Pod as 后端Pod Client->>Node: 请求 Service VIP:Port Node->>KubeProxy: 检查IPVS规则 KubeProxy->>IPVS: 查询虚拟服务 IPVS->>IPVS: 执行负载均衡算法 IPVS->>Pod: 转发流量(DR模式) Pod-->>Client: 直接响应

二、快速上手:IPVS模式配置与验证

2.1 开启IPVS模式

# 检查内核模块 lsmod | grep -e ip_vs -e nf_conntrack # 如果未加载,手动加载 modprobe ip_vs modprobe ip_vs_rr modprobe ip_vs_wrr modprobe ip_vs_sh modprobe nf_conntrack # 修改kube-proxy配置 kubectl edit configmap kube-proxy -n kube-system

2.2 kube-proxy配置示例

apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: "ipvs" ipvs: scheduler: "rr" excludeCIDRs: [] minSyncPeriod: 0s maxSyncPeriod: 30s syncPeriod: 30s

2.3 使用ipvsadm查看规则

# 安装ipvsadm apt-get install ipvsadm -y # 查看IPVS虚拟服务 ipvsadm -Ln # 查看具体后端节点 ipvsadm -Ln -t 10.96.0.1:80

三、核心API与深水区:会话保持与连接迁移

3.1 IPVS会话保持机制

apiVersion: v1 kind: Service metadata: name: my-service spec: sessionAffinity: ClientIP sessionAffinityConfig: clientIP: timeoutSeconds: 10800 # 3小时会话保持 selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 9376

3.2 ExternalTrafficPolicy配置

apiVersion: v1 kind: Service metadata: name: my-service spec: externalTrafficPolicy: Local selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 9376

3.3 EndpointSlice的作用

apiVersion: discovery.k8s.io/v1 kind: EndpointSlice metadata: name: my-service labels: kubernetes.io/service-name: my-service addressType: IPv4 ports: - name: http protocol: TCP port: 80 endpoints: - addresses: - "10.1.0.1" conditions: ready: true hostname: pod-1 - addresses: - "10.1.0.2" conditions: ready: false hostname: pod-2

四、实战演练:集群升级流量零中断方案

4.1 升级前准备

# 检查当前集群状态 kubectl get nodes # 标记节点为不可调度 kubectl cordon node-1 # 驱逐节点上的Pod kubectl drain node-1 --ignore-daemonsets --delete-local-data

4.2 升级过程中的流量切换

flowchart LR subgraph 升级前 A[流量] -->|IPVS| B[Pod旧版本] end subgraph 升级中 C[Pod新版本就绪] D[Endpoint更新] E[IPVS规则更新] end subgraph 升级后 F[流量] -->|IPVS| G[Pod新版本] end B -->|就绪探针失败| D C -->|就绪探针成功| D D --> E E --> G

4.3 就绪探针配置示例

apiVersion: v1 kind: Pod metadata: name: my-app spec: containers: - name: my-app image: my-app:v2 ports: - containerPort: 8080 readinessProbe: httpGet: path: /healthz port: 8080 initialDelaySeconds: 10 periodSeconds: 5 timeoutSeconds: 3 successThreshold: 2 failureThreshold: 3

4.4 验证升级结果

# 检查Endpoint状态 kubectl get endpoints my-service # 检查IPVS规则变化 watch ipvsadm -Ln # 验证服务可用性 curl http://<service-ip>/healthz

五、避坑指南

5.1 常见问题与解决方案

问题原因解决方案
流量中断Endpoint更新延迟调整endpointSliceSyncPeriod参数
会话丢失未配置会话保持设置sessionAffinity: ClientIP
节点压力所有流量经过同一节点使用externalTrafficPolicy: Local
探针误判探针配置不合理调整initialDelaySecondssuccessThreshold

5.2 关键配置参数

# kube-controller-manager配置 apiVersion: v1 kind: ConfigMap metadata: name: kube-controller-manager data: config.yaml: | endpointSliceSyncPeriod: 5s nodeMonitorPeriod: 5s podEvictionTimeout: 5m0s

六、总结

通过深入理解IPVS模式下kube-proxy的流量转发原理,我们可以利用以下策略实现集群升级时的服务流量零中断:

  1. IPVS负载均衡:利用内核级转发提高性能
  2. 就绪探针:确保Pod真正就绪后才接收流量
  3. ExternalTrafficPolicy: Local:减少跨节点流量
  4. 会话保持:保证长连接业务的连续性
  5. EndpointSlice:实现更细粒度的端点管理

技术的本质是解决问题,而理解底层原理能让我们更从容地面对复杂场景。就像我家的Ping,只要掌握了它的习性,就能在它跳上键盘时优雅地把它抱走,既不影响工作,又能保持和谐。


作者简介:云原生技术博主,网名"云原生技术博主",云原生后端工程师,专注K8s、Go、云原生AI领域。热爱技术分享,希望用通俗易懂的方式讲解复杂的技术原理。

关注我:持续分享云原生领域的深度技术文章和实战经验。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/5 1:22:06

开题报告没思路,六十秒生成带文献的大纲

起步即卡壳&#xff1a;当文献检索与大纲构建成为拦路虎 对于许多继续教育的学生或是刚刚踏入科研领域的新手来说&#xff0c;论文写作的第一道关卡往往不是“写不出”&#xff0c;而是“不知从何写起”。在传统的学术写作流程中&#xff0c;选题确定后的第一步通常是构建大纲和…

作者头像 李华
网站建设 2026/6/5 1:19:58

MusicFree插件深度解析:从技术原理到实战应用完全掌握

MusicFree插件深度解析&#xff1a;从技术原理到实战应用完全掌握 【免费下载链接】MusicFreePlugins MusicFree播放插件 项目地址: https://gitcode.com/gh_mirrors/mu/MusicFreePlugins MusicFree插件系统是一个开源的音乐播放器插件框架&#xff0c;它通过插件化的设…

作者头像 李华
网站建设 2026/6/5 1:19:18

用Excel的规划求解搞定线性规划:一个生产排程的真实案例(附模板)

用Excel规划求解实现生产排程优化&#xff1a;从理论到实战的完整指南当工厂面临多产品生产排程、广告预算分配或物流路径优化时&#xff0c;Excel的规划求解工具能将这些复杂问题转化为可计算的数学模型。不同于晦涩的运筹学教材&#xff0c;本文将带您跳过数学推导&#xff0…

作者头像 李华
网站建设 2026/6/5 1:17:04

直接用 CTP 做期货自动交易太乱:天勤式状态管理思路

前言 自己对接 CTP 时&#xff0c;OnRtnOrder、OnRtnTrade、OnRspQryInvestorPosition 交错到达&#xff0c;稍不注意就会出现重复开仓、撤单状态对不上、重启后仓位失忆。很多同事并不是不懂 CTP&#xff0c;而是 缺少一个统一的业务截面&#xff0c;被迫在回调里维护多套布尔…

作者头像 李华
网站建设 2026/6/5 1:15:08

笔记里的图片越来越乱,我现在这样处理

我以前一直觉得 Obsidian 的图片问题不算大。 因为在 Obsidian 里看&#xff0c;一切都很正常。 截图粘进去&#xff0c;图片能显示&#xff1b;文章写完&#xff0c;预览也没问题。直到我开始把同一篇笔记发到公众号、知乎、掘金、个人博客&#xff0c;才发现图片才是最容易乱…

作者头像 李华