裸机 Kubernetes 集群负载均衡器:MetalLB 深度解析与实战指南

一、引言

在云原生架构中,Kubernetes 默认的负载均衡能力依赖于云厂商(如 AWS ELB、GCP LB),但在裸机或本地数据中心环境中,这一功能缺失导致 LoadBalancer 类型的 Service 始终处于 Pending 状态。此时,MetalLB 应运而生。本文将从技术原理、部署实践、企业案例出发,深入探讨 MetalLB 在裸机 Kubernetes 环境中的价值与应用。

二、什么是 MetalLB?

MetalLB 是一个专为裸机 Kubernetes 集群设计的开源负载均衡器,通过标准路由协议(如 ARP/NDP 或 BGP)实现外部流量的接入。其核心功能包括:

  1. IP 地址分配:从预配置的地址池中动态分配 IP 给 LoadBalancer 类型的 Service。

  2. IP 广播:通过 Layer2(ARP/NDP)或 BGP 协议,将分配的 IP 通告给外部网络,实现流量路由256。

与云厂商方案不同,MetalLB 无需依赖特定硬件或云服务,特别适用于本地数据中心、边缘计算等场景。

什么是Layer2和BGP协议?

Layer2 是数据链路层,ARP(地址解析协议)用于 IPv4 环境,将 IP 地址解析为 MAC 地址,以实现局域网内设备通信;NDP(邻居发现协议)用于 IPv6 环境,功能类似 ARP。BGP(边界网关协议)是网络层协议,用于在不同自治系统之间传递路由信息,实现跨网络的流量转发和路径选择。

用简单的话来说就是:

Layer2 就是网络中的 “邻居找邻居” 这件事。ARP 好比在 IPv4 这条街上,A 家要找 B 家,但不知道 B 家的门牌号(MAC 地址),就喊一嗓子问谁是 B 家,B 家听到后就告诉 A 家自己的门牌号。NDP 则是 IPv6 这条街上干类似活的。

而 BGP 就像是快递公司(自治系统)之间的 “指路牌”,告诉快递员(路由器)包裹该走哪条路、怎么转,才能把包裹从发件地送到收件地。

三、部署与测试 

1.此次K8S环境使用的是K8S1.23.17版本,CNI用的是Calico,CRI为Docker2.修改kube-proxy的configMap
kubectl get configmap kube-proxy -n kube-system -o yaml | \
sed -e "s/strictARP: false/strictARP: true/"  | \
sed -e 's#mode: ""#mode: "ipvs"#' | \
kubectl apply -f - -n kube-system3.下载metallb
[root@master231 metallb]# wget https://raw.githubusercontent.com/metallb/metallb/v0.14.9/config/manifests/metallb-native.yaml4.所有K8S节点导入镜像
因为网络的原因,我这里提前下载好了镜像,有VPN的朋友此步骤可以跳过。http://192.168.16.253/Resources/Kubernetes/Add-ons/metallb/v0.14.9/5.部署metallb
[root@master231 /manifests/metallb]# kubectl apply -f metallb-native.yaml 
namespace/metallb-system created
.....
validatingwebhookconfiguration.admissionregistration.k8s.io/metallb-webhook-configuration configured6.查看metallb的状态
[root@master231 /manifests/metallb]# kubectl get deploy,rs,svc,po -n metallb-system 
NAME                         READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/controller   1/1     1            1           54sNAME                                    DESIRED   CURRENT   READY   AGE
replicaset.apps/controller-686c7db689   1         1         1       54sNAME                              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)   AGE
service/metallb-webhook-service   ClusterIP   10.200.59.227   <none>        443/TCP   54sNAME                              READY   STATUS    RESTARTS   AGE
pod/controller-686c7db689-cqg9l   1/1     Running   0          54s
pod/speaker-dqlwr                 1/1     Running   0          54s
pod/speaker-mxrzl                 1/1     Running   0          53s
pod/speaker-zxzcp                 1/1     Running   0          53s7.创建MetalLB地址池
[root@master231 /manifests/metallb]# cat metallb-ip-pool.yaml 
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:name: linux96namespace: metallb-system
spec:addresses:- 10.0.0.150-10.0.0.180---apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:name: xixinamespace: metallb-system
spec:ipAddressPools:- linux96
[root@master231 /manifests/metallb]# kubectl apply -f metallb-ip-pool.yaml
ipaddresspool.metallb.io/linux96 created
l2advertisement.metallb.io/xixi created8.验证LoadBalancer是否可用
[root@master231 /manifests/metallb]# cat deploy-ns-svc.yaml 
apiVersion: v1
kind: Namespace
metadata:name: haha---apiVersion: apps/v1
kind: Deployment
metadata:name: deploy-xiuxiannamespace: hahalabels:apps: xiuxian
spec:replicas: 5selector:matchLabels:version: v1template:metadata:labels:version: v1school: hahaclass: linux96spec:containers:- image: registry.cn-hangzhou.aliyuncs.com/yinzhengjie-k8s/apps:v1name: xiuxian---apiVersion: v1
kind: Service
metadata:name: svc-xiuxian-lbnamespace: haha
spec:type: LoadBalancer  ports:- port: 80protocol: TCPtargetPort: 80nodePort: 30120selector:version: v1# 
[root@master231 metallb]# kubectl apply -f deploy-ns-svc.yaml
[root@master231 /manifests/metallb]# kubectl get deploy,rs,po,svc -n haha
NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/deploy-xiuxian   5/5     5            5           53sNAME                                       DESIRED   CURRENT   READY   AGE
replicaset.apps/deploy-xiuxian-9ddcfd7db   5         5         5       53sNAME                                 READY   STATUS    RESTARTS   AGE
pod/deploy-xiuxian-9ddcfd7db-4dwd2   1/1     Running   0          53s
pod/deploy-xiuxian-9ddcfd7db-9x2db   1/1     Running   0          53s
pod/deploy-xiuxian-9ddcfd7db-bkfcc   1/1     Running   0          53s
pod/deploy-xiuxian-9ddcfd7db-mxq2x   1/1     Running   0          53s
pod/deploy-xiuxian-9ddcfd7db-zq88k   1/1     Running   0          53sNAME                     TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
service/svc-xiuxian-lb   LoadBalancer   10.200.244.45   10.0.0.150    80:30120/TCP   53s访问测试:基于NodePort端口访问 
http://10.0.0.231:30120/
http://10.0.0.232:30120/
http://10.0.0.233:30120/基于LoadBalancer访问
10.0.0.150

