2. Kubernetes 核心网络模型:Service、Endpoint、Pod IP 与 Cluster IP 的关系

在蓝绿发布场景中,流量切换的本质是修改 Service 的标签选择器,使其指向新版本 Pod。要理解这一过程,必须先厘清 Kubernetes 网络模型中的四个核心概念:Pod IP、Cluster IP、Service 与 Endpoint。它们构成了集群内部流量的完整转发链路。

2.1 四层抽象与职责

下表从网络层级、生命周期、访问范围三个维度对比这四个概念:

概念 网络层级 生命周期 访问范围 核心职责
Pod IP L3(网络层) 随 Pod 创建/销毁 集群内可达 容器网络接口(CNI)分配的虚拟 IP,Pod 间直接通信
Cluster IP L4(传输层) 随 Service 创建/销毁 集群内部虚拟 IP Service 的稳定入口,不随 Pod 变化
Service L4 抽象 持久化资源对象 集群内/外(NodePort/LB) 定义访问策略、标签选择器、端口映射
Endpoint L4 映射 自动同步 集群内部 维护 Service 后端 Pod IP:Port 的实时列表
关键认知:Pod IP 是“动态的”,每次 Pod 重启都可能变化;Cluster IP 是“静态的”,Service 不删除就不会变。蓝绿发布正是利用这一特性,让客户端始终访问不变的 Cluster IP,而后端 Pod 通过 Endpoint 动态切换。

2.2 流量转发链路:从 Cluster IP 到 Pod IP

当集群内部客户端(如另一个 Pod)通过 Service 名称或 Cluster IP 发起请求时,Kubernetes 内置的 kube-proxy 组件负责将流量转发到具体的 Pod IP。完整的转发链路如下:

  1. DNS 解析:客户端通过 CoreDNS 将 Service 名称解析为 Cluster IP。
  2. iptables/IPVS 规则匹配:kube-proxy 在宿主机上维护的规则将目标 Cluster IP:Port 匹配到对应的 Endpoint 列表。
  3. 负载均衡选择:从 Endpoint 列表中按策略(随机、轮询等)选中一个 Pod IP:Port。
  4. CNI 网络转发:数据包经过宿主机网络栈、CNI 插件(如 Calico、Flannel)到达目标 Pod 的网卡。
蓝绿发布启示:修改 Service 的 spec.selector 后,Endpoint 控制器会在秒级内更新 Endpoint 对象,kube-proxy 随之更新节点转发规则。这一机制是流量切换的底层保障。

2.3 核心关系:Service ↔ Endpoint ↔ Pod

下图展示了三者的数据流与控制流关系:

Service ↔ Endpoint ↔ Pod 关系图 Service ↔ Endpoint ↔ Pod 关系图 Service Cluster IP: 10.96.0.1 spec.selector app: myapp, version: v2 Endpoint 10.244.1.5:8080, 10.244.2.7:8080 自动同步 Pod v2-1 IP: 10.244.1.5:8080 Pod v2-2 IP: 10.244.2.7:8080 Pod v2-3 IP: 10.244.3.2:8080 说明:Service 通过标签选择器匹配 Pod,Endpoint 控制器自动维护 Pod IP:Port 列表,kube-proxy 据此转发流量。

2.4 蓝绿发布中的流量切换本质

在蓝绿发布流程中,Service 的 spec.selector 是唯一的“切换开关”。以下是一个典型的切换过程:

# 初始状态:Service 指向蓝色版本(v1)
apiVersion: v1
kind: Service
metadata:
  name: myapp-service
spec:
  selector:
    app: myapp
    version: v1        # <-- 指向蓝色
  ports:
  - port: 80
    targetPort: 8080

# 切换后:Service 指向绿色版本(v2)
# 只需修改 selector 中的 version 值
spec:
  selector:
    app: myapp
    version: v2        # <-- 指向绿色
注意:修改 selector 后,Endpoint 控制器会立即移除旧版本 Pod 的 IP,添加新版本 Pod 的 IP。但 kube-proxy 在节点上的规则更新存在秒级延迟(通常 1-5 秒),这期间可能出现“流量毛刺”——部分请求仍被转发到已被删除的旧 Pod。生产环境建议配合 preStop hook 和 readiness probe 实现优雅流量切换。

2.5 关键差异速查表

对比维度 Pod IP Cluster IP Service Endpoint
是否可路由 是(集群内) 是(虚拟) 逻辑对象 逻辑对象
是否持久 否 是 是 自动同步
是否支持负载均衡 否 是(通过 kube-proxy) 定义策略 提供后端列表
蓝绿切换中的作用 被替换的目标 不变的访问入口 切换的执行者 切换的实时反映

2.6 常见误区与避坑

  • 误区一:认为 Cluster IP 可以直接 ping 通。Cluster IP 是 iptables/IPVS 虚拟 IP,仅对 TCP/UDP/SCTP 流量生效,ICMP 协议会被丢弃。
  • 误区二:认为修改 Service selector 后流量立即切换。实际存在 Endpoint 同步延迟 + kube-proxy 规则更新延迟,建议在切换前确认旧 Pod 的 terminationGracePeriodSeconds 设置。
  • 误区三:忽略 externalTrafficPolicy 的影响。当设置为 Local 时,流量只会转发到节点本地的 Pod,可能导致负载不均。
  • 误区四:认为 Endpoint 只能由 Service 自动管理。可以手动创建 Endpoints 对象将 Service 指向外部服务,但蓝绿发布场景中不建议这样做,会破坏自动化。
最佳实践:在蓝绿发布门禁系统中,建议在切换 Service selector 前,先通过 kubectl get endpoints 确认新版本 Pod 的 IP 已全部就绪,再执行切换操作。切换后持续监控 kubectl get endpoints -w 直到旧版本 IP 完全消失。