Kubernetes

K8s Service 高级配置

·6 分钟阅读·2212 字
📋 目录

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
NodePort30000+ 端口节点IP:高端口节点端口转发
LoadBalancer80/443公网 IP云厂商 LB
externalIPs80/443 正常端口手动指定 IP:端口内核直接拦截目标 IP

适用场景

  • 机房内网服务暴露(不用 NodePort 高端口)
  • 自己管理的公网 IP 直接绑定 Service
  • 裸机 K8s 最简单的公网暴露方式

安全警告:externalIPs 是高危功能!任何能修改 Service 的人都可以抢占集群内的 IP 劫持流量。生产环境需用 CIDR 限制可用 IP。


⚡ loadBalancerClass(指定 LB 控制器)

给 LoadBalancer Service 打标签,指定由哪个控制器来创建 LB,实现集群里多套负载均衡控制器共存。

工作原理

spec:
  type: LoadBalancer
  loadBalancerClass: metallb    # 交给 MetalLB 分配内网 IP
  1. 云厂商默认 CCM 直接忽略带 class 的 Service
  2. 必须提前部署自定义 LB 控制器(MetalLB、AWS-NLB 等)
  3. 控制器只监听与自己 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
ServiceMeshIstio/Linkerd 网关层做健康检查与熔断
云厂商 LB + 手动 EndpointLB 会做健康检查,不健康自动剔除

一句话总结

自动 Endpoint 由 K8s 控制,自带健康检查,Pod 异常自动摘除;手动 Endpoint 没有任何健康检查,必须通过外部工具自行维护 IP 可用性。


关联文档

  • K8s Service 核心原理 — Service 基础类型
  • ../network/kube-proxy 流量转发与代理模式详解 — 流量转发机制
  • ../../network/网络 — 网络模型

关联文档