四、MetalLB 工作流程

MetalLB 由两个核心组件协作:

  1. Controller:监听 Service 事件,负责 IP 地址分配与回收。

  2. Speaker:以 DaemonSet 形式运行,根据配置模式(Layer2/BGP)广播 IP2610。

新增 Service 流程

  • Controller:检测到 LoadBalancer 类型 Service 后,从地址池分配 IP 并写入 Service 的 status.loadBalancer.ingress 字段。

  • Speaker:根据模式通告 IP。Layer2 模式下,通过 ARP/NDP 响应;BGP 模式下,向路由器发布路由表10。

故障切换:Layer2 模式通过 memberlist 库实现 Leader 选举,故障时重新选举并更新 ARP 响应(耗时约数秒)25。

Layer2 模式 vs BGP 模式

Layer2 模式
  • 原理:选举一个 Leader 节点,通过 ARP/NDP 将 Service IP 绑定到该节点的 MAC 地址。流量经 Leader 节点转发至 Pod。

  • 优点:配置简单,无需 BGP 路由器支持。

  • 缺点

    • 单点瓶颈:流量集中到 Leader 节点,带宽受限于单节点性能。

    • 故障转移延迟:客户端 ARP 缓存可能导致短暂服务中断(约 5-10 秒)16。

  • 适用场景:中小规模集群、测试环境或对高可用性要求较低的场景。

BGP 模式
  • 原理:每个节点与 BGP 路由器建立对等会话,将 Service IP 作为等价多路径(ECMP)路由通告,实现流量负载均衡。

  • 优点

    • 真正负载均衡:流量分散到多个节点。

    • 扩展性强:支持大规模集群。

  • 挑战

    • 路由器依赖:需支持 BGP 协议,且配置复杂。

    • 哈希算法限制:路由器基于五元组哈希分配连接,节点故障时可能导致部分连接重置210。

  • 优化建议

    • 使用支持弹性 ECMP 的路由器,减少节点变更对连接的影响。

    • 将服务拆分至多个 IP,结合 DNS 逐步迁移流量10。

  • 适用场景:生产环境、高吞吐量服务。

五、企业真实案例:某电商平台的 MetalLB 实践 

背景

某电商平台在本地数据中心部署 Kubernetes 集群,初期使用 NodePort 暴露服务,面临端口管理复杂和单点故障问题。

方案选型

  • 需求:高可用、支持 TCP/UDP、无缝集成现有网络。

  • 选择 MetalLB Layer2 模式:因内部网络无 BGP 支持,且初期流量压力较小。

实施效果

  • 服务可用性提升:通过 Leader 选举机制,故障切换时间从分钟级降至秒级。

  • 简化运维:统一使用 LoadBalancer 类型服务,替代手动管理 NodePort。

  • 瓶颈暴露:促销期间 Leader 节点带宽饱和,后续切换至 BGP 模式并引入高性能路由器8。


