使用 MetalLB 时,对局域网环境的要求取决于你选择的 MetalLB 操作模式。它主要提供两种模式:Layer 2 模式和 BGP 模式。它们对网络环境的要求截然不同。
模式一:Layer 2 模式(最常用,对网络要求最低)
这是 MetalLB 的默认模式,也是绝大多数私有环境的首选。
工作原理
- MetalLB 会选择一个节点作为“演讲者”,该节点会使用 ARP(IPv4)或 NDP(IPv6) 协议来响应来自局域网的 IP 地址请求。
- 简单来说,当你在局域网内请求
http://192.168.1.100时,你的计算机会广播问:“谁是 192.168.1.100?”。被 MetalLB 指定的那个 Kubernetes 节点会回答:“是我!”,之后所有去往这个 IP 的流量都会发往该节点,再由该节点通过 kube-proxy 路由到实际的 Istio Ingress Gateway Pod。
对局域网环境的要求
IP 地址池:你需要为 MetalLB 分配一个或多个空闲的、连续的 IP 地址段,这个段必须与你的 Kubernetes 节点网络在同一个二层广播域内。
- 例如:你的节点 IP 是
192.168.1.10-192.168.1.20,那么你可以分配192.168.1.100-192.168.1.110给 MetalLB。 - 关键:这些 IP 不能被网络中的 DHCP 服务器分配,也不能被任何其他设备静态占用。
- 例如:你的节点 IP 是
二层网络连通性:
- 所有 Kubernetes 节点必须位于同一个二层网络(同一个子网/VLAN) 中。
- 客户端(访问服务的机器)也必须与 Kubernetes 节点在同一个二层网络中,或者网络路由器必须能够将 ARP/NDP 广播转发到客户端所在的子网。
- 简单判断:如果你的客户端能直接
ping通你的 Kubernetes 节点 IP,那么通常也满足 Layer 2 模式的要求。
对路由器的要求:
- 基本上没有要求。这是 Layer 2 模式最大的优点。它不要求路由器支持任何特定协议(如 BGP)。普通的家用路由器、简单的二层交换机都能完美支持。
优缺点
- 优点:配置简单,对网络设备无特殊要求,即插即用。
- 缺点:
- 故障转移有延迟:如果当前负责响应的节点宕机,MetalLB 会选举另一个节点来接管 IP,这个过程中会有几秒到十几秒的网络中断。
- 带宽限制:所有流量都必须经过那个“演讲者”节点,无法实现真正的多节点负载均衡。如果流量巨大,该节点可能成为瓶颈。
- ARP/NDP 泛滥:在大型网络中,过多的 ARP 流量可能成为问题。
模式二:BGP 模式(适用于生产级网络)
这种模式适用于具有支持 BGP 路由器的、更复杂的网络环境。
工作原理
- 每个 Kubernetes 节点都会与一个或多个网络路由器建立 BGP 对等会话。
- 当 MetalLB 需要分配一个 IP 时,它会通过 BGP 协议向路由器宣告:“这个 IP 在我这里(某个特定节点上),请把来这个 IP 的流量都发给我”。
- 路由器会基于其路由表,智能地将去往该 IP 的流量负载均衡到所有宣告了该路由的节点上。
对局域网环境的要求
支持 BGP 的路由器:这是必须的。你网络中的核心路由器或三层交换机必须支持 BGP 协议,并且你需要有权限配置 BGP 对等体。
- 常见支持 BGP 的设备:Cisco IOS/IOS-XE/NX-OS, Juniper JunOS, Arista EOS, FRRouting, Bird 等。
BGP 对等体配置:
- 你需要知道路由器的 IP 地址和 AS 号。
- 你需要在路由器上配置,允许 Kubernetes 节点的 IP 与其建立 BGP 连接。
- 你需要在 MetalLB 的配置中指定路由器的 IP 和 AS 号。
IP 地址池:同样需要分配一段空闲的 IP 地址。这个段不一定要和节点 IP 在同一个子网,因为 BGP 是三层路由协议。
优缺点
- 优点:
- 真正的负载均衡:流量可以被路由器均衡地分发给多个 Kubernetes 节点。
- 快速故障转移:如果某个节点宕机,BGP 协议会迅速(秒级)从路由表中撤回该节点的路由,流量会自动切换到其他健康节点。
- 扩展性好:适用于大型、复杂的网络。
- 缺点:
- 配置复杂:需要同时配置 Kubernetes 和网络设备,对运维人员要求高。
- 对网络设备有硬性要求:必须要有支持 BGP 的路由器。
总结与建议
| 特性 | Layer 2 模式 | BGP 模式 |
|---|---|---|
| 网络要求 | 低,只需普通二层交换机/路由器 | 高,需要支持 BGP 的路由器 |
| 配置复杂度 | 低,主要在 Kubernetes 内配置 | 高,需配置 Kubernetes 和网络设备 |
| 负载均衡 | 否,流量集中到单一节点 | 是,路由器可实现多节点均衡 |
| 故障转移速度 | 慢(秒级到十几秒) | 快(秒级) |
| 适用场景 | 中小型部署、实验室、开发测试环境 | 大型、生产级、高可用性要求高的环境 |
给你的建议:
- 如果你是第一次在私有环境使用,或者你的网络比较简单(例如,使用普通家用路由器或简单的企业交换机),请毫不犹豫地选择 Layer 2 模式。 它能解决 90% 以上的私有化部署需求,并且配置非常简单。
- 只有当你管理一个大型数据中心网络,拥有支持 BGP 的核心路由器,并且对流量负载均衡和快速故障转移有极高要求时,才考虑使用 BGP 模式。
实践步骤(Layer 2 模式):
- 安装 MetalLB。
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.10/config/manifests/metallb-native.yaml - 创建一个 ConfigMap,指定一个与你的节点在同一网段的 IP 地址池。
1
2
3
4
5
6
7
8
9
10
11
12apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 192.168.1.100-192.168.1.110 # 替换为你的空闲 IP 段 - 保持 Istio Ingress Gateway 的 Service 类型为
LoadBalancer。 - 稍等片刻,查看
kubectl get svc -n istio-system istio-ingressgateway,其EXTERNAL-IP就会显示为 MetalLB 分配的 IP(如192.168.1.100)。现在,你就可以在局域网内通过http://192.168.1.100访问你的服务了。