深入 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 | 单节点瓶颈 |
| TUN | IP隧道 | 高吞吐量 | 需要隧道支持 |
| 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-system2.2 kube-proxy配置示例
apiVersion: kubeproxy.config.k8s.io/v1alpha1 kind: KubeProxyConfiguration mode: "ipvs" ipvs: scheduler: "rr" excludeCIDRs: [] minSyncPeriod: 0s maxSyncPeriod: 30s syncPeriod: 30s2.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: 93763.2 ExternalTrafficPolicy配置
apiVersion: v1 kind: Service metadata: name: my-service spec: externalTrafficPolicy: Local selector: app: MyApp ports: - protocol: TCP port: 80 targetPort: 93763.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-data4.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 --> G4.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: 34.4 验证升级结果
# 检查Endpoint状态 kubectl get endpoints my-service # 检查IPVS规则变化 watch ipvsadm -Ln # 验证服务可用性 curl http://<service-ip>/healthz五、避坑指南
5.1 常见问题与解决方案
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 流量中断 | Endpoint更新延迟 | 调整endpointSliceSyncPeriod参数 |
| 会话丢失 | 未配置会话保持 | 设置sessionAffinity: ClientIP |
| 节点压力 | 所有流量经过同一节点 | 使用externalTrafficPolicy: Local |
| 探针误判 | 探针配置不合理 | 调整initialDelaySeconds和successThreshold |
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的流量转发原理,我们可以利用以下策略实现集群升级时的服务流量零中断:
- IPVS负载均衡:利用内核级转发提高性能
- 就绪探针:确保Pod真正就绪后才接收流量
- ExternalTrafficPolicy: Local:减少跨节点流量
- 会话保持:保证长连接业务的连续性
- EndpointSlice:实现更细粒度的端点管理
技术的本质是解决问题,而理解底层原理能让我们更从容地面对复杂场景。就像我家的Ping,只要掌握了它的习性,就能在它跳上键盘时优雅地把它抱走,既不影响工作,又能保持和谐。
作者简介:云原生技术博主,网名"云原生技术博主",云原生后端工程师,专注K8s、Go、云原生AI领域。热爱技术分享,希望用通俗易懂的方式讲解复杂的技术原理。
关注我:持续分享云原生领域的深度技术文章和实战经验。