使用建议

  1. IP 地址规划

    • 预留充足 IP 段,避免与现有网络冲突。

    • 使用 IPAddressPool 的 autoAssign 属性控制自动分配范围36。

  2. 网络兼容性验证

    • 确保节点间 7946 端口(memberlist)互通。

    • Calico 用户需禁用 BGP 或调整 Peer 配置36。

  3. 监控与告警

    • 监控 metallb_allocator_ips_total 指标,避免地址池耗尽。

    • 集成 Prometheus 抓取 Speaker 和 Controller 指标10。

六、总结 

MetalLB 填补了裸机 Kubernetes 集群的负载均衡能力空白,其 Layer2 和 BGP 模式各具优劣。企业应根据网络环境、规模及运维能力选择合适方案。对于追求高可用的生产场景,BGP 模式结合弹性路由策略是更优解;而中小规模场景下,Layer2 模式则能以更低成本实现快速部署。

延伸阅读

  • MetalLB 官方文档

  • BGP 模式深度调优指南

:本文基于 MetalLB v0.14.9 编写,部分配置可能随版本迭代变化。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/81653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2025年- H20-Lc128-240. 搜索二维矩阵 II(矩阵)---java版

1.题目描述 2.思路 遍历矩阵&#xff0c;然后如果遇到矩阵中的值正好等于target&#xff0c;输出true。否则&#xff0c;输出false。 3.代码 public class H240 {public boolean searchMatrix(int[][] matrix, int target) {//1.计算出总的行值&#xff0c;总的列值。int mm…

系统架构设计师:设计模式——行为设计模式

一、行为设计模式 行为模式涉及算法和对象间职责的分配。行为模式不仅描述对象或类的模式&#xff0c;还描述它们之间的通信模式。这些模式刻画了在运行时难以跟踪的、复杂的控制流。它们将用户的注意力从控制流转移到对象间的联系方式上来。 行为类模式使用继承机制在类间分…

java springboot实现MCP Server SSE

参考&#xff1a; https://juejin.cn/post/7491881721278529570 SpringAI 实现 SSE MCP Server项目 - Auler - 博客园 springboot-MCPserver-JUnit: 使用springboot支持mcp项目搭建&#xff0c;同时有着便捷的单元测试来进行敏捷开发对话即服务&#xff1a;Spring BootMCP让…

LeetCode 热题 100 48. 旋转图像

LeetCode 热题 100 | 48. 旋转图像 大家好&#xff0c;今天我们来解决一道经典的算法题——旋转图像。这道题在LeetCode上被标记为中等难度&#xff0c;要求我们将一个 n n 的二维矩阵&#xff08;图像&#xff09;顺时针旋转90度&#xff0c;并且必须原地修改矩阵&#xff0…

嵌入式按键原理、中断过程与中断程序设计(键盘扫描程序)

按键去抖动  通常的按键所用开关为机械弹性开关,当机械触点断开、闭合时&#xff0c;电压信号波型如下图。由于机械触点的弹性作用&#xff0c;一个按键开关在闭合时不会马上稳定地接通&#xff0c;在断开时也不会一下子断开。因而在闭合及断开的瞬间均伴随有一连串的抖动。…

数据结构之哈夫曼树

8.哈夫曼树 8.1 哈夫曼编码 哈夫曼编码&#xff08;Huffman Coding&#xff09;&#xff0c;又称霍夫曼编码&#xff0c;是一种可变字长编码&#xff08;VLC&#xff09;方式 这种编码方法完全依据字符出现的概率来构造异字头的平均长度最短的码字&#xff0c; 因此有时也被…

机器学习实操 第一部分 机器学习基础 第5章 支持向量机(SVM)

机器学习实操 第一部分 机器学习基础 第5章 支持向量机&#xff08;SVM&#xff09; 内容概要 第5章深入介绍了支持向量机&#xff08;SVM&#xff09;&#xff0c;这是一种功能强大且应用广泛的机器学习模型。SVM适用于线性或非线性分类、回归以及 novelty detection。本章详…

Webug4.0靶场通关笔记14- 第18关 文件上传之Nginx解析缺陷

目录 第18关 渗透实战 1.打开靶场 2.构造php脚本 3.源码分析 &#xff08;1&#xff09;客户端源码 &#xff08;2&#xff09;服务的源码 4.Nginx解析法渗透 &#xff08;1&#xff09;缺陷原因 &#xff08;2&#xff09;缺陷条件 &#xff08;3&#xff09;构造脚…

【QT】QT中的网络编程(TCP 和 UDP通信)

