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)
3.3 NodePort:通过节点端口暴露服务
NodePort 在 ClusterIP 的基础上,在每个集群节点的指定端口(默认 30000-32767)上监听流量。外部请求到达任意节点的 NodePort 后,kube-proxy 会将流量转发到对应 Service 的 ClusterIP,再分发到后端 Pod。
流量路径: 外部客户端 → NodeIP:NodePort → 节点 iptables → ClusterIP → 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)。
3.6 蓝绿发布中的 Service 选择策略
在蓝绿发布门禁的流量切换场景中,不同 Service 类型有不同的适用策略:
- ClusterIP:最适合内部蓝绿切换。通过更新 selector 指向新版本 Pod,实现零中断切换。
- NodePort:适合小规模灰度验证。可以创建两个 NodePort Service 分别指向蓝绿版本,通过客户端选择端口访问。
- LoadBalancer:生产环境标准方案。结合 Ingress 或 Service Mesh,可以实现更精细的流量比例切换。
- ExternalName:不参与蓝绿发布,仅用于外部服务映射。
最佳实践: 在蓝绿发布门禁中,推荐使用 ClusterIP + LoadBalancer 的组合。ClusterIP 负责内部流量切换,LoadBalancer 作为外部统一入口。门禁系统通过控制 ClusterIP 的 selector 来实现秒级流量切换。