Kubernetes 负载均衡解决方案 MetalLB实践
MetalLB 是一个用于在 Kubernetes 集群中提供外部 IP 地址的负载均衡器实现。
准备工作
1. 安装需知
安装 MetalLB 有一些前置条件:
-
Kubernetesv1.13.0 或者更新的版本
-
集群中的 CNI 要能兼容 MetalLB,最新的兼容性参考NETWORK ADDON COMPATIBILITY
Network addon Compatible Antrea Yes (Tested on version 1.4 and 1.5) Calico Mostly (see known issues) Canal Yes Cilium Yes Flannel Yes Kube-ovn Yes Kube-router Mostly (see known issues) Weave Net Mostly (see known issues) 备注:
常见的 Flannel、Cilium 等都是兼容的,Calico 的话大部分情况都兼容,BGP 模式下需要额外处理。因为 BGP 单 session 的限制,如果 CNI 插件为 Calico ,同时 Calico 也是使用的 BGP 模式,就会有冲突从而导致 MetalLB 无法正常工作。
-
提供一些 IPv4 地址给 MetalLB 用于分配。
-
当使用 BGP 操作模式时,你将需要一个或多个能够支持 BGP 协议的路由器。
-
L2 模式下需要各个节点间 7946 端口(TCP & UDP)需要互通。
最新信息参考:requirements
2. 本文部署的环境
确保你的 Kubernetes 集群已经部署并且运行正常。
root@master1:~# kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master1 Ready control-plane 2d19h v1.28.2 192.168.0.61 <none> Ubuntu 24.04 LTS 6.8.0-36-generic containerd://1.7.12
node1 Ready <none> 2d19h v1.28.2 192.168.0.62 <none> Ubuntu 24.04 LTS 6.8.0-36-generic containerd://1.7.12
node2 Ready <none> 2d19h v1.28.2 192.168.0.63 <none> Ubuntu 24.04 LTS 6.8.0-36-generic containerd://1.7.12
CNI插件及版本信息:
root@master1:~# calicoctl version
Client Version: v3.28.0
Git commit: 413e6f559
Cluster Version: v3.28.0
Cluster Type: typha,kdd,k8s,operator,bgp,kubeadm
# calico使用bgp模式
root@master1:~# calicoctl node status
Calico process is running.
IPv4 BGP status
+--------------+-------------------+-------+----------+-------------+
| PEER ADDRESS | PEER TYPE | STATE | SINCE | INFO |
+--------------+-------------------+-------+----------+-------------+
| 192.168.0.62 | node-to-node mesh | up | 01:33:35 | Established |
| 192.168.0.63 | node-to-node mesh | up | 02:48:04 | Established |
+--------------+-------------------+-------+----------+-------------+
IPv6 BGP status
root@master1:~# calicoctl get ippool -o wide
NAME CIDR NAT IPIPMODE VXLANMODE DISABLED DISABLEBGPEXPORT SELECTOR
default-ipv4-ippool 10.244.0.0/16 true Never CrossSubnet false false all()
root@master1:~# kubectl get pod -n calico-system
NAM