Metallb一开始是挂在github.com/google下面的,估计是某个员工的个人项目,现在已经挂到了个人名下了。
它的作用就是通过k8s原生的方式提供LB类型的Service支持,开箱即用。
Metallb支持两种工作模式,一种是Layer2模式,另一种是BGP模式。
Metallb在Layer2模式下,会从k8s节点中选一个Leader节点,在这个节点上面响应LB地址段的ARP请求,从而使上层路由把发往LB的流量都发到Leader节点。
缺点也很明显,所有对LB的请求都会发往Leader节点。如果当前Service下面的Pod分布在不同节点,那么这个流量还会从Leader发往相应的节点。
下面这种情况的话就需要路由器支持接收Metallb的BGP广播,从而把请求分布到正确的节点上。跟L2模式的区别就是能够通过BGP协议正确分布流量了,不再需要一个Leader节点。
缺点就是需要上层路由器支持BGP。而且因为BGP单session的限制,如果Calico也是使用的BGP模式,就会有冲突从而导致metallb无法正常工作。
本次使用Layer2 模式来进行部署。
配置 MetalLB 为Layer2 模式
# 创建MetalLB目录
mkdir -p ~/MetalLB-yml && cd ~/MetalLB-yml
# 下载MetalLB安装yml
wget https://raw.githubusercontent.com/metallb/metallb/v0.13.12/config/manifests/metallb-native.yaml
# 部署MetalLB
kubectl apply -f ~/MetalLB-yml/metallb-native.yaml
# 等MetalLB部署完成后,k8s-master 创建ip地址池
cat > ~/MetalLB-yml/iptool.yaml << 'EOF'
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: default
namespace: metallb-system
spec:
addresses:
- 192.168.122.3-192.168.122.255 # 网段跟node节点保持一致
autoAssign: true
---
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: default
namespace: metallb-system
spec:
ipAddressPools:
- default
EOF
# 部署IPAddressPool
kubectl apply -f ~/MetalLB-yml/iptool.yaml
[root@master1 ~/MetalLB-yml]# kubectl get IPAddressPool -n metallb-system
NAME AUTO ASSIGN AVOID BUGGY IPS ADDRESSES
default true false ["192.168.122.3-192.168.122.255"]
评论区