深入 Kubernetes Service 底层解析 IPVS 流量转发与零中断平滑升级前言老王我们下周要升级K8s集群线上服务会不会断啊实习生小周端着咖啡杯凑过来眼神里满是焦虑。我放下手里的键盘指着屏幕上的监控面板放心只要把IPVS模式和就绪探针配置好流量可以做到零中断切换。IPVS那不是kube-proxy的一种模式吗跟service有啥关系这就是今天要聊的——Kubernetes Service在IPVS模式下是如何实现流量转发的以及如何利用这些机制保障集群升级时服务不中断。一、底层原理IPVS模式下kube-proxy的流量分发机制1.1 IPVS架构概览IPVSIP 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-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和successThreshold5.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领域。热爱技术分享希望用通俗易懂的方式讲解复杂的技术原理。关注我持续分享云原生领域的深度技术文章和实战经验。
深入 Kubernetes Service 底层:解析 IPVS 流量转发与零中断平滑升级
深入 Kubernetes Service 底层解析 IPVS 流量转发与零中断平滑升级前言老王我们下周要升级K8s集群线上服务会不会断啊实习生小周端着咖啡杯凑过来眼神里满是焦虑。我放下手里的键盘指着屏幕上的监控面板放心只要把IPVS模式和就绪探针配置好流量可以做到零中断切换。IPVS那不是kube-proxy的一种模式吗跟service有啥关系这就是今天要聊的——Kubernetes Service在IPVS模式下是如何实现流量转发的以及如何利用这些机制保障集群升级时服务不中断。一、底层原理IPVS模式下kube-proxy的流量分发机制1.1 IPVS架构概览IPVSIP 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-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和successThreshold5.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领域。热爱技术分享希望用通俗易懂的方式讲解复杂的技术原理。关注我持续分享云原生领域的深度技术文章和实战经验。