QT中的网络编程&#xff08;TCP 和 UDP通信&#xff09; 1.tcp1.1 tcp通信1.1.1 相比linux中tcp通信:1.1.2 QT中的tcp通信: 1.2 tcp通信流程1.2.1 服务器流程&#xff1a;1.2.1.1 示例代码1.2.1.2 现象 1.2.2 客户端流程&#xff1a;1.2.2.1 示例代码1.2.2.2 现象&#xff1a; …

架构思维:使用懒加载架构实现高性能读服务

文章目录 一、引言二、读服务的功能性需求三、两大基本设计原则1. 架构尽量不要分层2. 代码尽可能简单 四、实战方案&#xff1a;懒加载架构及其四大挑战五、改进思路六、总结与思考题 一、引言 在任何后台系统设计中&#xff0c;「读多写少」的业务场景占据主流&#xff1a;浏…

永磁同步电机控制算法--基于PI的位置伺服控制

一、原理介绍 永磁同步伺服系统是包含了电流环、速度环和位置环的三环控制系统。 伺服系统通过电流检测电路和光电编码器检测电动机三相绕组电流和转子位置θ&#xff0c;通过坐标变换&#xff0c;计算出转矩电流分量iq和励磁电流分量id。 位置信号指令与实际转子位置信号的差…

linux系统线程实现原理浅析

背景 对进程和线程的理解&#xff0c;之前一直都是凭一些零碎不完整的信息在理解&#xff1b; linux的进程和线程基本上一样&#xff0c;线程是轻量级进程&#xff0c;彼此有关联又独立。 得亏内核支持的好&#xff0c;写用户态程序可以不依赖于实现的理解&#xff0c;只需要…

MySQL连接报错处理:1130-host ... is not allowed to connect to this MySql server

在MySQL安装完成后&#xff0c;很多开发者会遇到这样一个问题&#xff1a; 错误代码 1130&#xff1a;host xxx.xxx.xxx.xxx is not allowed to connect to this MySql server 这个错误通常出现在你尝试通过远程工具&#xff08;如 Navicat、DBeaver 等&#xff09;连接 MySQL …

Linux系统之----进程控制

1.进程创建 进程创建部分由于就是fork函数&#xff0c;还有写时拷贝&#xff0c;在上一篇已经讲述过了&#xff0c;这里不在进行赘述&#xff0c;有疑问的读者可以前往上一篇博文《Linux系统--程序地址空间》中阅读&#xff01; 这里在多说一嘴写时拷贝吧 我们可以对比一下写…

Spring框架的设计目标,设计理念,和核心是什么 ?

Spring框架是一个为简化企业级应用开发而设计的开源框架&#xff0c;它提供了全面的基础设施支持&#xff0c;使得Java应用开发更加简单、快速和可维护。下面我将详细解释Spring框架的设计目标、设计理念以及核心组件。 设计目标 简化Java企业级应用开发&#xff1a;通过提供…

Red Hat6.4环境下搭建DNS服务器

DNS服务器&#xff08;Domain Name System Server&#xff09;是互联网中用于将域名&#xff08;如 www.example.com&#xff09;解析为IP地址&#xff08;如 192.0.2.1&#xff09;的服务器。它是互联网基础设施的重要组成部分&#xff0c;帮助用户通过易于记忆的域名访问网站…

Nginx核心功能 02

目录 Nginx代理技术核心概念 &#xff08;一&#xff09;正向代理&#xff08;Forward Proxy&#xff09; 1. 基本定义 2. 技术原理 3. 应用场景 &#xff08;二&#xff09;反向代理&#xff08;Reverse Proxy&#xff09; 1. 基本定义 2. 技术原理 3. 应用场景 一、…

关于Python:3. Python标准库和常用模块

1. os 和 sys&#xff08;系统编程基础&#xff09; 这两个模块是进行系统层面操作&#xff08;如文件管理、路径处理、环境变量访问等&#xff09;必不可少的工具。 os 模块 os 主要是用于与操作系统交互的&#xff0c;比如&#xff1a; 文件和目录操作 获取系统信息 运行…

Java基于SaaS模式多租户ERP系统源码

目录 一、系统概述 二、开发环境 三、系统功能介绍 一、系统概述 ERP&#xff0c;全称 Enterprise Resource Planning 即企业资源计划。是一种集成化的管理软件系统&#xff0c;它通过信息技术手段&#xff0c;将企业的各个业务流程和资源管理进行整合&#xff0c;以提高企业…

个人健康中枢的多元化AI网络革新与精准健康路径探析

引言 随着数字化转型的深入推进,个人健康中枢作为集成化健康管理系统,正在从传统的单一功能向多元化的AI驱动方向快速发展。在这一背景下,新兴网络硬件技术,特别是DPU(数据处理单元)和全光网络的出现,为个人健康中枢的革新提供了前所未有的机遇。本研究将深入探讨这些技…