3. Service 类型详解:ClusterIP、NodePort、LoadBalancer、ExternalName 的流量路径

在 Kubernetes 中,Service 是连接 Pod 与外部流量的核心抽象。不同的 Service 类型决定了流量从客户端到达后端 Pod 的完整路径。理解这四种类型的流量路径,是设计蓝绿发布门禁流量切换方案的基础。

3.1 四种 Service 类型概览

类型 访问范围 典型场景 是否支持外部流量
ClusterIP 集群内部 微服务间通信、内部 API 否(需额外组件)
NodePort 集群节点 IP + 静态端口 开发测试、小规模对外暴露 是(直接通过节点)
LoadBalancer 外部负载均衡器 VIP 生产环境对外服务 是(云厂商 LB)
ExternalName DNS CNAME 映射 集群内访问外部服务 否(仅 DNS 重定向)

3.2 ClusterIP:集群内部的虚拟 IP

ClusterIP 是默认的 Service 类型。Kubernetes 会为 Service 分配一个虚拟 IP(VIP),该 IP 仅在集群内部可达。kube-proxy 通过 iptables 或 IPVS 规则将发往 VIP 的流量转发到后端 Pod。

关键路径: 客户端 Pod → ClusterIP:Port → kube-proxy (iptables/IPVS) → 后端 Pod (随机或 SessionAffinity)
ClusterIP 流量路径 客户端 Pod ClusterIP Service VIP: 10.96.0.1:80 kube-proxy iptables/IPVS Pod A (v1) Pod B (v1) Pod C (v1) 💡 ClusterIP 是蓝绿发布中“内部流量切换”的基础。通过更新 Service 的 selector,可以 将 ClusterIP 流量从旧版本 Pod 瞬间切换到新版本 Pod。

3.3 NodePort:通过节点端口暴露服务

NodePort 在 ClusterIP 的基础上,在每个集群节点的指定端口(默认 30000-32767)上监听流量。外部请求到达任意节点的 NodePort 后,kube-proxy 会将流量转发到对应 Service 的 ClusterIP,再分发到后端 Pod。

流量路径: 外部客户端 → NodeIP:NodePort → 节点 iptables → ClusterIP → kube-proxy → 后端 Pod
NodePort 流量路径 外部客户端 Node 1 (192.168.1.10) NodePort: 30080 iptables 规则 → ClusterIP: 10.96.0.1:80 Pod (v1) ⚠️ NodePort 的局限:客户端需要知道集群节点 IP,且节点故障会导致服务不可用。 在蓝绿发布中,NodePort 通常用于调试或小规模灰度验证。 跨节点转发:如果 Pod 不在当前节点,kube-proxy 会将流量转发到 目标节点上的 Pod,这会产生额外的网络跳数(跨节点延迟)。

3.4 LoadBalancer:云原生负载均衡器

LoadBalancer 是 NodePort 的扩展。当 Service 类型设置为 LoadBalancer 时,云厂商(AWS、GCP、Azure 等)会自动创建一个外部负载均衡器,将公网流量分发到集群节点的 NodePort 上。这是生产环境对外暴露服务的标准方式。

完整路径: 互联网用户 → 云 LB (VIP) → 任意节点 NodePort → ClusterIP → kube-proxy → 后端 Pod
组件 职责 蓝绿发布中的角色
云负载均衡器 接收外部流量,分发到节点 流量入口,通常绑定固定 VIP
NodePort 节点上监听端口 LB 的后端目标
ClusterIP 集群内部虚拟 IP 通过 selector 切换流量
kube-proxy 转发规则维护 确保流量到达正确 Pod

3.5 ExternalName:DNS 级别的服务映射

ExternalName 是唯一不经过 kube-proxy 的 Service 类型。它直接在 DNS 层面返回一个 CNAME 记录,将集群内的服务名解析到外部域名。没有 ClusterIP,也没有端口转发。

注意: ExternalName 不提供任何负载均衡或健康检查功能。它仅用于让集群内的 Pod 通过服务名访问外部服务(如数据库、第三方 API)。
ExternalName 流量路径 客户端 Pod CoreDNS CNAME 解析 外部服务 api.example.com 📌 ExternalName 示例 YAML: apiVersion: v1 kind: Service metadata: { name: my-external-db } spec: { type: ExternalName, externalName: db.example.com }

3.6 蓝绿发布中的 Service 选择策略

在蓝绿发布门禁的流量切换场景中,不同 Service 类型有不同的适用策略:

  • ClusterIP:最适合内部蓝绿切换。通过更新 selector 指向新版本 Pod,实现零中断切换。
  • NodePort:适合小规模灰度验证。可以创建两个 NodePort Service 分别指向蓝绿版本,通过客户端选择端口访问。
  • LoadBalancer:生产环境标准方案。结合 Ingress 或 Service Mesh,可以实现更精细的流量比例切换。
  • ExternalName:不参与蓝绿发布,仅用于外部服务映射。
最佳实践: 在蓝绿发布门禁中,推荐使用 ClusterIP + LoadBalancer 的组合。ClusterIP 负责内部流量切换,LoadBalancer 作为外部统一入口。门禁系统通过控制 ClusterIP 的 selector 来实现秒级流量切换。