想知道 LoadBalancer Service 和 K8s 里其他 Service 类型(ClusterIP、NodePort、Headless)的核心区别


一、先明确 K8s 所有 Service 类型及核心规则

类型核心 “规则”(核心逻辑)外部访问能力适用场景
ClusterIP(默认)仅在集群内分配一个虚拟 IP(ClusterIP),通过 selector 匹配 Pod,流量转发到 Pod 的 targetPort❌ 仅集群内部可访问集群内 Pod 之间通信(比如前端调后端)
NodePort在 ClusterIP 基础上,给集群所有节点开放一个固定端口(30000-32767),外部通过 节点IP:NodePort 访问✅ 外部可访问(节点 IP + 端口)测试 / 开发环境对外暴露服务
LoadBalancer在 NodePort 基础上,通过 MetalLB / 云厂商 LB 分配一个独立的外部 IP,外部直接通过 外部IP:Port 访问✅ 外部可访问(独立 IP + 端口)生产环境对外暴露单个 TCP/UDP 服务
Headless(无头服务)不分配 ClusterIP,DNS 解析直接返回所有匹配 Pod 的 IP,无负载均衡❌ 仅集群内部可访问(直接访问 Pod IP)有状态应用(如 MySQL 主从、MongoDB 集群)

二、逐个拆解:代码 + 规则 + 效果(对比看)

1. ClusterIP(默认)

核心代码
apiVersion: v1
kind: Service
metadata:
  name: nginx-clusterip
spec:
  selector:
    app: nginx  # 规则:匹配 app=nginx 的 Pod
  ports:
  - port: 80          # Service 端口(集群内访问用)
    targetPort: 80    # 转发到 Pod 的 80 端口
  type: ClusterIP     # 默认类型,可省略
核心规则
  • 分配一个 ClusterIP(如 10.96.xxx.xxx),仅集群内可见;
  • 集群内 Pod 可通过 10.96.xxx.xxx:80 访问,外部完全访问不到;
  • 核心价值:屏蔽 Pod IP 变化(Pod 重建 IP 变,Service IP 不变)。

2. NodePort

核心代码
apiVersion: v1
kind: Service
metadata:
  name: nginx-nodeport
spec:
  selector:
    app: nginx
  ports:
  - port: 80          # Service 内部端口
    targetPort: 80    # Pod 端口
    nodePort: 32420   # 节点开放的端口(可选,不写则自动分配)
  type: NodePort      # 关键:指定 NodePort 类型
核心规则
  • 自动创建 ClusterIP,同时给所有节点开放 nodePort(如 32420);
  • 外部访问方式:任意节点IP:32420(比如 192.168.30.131:32420);
  • 缺点:端口是 30000+ 的随机段,难记;依赖节点 IP,节点挂了就访问不了。

3. LoadBalancer(重点对比)

核心代码
apiVersion: v1
kind: Service
metadata:
  name: nginx-loadbalancer
spec:
  selector:
    app: nginx
  ports:
  - port: 80          # Service 内部端口
    targetPort: 80    # Pod 端口
  type: LoadBalancer  # 关键:指定 LoadBalancer 类型
核心规则(和 NodePort 核心区别)
  • 底层自动创建 NodePort(比如 30991),但用户不用管;
  • MetalLB 从 IP 池(192.168.30.240-250)分配一个独立外部 IP(如 192.168.30.240);
  • 外部访问方式:192.168.30.240:80(独立 IP+80 端口,不用记 30000+ 端口);
  • 核心价值:有独立的、固定的外部 IP,不依赖节点 IP,节点挂了 MetalLB 会自动切换。

4. Headless(无头服务)

核心代码
apiVersion: v1
kind: Service
metadata:
  name: nginx-headless
spec:
  clusterIP: None     # 关键:不分配 ClusterIP
  selector:
    app: nginx
  ports:
  - port: 80
    targetPort: 80
  # type 省略(默认 ClusterIP,但 clusterIP: None 就变成 Headless)
核心规则
  • 无 ClusterIP,执行 nslookup nginx-headless 会直接返回所有 Nginx Pod 的 IP;
  • 无负载均衡,外部 / 内部都只能直接访问 Pod IP;
  • 核心价值:适合需要直接访问单个 Pod 的场景(比如数据库主从,需要固定访问主 Pod)。

三、LoadBalancer 和其他 Service 的核心区别(一句话总结)

  1. 和 ClusterIP 比:LoadBalancer 能对外暴露服务,ClusterIP 只能集群内访问;
  2. 和 NodePort 比:LoadBalancer 有独立的外部 IP(不用记 30000+ 端口),不依赖节点 IP,更稳定;
  3. 和 Headless 比:LoadBalancer 有负载均衡、有外部 IP,Headless 无负载均衡、无 IP,仅集群内访问 Pod IP;
  4. 本质:LoadBalancer 是 NodePort 的 “升级版”,解决了 NodePort 端口难记、依赖节点 IP 的问题。

四、选择指南(什么时候用什么 Service)

场景首选 Service 类型
集群内 Pod 通信(比如前端调后端)ClusterIP
测试环境对外暴露服务(临时用)NodePort
生产环境对外暴露单个 TCP/UDP 服务(如数据库、单服务 API)LoadBalancer + MetalLB
有状态应用(需要直接访问单个 Pod)Headless
生产环境对外暴露多个 HTTP/HTTPS 服务(需要域名 / 路径路由)Ingress(基于 ClusterIP/NodePort/LoadBalancer)

更多推荐