k8s service发现
·
想知道 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 的核心区别(一句话总结)
- 和 ClusterIP 比:LoadBalancer 能对外暴露服务,ClusterIP 只能集群内访问;
- 和 NodePort 比:LoadBalancer 有独立的外部 IP(不用记 30000+ 端口),不依赖节点 IP,更稳定;
- 和 Headless 比:LoadBalancer 有负载均衡、有外部 IP,Headless 无负载均衡、无 IP,仅集群内访问 Pod IP;
- 本质:LoadBalancer 是 NodePort 的 “升级版”,解决了 NodePort 端口难记、依赖节点 IP 的问题。
四、选择指南(什么时候用什么 Service)
| 场景 | 首选 Service 类型 |
|---|---|
| 集群内 Pod 通信(比如前端调后端) | ClusterIP |
| 测试环境对外暴露服务(临时用) | NodePort |
| 生产环境对外暴露单个 TCP/UDP 服务(如数据库、单服务 API) | LoadBalancer + MetalLB |
| 有状态应用(需要直接访问单个 Pod) | Headless |
| 生产环境对外暴露多个 HTTP/HTTPS 服务(需要域名 / 路径路由) | Ingress(基于 ClusterIP/NodePort/LoadBalancer) |
更多推荐
所有评论(0)