这是一个专为裸金属(Bare-Metal)和私有云环境设计的 Kubernetes LoadBalancer 控制器。
这个项目受 MetalLB 的启发,但旨在提供一个更轻量、更易于理解和定制的实现。它作为一个独立的控制器,能够自动为 type: LoadBalancer 的 Service 分配 IP 地址,并将外部流量路由到你的集群内部。
- 自动 IP 分配:通过硬编码的 IP 地址池,为 LoadBalancer 类型的 Service 自动分配 IP。
- Layer 2 (ARP) 网络通告:使用 ARP 协议将 Service 的 IP 地址广播到本地网络,确保外部流量能够正确路由到你的 Kubernetes 节点。
- 轻量化设计:项目代码精简,逻辑清晰,非常适合作为学习 Kubernetes 控制器开发和网络编程的入门项目。
- 跨平台构建:使用 Makefile 和多阶段 Dockerfile,可以轻松地在 macOS 等平台上为 linux/arm64 或 linux/amd64 架构构建应用。
git clone https://github.com/gitlayzer/kube-loadbalancer.git
cd kube-loadbalancer在 pkg/ipam/ipam.go 文件中,你可以找到并修改硬编码的 IP 地址池,以适应你的网络环境。
// pkg/ipam/ipam.go
// IP 地址管理器,使用一个 map 来模拟 IP 池
var ipPool = map[string]string{
"192.168.1.240": "unused",
"192.168.1.241": "unused",
"192.168.1.242": "unused",
}使用 Makefile 和 Docker 来构建应用的二进制文件和 Docker 镜像。
# 直接构建当前架构的镜像的 v0.0.1 版本
make build-docker DOCKER_IMAGE_TAG=v0.0.1
# 构建其他架构的镜像自行修改 Dockerfile
# 构建镜像并指定 tag 可以直接修改 Makefile 中 DOCKER_IMAGE_TAG 的值
# 指定镜像仓库可以直接修改 Makefile 中 DOCKER_IMAGE_NAME 的值将你的控制器部署到集群中。请确保你已经将 deployment.yaml 中的镜像名称替换为你构建的镜像。
kubectl apply -f deploy/部署一个 LoadBalancer 类型的 Service,观察你的控制器是否能自动为其分配 IP 地址。
➜ kube-loadbalancer kubectl get pod,svc
NAME READY STATUS RESTARTS AGE
pod/nginx 1/1 Running 0 55s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/nginx LoadBalancer 192.168.194.161 192.168.139.2 80:31216/TCP 55s使用 curl 命令请求你的 Service,并确保请求成功。
➜ kube-loadbalancer curl -I http://192.168.139.2
HTTP/1.1 200 OK
Server: nginx/1.29.1
Date: Mon, 22 Sep 2025 02:58:57 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Wed, 13 Aug 2025 15:10:24 GMT
Connection: keep-alive
ETag: "689caae0-267"
Accept-Ranges: bytes这个项目遵循 Go 语言的通用项目结构,实现了清晰的职责分离。
kube-loadbalancer/
├── cmd/
│ └── main.go # 程序入口
├── pkg/
│ ├── controller/ # 核心控制器逻辑
│ ├── ipam/ # IP 地址管理模块
│ └── network/ # 网络通告模块 (Layer 2)
├── go.mod
├── go.sum
└── Dockerfile这个项目还处于早期阶段,欢迎大家提出宝贵意见、提交 Bug 或贡献代码。你的反馈对我来说非常重要。
如果你对 Kubernetes 控制器开发或底层网络有兴趣,这个项目是很好的起点。欢迎 Fork 和 Star!