Kubernetes負(fù)載均衡器之MetalLB
簡(jiǎn)介
在kubernets中,可以使用Loadbalancer的方式對(duì)外提供服務(wù),在一般云環(huán)境中都有對(duì)應(yīng)的負(fù)載均衡的產(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)的角度來看,播報(bào)機(jī)只是有多個(gè)IP地址。
缺點(diǎn):
- 存在單節(jié)點(diǎn)瓶頸:IP會(huì)被分配到單個(gè)節(jié)點(diǎn)上,所以節(jié)點(diǎn)的網(wǎng)絡(luò)瓶頸會(huì)成為負(fù)載均衡其的瓶頸。
- 故障故障轉(zhuǎn)移慢: IP 關(guān)聯(lián)的 MAC 地址已更改,客戶端ARP表有可能更新不及時(shí),導(dǎo)致故障轉(zhuǎn)移慢。
BGP模式:在 BGP 模式下,群集中的所有計(jì)算機(jī)都建立邊界網(wǎng)關(guān)協(xié)議與您控制的附近路由器的對(duì)等會(huì)話,并告訴這些路由器如何將流量轉(zhuǎn)發(fā)到服務(wù) IP。使用 BGP 可以跨越多個(gè)節(jié)點(diǎn)實(shí)現(xiàn)真正的負(fù)載平衡,并通過 BGP 的策略機(jī)制實(shí)現(xiàn)細(xì)粒度的流量控制。
最大的缺點(diǎn)是基于 BGP 的負(fù)載平衡無法對(duì)地址后端集中的更改做出優(yōu)雅反應(yīng)。這意味著,當(dāng)群集節(jié)點(diǎn)出現(xiàn)故障時(shí),您應(yīng)該期望與服務(wù)的所有活動(dòng)連接都已斷開。
網(wǎng)絡(luò)插件
MetalLB完全支持的網(wǎng)絡(luò)插件Canal、Cilium、Flannel、Kube-ovn等。
如果kube-proxy運(yùn)行在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池,默認(rèn)就與所有的IP池關(guān)聯(lián)。
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: example
namespace: metallb-system
也可以手動(dòng)通過指定IP池。
apiVersion: metallb.io/v1beta1
kind: L2Advertisement
metadata:
name: example
namespace: metallb-system
spec:
ipAddressPools:
- first-pool
BGP 協(xié)議配置
需要配置 MetalLB 如何與一個(gè)或多個(gè)外部 BGP 路由器建立會(huì)話。
對(duì)于具有一個(gè) BGP 路由器和一個(gè) IP 地址范圍的基本配置:
- MetalLB 連接到的路由器 IP 地址。
- 路由器的 AS 編號(hào)。
- MetalLB應(yīng)使用的AS編號(hào)。
- 以 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的時(shí)候,修改type: LoadBalancer,保存之后就可以查看分配的IP。
kubectl get svc -A
總結(jié)
云環(huán)境還是直接使用LB產(chǎn)品穩(wěn)定、省事。如果是測(cè)試環(huán)境,可以使用MetalLB節(jié)約成本。