MetalLB负载均衡器
什么是 MetalLB?
MetalLB 是一个为裸机 Kubernetes 集群提供网络负载均衡器实现的纯软件解决方案。它解决了裸机环境缺乏云厂商负载均衡器的问题。
MetalLB 工作原理
传统云环境 vs 裸机环境
云环境:
- 创建 LoadBalancer Service 时,云提供商自动分配外部 IP
- 云负载均衡器将流量转发到集群节点
裸机环境:
- 没有云提供商的负载均衡器
- LoadBalancer Service 会一直处于
<pending>状态 - MetalLB 填补了这个空白
MetalLB Layer 2 模式工作流程
IP 分配:
- ingress-nginx Service 创建时,MetalLB 从 IP 池中选择一个 IP
- 将这个 IP 分配给 Service 的
EXTERNAL-IP字段
ARP 响应:
- MetalLB 选择一个节点作为 “leader”
- 这个节点开始响应对分配 IP 的 ARP 请求
- 当外部设备询问 IP 的 MAC 地址时,选中的节点回答
流量路由:
- 外部流量发送到分配的 IP 时,实际到达选中的节点
- 节点上的 iptables 规则将流量转发到 ingress-nginx Pod
- kube-proxy 负责正确路由到实际的 Pod
简单类比
想象 MetalLB 就像一个”代理人”:
- 你想找”192.168.1.100先生”
- 实际上没有这个人,但是某个节点说:”我就是192.168.1.100”
- 你把请求给了这个节点,它再转交给真正的 nginx 服务
使用 MetalLB
场景说明
在云服务器环境中,每个节点都有公网 IP 和内网 IP,但为了避免云厂商 LB 费用,选择使用 MetalLB。
网络环境示例
1 | # 节点信息示例 |
MetalLB 安装
1 | helm repo add metallb https://metallb.github.io/metallb |
等待 MetalLB 组件启动
1 | # 检查安装状态 |
MetalLB 配置 IP 地址池
metallb-config.yaml
1 | apiVersion: metallb.io/v1beta1 |
1 | kubectl apply -f metallb-config.yaml |
当用户创建一个 spec.type: LoadBalancer 的 Service 时,MetalLB 会检测到该 Service,并从配置的 IPAddressPool 中选择一个未使用的 IP 地址。
如果 Service 的 spec.loadBalancerIP 字段指定了一个特定 IP,MetalLB 会尝试分配该 IP(前提是该 IP 在地址池内且未被占用)。
举例说明:
假设你的云服务器内网段IPv4 CIDR是 10.0.0.0/24
节点IP: 10.0.0.10, 10.0.0.150, 10.0.0.175
选择未使用的IP段作为MetalLB池,通常与集群所在网络的子网一致- 10.0.0.200-10.0.0.230
验证 MetalLB 安装
1 | # 检查 MetalLB 组件状态 |