Kubernetes負載均衡器之MetalLB
簡介
在kubernets中,可以使用Loadbalancer的方式對外提供服務(wù),在一般云環(huán)境中都有對應(yīng)的負載均衡的產(chǎn)品。
如果在非云環(huán)境中,可以使用MetalLB 是提供kubernetes中LoadBalancer的服務(wù)的。
MetalLB無法憑空創(chuàng)建IP地址,因此您必須為其提供可以使用的IP地址池。
MetalLB 為服務(wù)分配外部 IP 地址后,需要使群集之外的網(wǎng)絡(luò)知道該 IP“位于”群集中。
協(xié)議
二層模式 (ARP/NDP):從局域網(wǎng)的角度來看,播報機只是有多個IP地址。
缺點:
- 存在單節(jié)點瓶頸:IP會被分配到單個節(jié)點上,所以節(jié)點的網(wǎng)絡(luò)瓶頸會成為負載均衡其的瓶頸。
- 故障故障轉(zhuǎn)移慢: IP 關(guān)聯(lián)的 MAC 地址已更改,客戶端ARP表有可能更新不及時,導(dǎo)致故障轉(zhuǎn)移慢。
BGP模式:在 BGP 模式下,群集中的所有計算機都建立邊界網(wǎng)關(guān)協(xié)議與您控制的附近路由器的對等會話,并告訴這些路由器如何將流量轉(zhuǎn)發(fā)到服務(wù) IP。使用 BGP 可以跨越多個節(jié)點實現(xiàn)真正的負載平衡,并通過 BGP 的策略機制實現(xiàn)細粒度的流量控制。
最大的缺點是基于 BGP 的負載平衡無法對地址后端集中的更改做出優(yōu)雅反應(yīng)。這意味著,當群集節(jié)點出現(xiàn)故障時,您應(yīng)該期望與服務(wù)的所有活動連接都已斷開。
網(wǎng)絡(luò)插件
MetalLB完全支持的網(wǎng)絡(luò)插件Canal、Cilium、Flannel、Kube-ovn等。
如果kube-proxy運行在IPVS模式先,需要設(shè)置strictARP: true。
kubectl edit configmap -n kube-system kube-proxy
apiVersion: kubeproxy.config.k8s.io/v1alpha1
kind: KubeProxyConfiguration
mode: "ipvs"
ipvs:
strictARP: true
安裝
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.13.3/config/manifests/metallb-native.yaml
或者通過helm安裝。
helm repo add metallb https://metallb.github.io/metallb
helm install metallb metallb/metallb
二層協(xié)議配置
配置分配的IP池。
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: first-pool
namespace: metallb-system
spec:
addresses:
- 192.168.128./24
- 192.168.122.200-192.168.122.240
- fca0:fe53:0ccd:e799::/124
如果在L2Advertisement無指定IP池,默認就與所有的IP池關(guān)聯(lián)。
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: example
namespace: metallb-system
也可以手動通過指定IP池。
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: example
namespace: metallb-system
spec:
ipAddressPools:
- first-pool
BGP 協(xié)議配置
需要配置 MetalLB 如何與一個或多個外部 BGP 路由器建立會話。
對于具有一個 BGP 路由器和一個 IP 地址范圍的基本配置:
- MetalLB 連接到的路由器 IP 地址。
- 路由器的 AS 編號。
- MetalLB應(yīng)使用的AS編號。
- 以 CIDR 前綴表示的 IP 地址范圍。
apiVersion: metallb.io/v1beta2
kind: BGPPeer
metadata:
name: sample
namespace: metallb-system
spec:
myASN: 64500
peerASN: 64501
peerAddress: 10.0.0.1
---
apiVersion: metallb.io/v1beta1
kind: IPAddressPool
metadata:
name: first-pool
namespace: metallb-system
spec:
addresses:
- 192.168.1.240-192.168.1.250
---
apiVersion: metallb.io/v1beta1
kind: BGPAdvertisement
metadata:
name: example
namespace: metallb-system
spec:
ipAddressPools:
- first-pool
使用
在配置service的時候,修改type: LoadBalancer,保存之后就可以查看分配的IP。
kubectl get svc -A
總結(jié)
云環(huán)境還是直接使用LB產(chǎn)品穩(wěn)定、省事。如果是測試環(huán)境,可以使用MetalLB節(jié)約成本。