K8s Service 高级配置
📖 externalIPs(手动绑定物理 IP)
externalIPs 允许你将一个可路由到集群节点的物理 IP,直接绑定到 Service,让外部流量访问该 IP 时,被 kube-proxy 直接拦截并转发到后端 Pod。
工作原理
kube-proxy 在所有节点上生成 iptables/IPVS 规则:凡是目的 IP = 指定 externalIP、目的端口匹配的包,内核直接拦截并 DNAT 到 Service 后端 Pod。
配置示例
spec:
type: ClusterIP
ports:
- port: 80
externalIPs:
- 10.10.10.100 # 手动绑定外部 IP
与 NodePort / LoadBalancer 区别
| 方式 | 端口 | 外部访问 | 原理 |
|---|---|---|---|
| ClusterIP | 集群内 IP | 不能外部访问 | 虚拟 IP |
| NodePort | 30000+ 端口 | 节点IP:高端口 | 节点端口转发 |
| LoadBalancer | 80/443 | 公网 IP | 云厂商 LB |
| externalIPs | 80/443 正常端口 | 手动指定 IP:端口 | 内核直接拦截目标 IP |
适用场景
- 机房内网服务暴露(不用 NodePort 高端口)
- 自己管理的公网 IP 直接绑定 Service
- 裸机 K8s 最简单的公网暴露方式
安全警告:externalIPs 是高危功能!任何能修改 Service 的人都可以抢占集群内的 IP 劫持流量。生产环境需用 CIDR 限制可用 IP。
⚡ loadBalancerClass(指定 LB 控制器)
给 LoadBalancer Service 打标签,指定由哪个控制器来创建 LB,实现集群里多套负载均衡控制器共存。
工作原理
spec:
type: LoadBalancer
loadBalancerClass: metallb # 交给 MetalLB 分配内网 IP
- 云厂商默认 CCM 直接忽略带 class 的 Service
- 必须提前部署自定义 LB 控制器(MetalLB、AWS-NLB 等)
- 控制器只监听与自己 class 名称匹配的 Service
生产痛点解决
| 场景 | 方案 |
|---|---|
| 同一集群两套 LB 并存 | 公网服务空 class 走云厂商;内网业务 class:metallb 用 MetalLB |
| 云厂商内切换 LB 类型 | 指定 class: alibabacloud.com/nlb 改用 NLB |
🔧 四大手动配置 Endpoint 场景
原理
Service 无 selector → K8s 不会自动生成 Endpoint,需手动创建同名 Endpoint 写入后端 IP+端口,kube-proxy 根据手动 Endpoint 做负载转发。
场景 1:对接集群外部中间件
MySQL、Redis、ES 部署在物理服务器上,Pod 通过 Service 名称访问。
场景 2:混合架构迁移过渡期
- 初期:手动 Endpoint 指向老机器 IP
- 后期:删掉手动 Endpoint,Service 加 selector 自动对接新 Pod
- 业务代码零改动
场景 3:跨命名空间/跨集群调用
A 命名空间 Pod 访问 B 命名空间 Service,手动将远端 PodIP 写入本集群 Endpoint。
场景 4:自研控制器/灰度切流量
手动 Endpoint 完全由人为/自研程序管控,不受 Pod 生命周期影响。
手动 Endpoint vs ExternalName
| 方案 | 负载均衡 | 端口映射 |
|---|---|---|
| 手动 Endpoint | ✅ kube-proxy 四层轮询 | ✅ port ≠ targetPort |
| ExternalName | ❌ 仅 DNS CNAME,无 LB | ❌ 端口必须一致 |
⚙️ 手动 Endpoint 的健康检查问题
自动 Endpoint(带 selector):有健康检查,Pod 挂了自动踢出。 手动 Endpoint(无 selector):没有任何健康检查,IP 永远在转发列表里!
kube-proxy 不做什么
kube-proxy 不 ping、不 telnet、不检查端口、不健康探测——你写什么 IP,它就转发什么 IP。
解决方案
| 方案 | 说明 |
|---|---|
| 自写脚本/控制器(生产常用) | 监控外部服务,挂了自动从 Endpoint 删除 IP |
| ServiceMesh | Istio/Linkerd 网关层做健康检查与熔断 |
| 云厂商 LB + 手动 Endpoint | LB 会做健康检查,不健康自动剔除 |
一句话总结
自动 Endpoint 由 K8s 控制,自带健康检查,Pod 异常自动摘除;手动 Endpoint 没有任何健康检查,必须通过外部工具自行维护 IP 可用性。
关联文档
- K8s Service 核心原理 — Service 基础类型
- ../network/kube-proxy 流量转发与代理模式详解 — 流量转发机制
- ../../network/网络 — 网络模型
关联文档