主题
第10章 外部访问:NodePort、LoadBalancer、MetalLB
前几章讲的主要是集群内部通信。本章讲解如何让集群外部的用户访问集群内的服务。
10.1 外部访问的三种方式
| 方式 | 说明 | 适用场景 |
|---|---|---|
| NodePort | 在每个节点上开放一个端口 | 临时测试、LB 底层 |
| LoadBalancer | 云厂商创建外部负载均衡器 | 云环境生产入口 |
| Ingress | 七层路由,基于域名/路径 | 多个服务共享一个入口 |
本章重点讲 NodePort 和 LoadBalancer,Ingress 在下一章讲。
10.2 NodePort 回顾
yaml
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
type: NodePort
selector:
app: web
ports:
- port: 80
targetPort: 8080
nodePort: 30080访问方式
bash
curl http://<Node-IP>:30080问题
- 客户端需要知道节点 IP。
- 单个节点故障会导致入口不可用。
- 生产环境不推荐直接暴露。
这些问题将在第13章深入讨论。
10.3 LoadBalancer
在云厂商 Kubernetes 集群中,创建 type: LoadBalancer 的 Service 会自动创建云负载均衡器。
yaml
apiVersion: v1
kind: Service
metadata:
name: web-service
spec:
type: LoadBalancer
selector:
app: web
ports:
- port: 80
targetPort: 8080查看外部 IP
bash
kubectl get svc web-service
# NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
# web-service LoadBalancer 10.96.10.20 47.100.1.1 80:30080/TCP 1m流量路径
text
外部用户
│
▼
云 LB(EXTERNAL-IP:80)
│
▼
<Node-IP>:30080(NodePort)
│
▼
Service:80
│
▼
Pod:8080云厂商 LoadBalancer 的工作
- 分配外部 IP。
- 配置健康检查。
- 将流量转发到节点 NodePort 或 Pod(部分云厂商支持直接路由)。
10.4 裸金属方案:MetalLB
在自建机房或裸金属集群中,没有云厂商的 LoadBalancer,可以使用 MetalLB。
Layer 2 模式
通过 ARP/NDP 宣告 IP,简单但存在单点瓶颈。
BGP 模式
与路由器建立 BGP 会话,实现真正的负载均衡和高可用。
配置示例
yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: default
namespace: metallb-system
spec:
addresses:
- 10.0.0.100-10.0.0.200
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: default
namespace: metallb-system创建 LoadBalancer Service 后,MetalLB 会从地址池中分配一个 IP。
10.5 externalTrafficPolicy
外部流量策略影响 LoadBalancer/NodePort 的转发行为:
| 策略 | 行为 | 源 IP |
|---|---|---|
Cluster(默认) | 流量可跨节点转发到任意 Pod | 可能被 SNAT,丢失真实源 IP |
Local | 只转发到本节点上的 Pod | 保留真实源 IP |
yaml
spec:
type: LoadBalancer
externalTrafficPolicy: LocalLocal 模式的风险
如果某个节点上没有 Pod,流量到达该节点后会被丢弃。因此需要配合 LB 健康检查,只把流量发给有 Pod 的节点。
10.6 负载均衡器健康检查
云厂商 LB 通常探测节点上的 NodePort。如果节点上没有后端 Pod(例如 externalTrafficPolicy=Local),LB 不应将流量发送到该节点,否则会出现连接失败。
10.7 本章小结
- NodePort 适合测试,不适合生产直接暴露。
- LoadBalancer 是云环境的生产标准做法。
- 裸金属集群可用 MetalLB 替代云厂商 LB。
externalTrafficPolicy=Local保留源 IP,但可能导致空节点丢包。
本章练习
- 创建一个 NodePort Service,从集群外通过节点 IP 访问。
- 如果环境支持,创建一个 LoadBalancer Service,查看 EXTERNAL-IP。
- 分别测试
externalTrafficPolicy=Cluster和Local,观察 Pod 内看到的源 IP 是否不同。