metalLB
大约 1 分钟
MetalLB 是一个负载均衡器,专门解决裸金属 Kubernetes 集群中无法使用 LoadBalancer 类型服务的痛点。有了MetaLB,
metallb:为k8s集群的service提供LoadBalancer类型的支持
前置准备
- Kubernetes v1.13.0 或者更新的版本
- CNI兼容自查
- 这里使用MetaLB的 layer 2模式,需要至少两个连续的IP作为地址池使用
- L2 模式下需要各个节点间 7946 端口联通
- BGP 略
修改 kube proxy
修改 kube-proxy 配置文件,启用严格的 ARP。如果 kube-proxy 使用的是 ipvs 模式
kubectl edit configmap -n kube-system kube-proxy
ipvs:
excludeCIDRs: null
minSyncPeriod: 0s
scheduler: ""
strictARP: true #false改为true
syncPeriod: 0s
tcpFinTimeout: 0s
tcpTimeout: 0s
udpTimeout: 0s
kind: KubeProxyConfiguration
metricsBindAddress: ""
mode: "ipvs" # 配置为 ipvs
安装
在线安装
helm repo add metallb https://metallb.github.io/metallb
helm install metallb metallb/metallb --version 0.13.12
离线安装
helm pull metallb/metallb --version 0.13.12
tar -zxvf metallb-0.13.12.tgz
helm upgrade --install metallb . -f values.yaml -n kube-system --create-namespace
地址池配置
Layer2 模式进行配置,需要创建一个 IPAddressPool 资源对象,用来指定用于分配的 IP 池,这部分一定要在 DHCP 服务器上做 IP 资源的保留,避免IP冲突,引发异常
cat <<EOF > pool.yaml
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: ip-pool
namespace: metallb-system
spec:
addresses:
- 192.168.2.149-192.168.2.150 #分配给LB的IP池
EOF
广播
广播声明,可以关联上面的 IP 池对象,这样会使用关联的 IP 池地址。为了通告来自 IPAddressPool 的 IP,L2Advertisement 实例必须关联到 IPAddressPool。
cat <<EOF > advertise.yaml
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: l2adver
namespace: metallb-system
spec:
ipAddressPools:
- ip-pool
EOF
kubectl apply -f pool.yaml
kubectl apply -f advertise.yaml