当前位置: 首页 > news >正文

深入 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领域。热爱技术分享,希望用通俗易懂的方式讲解复杂的技术原理。

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

http://www.zskr.cn/news/1463709.html

相关文章:

  • 底部工具栏
  • 深圳办公 ai 培训机构哪家性价比高:独家 TOP5 深度解 - 13724980961
  • Hello Agent 学习第一天
  • 大优势揭秘,香港业主全屋定制为什么都选深圳RERA源木匠心 - 产品测评官
  • 利用人工智能破解中世纪密码
  • 如何突破百度网盘下载限制:终极解析工具完全指南
  • 2026 年深圳全屋定制衣柜橱柜酒柜 10 万以内怎么选不踩坑 - 产品测评官
  • Python中类方法、静态方法、实例方法是否能访问类属性和实例属性
  • 加油卡小程序开发玩法深度解析:功能架构、营销体系与落地方案
  • STC89C52电子时钟DIY避坑指南:从洞洞板飞线到Keil编程的完整心路历程
  • 云原生流量均衡调优:就绪探针优化与 IPVS 容器节点负载均匀分配机制
  • 高防CDN专注网站防御加速服务
  • 调试PHY芯片时,为什么插拔网线才能恢复网速?聊聊AR8035的硬复位与软复位
  • Windows Defender Remover终极指南:彻底解决“Device Guard Blocked“错误的3种方案
  • 方法概述,方法的其他形式,使用常见问题
  • 一文讲透必懂的RAG20个核心概念:从0到 1 学会
  • 从人的双眼到工程双目:双目立体视觉原理、同步方案与 2026 年算法突破
  • 盲盒潮玩一番赏小程序开发玩法分析:算法逻辑、功能架构与合规落地
  • Pandas 内存爆炸?用闭包无侵入监控函数耗时与占用
  • uBlock Origin终极指南:5分钟打造纯净无广告的浏览器体验
  • Spring Boo从“会用”到“精通”:Spring Boot 入门
  • 别再只调API了!用Keras从零复现Facenet人脸识别模型(附完整代码与CASIA-WebFace数据集处理)
  • 期货量化 wait_update 超时怎么办:天勤 TqTimeoutError 分级处理
  • C++ 编码规范
  • 2026年大客户营销咨询选购指南,品牌排名 - mypinpai
  • PPTist:5分钟打造专业演示文稿的终极免费在线PPT制作工具
  • Mac窗口置顶神器Topit:如何让重要窗口永远在最前方
  • 紧急预警:标注数据漂移正 silently 毁掉你的模型效果!——用AI工具构建动态标注质量监控仪表盘(Python+Prometheus实战)
  • 2026年酒泉驾考驾校价格比较:新亿阳驾校性价比高吗? - mypinpai
  • 教育AI整合进入“深水区”:2024Q2行业报告显示,仅17%机构实现L1-L4能力跃迁——你的团队处在哪一级?