Skip to content

第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: Local

Local 模式的风险

如果某个节点上没有 Pod,流量到达该节点后会被丢弃。因此需要配合 LB 健康检查,只把流量发给有 Pod 的节点。


10.6 负载均衡器健康检查

云厂商 LB 通常探测节点上的 NodePort。如果节点上没有后端 Pod(例如 externalTrafficPolicy=Local),LB 不应将流量发送到该节点,否则会出现连接失败。


10.7 本章小结

  • NodePort 适合测试,不适合生产直接暴露。
  • LoadBalancer 是云环境的生产标准做法。
  • 裸金属集群可用 MetalLB 替代云厂商 LB。
  • externalTrafficPolicy=Local 保留源 IP,但可能导致空节点丢包。

本章练习

  1. 创建一个 NodePort Service,从集群外通过节点 IP 访问。
  2. 如果环境支持,创建一个 LoadBalancer Service,查看 EXTERNAL-IP。
  3. 分别测试 externalTrafficPolicy=ClusterLocal,观察 Pod 内看到的源 IP 是否不同。