Kubernetes負載均衡器之MetalLB
簡介
在kubernets中,可以使用Loadbalancer的方式對外提供服務,在一般云環境中都有對應的負載均衡的產品。
如果在非云環境中,可以使用MetalLB 是提供kubernetes中LoadBalancer的服務的。
MetalLB無法憑空創建IP地址,因此您必須為其提供可以使用的IP地址池。
MetalLB 為服務分配外部 IP 地址后,需要使群集之外的網絡知道該 IP“位于”群集中。
協議
二層模式 (ARP/NDP):從局域網的角度來看,播報機只是有多個IP地址。
缺點:
- 存在單節點瓶頸:IP會被分配到單個節點上,所以節點的網絡瓶頸會成為負載均衡其的瓶頸。
- 故障故障轉移慢: IP 關聯的 MAC 地址已更改,客戶端ARP表有可能更新不及時,導致故障轉移慢。
BGP模式:在 BGP 模式下,群集中的所有計算機都建立邊界網關協議與您控制的附近路由器的對等會話,并告訴這些路由器如何將流量轉發到服務 IP。使用 BGP 可以跨越多個節點實現真正的負載平衡,并通過 BGP 的策略機制實現細粒度的流量控制。
最大的缺點是基于 BGP 的負載平衡無法對地址后端集中的更改做出優雅反應。這意味著,當群集節點出現故障時,您應該期望與服務的所有活動連接都已斷開。
網絡插件
MetalLB完全支持的網絡插件Canal、Cilium、Flannel、Kube-ovn等。
如果kube-proxy運行在IPVS模式先,需要設置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
二層協議配置
配置分配的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池關聯。
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 協議配置
需要配置 MetalLB 如何與一個或多個外部 BGP 路由器建立會話。
對于具有一個 BGP 路由器和一個 IP 地址范圍的基本配置:
- MetalLB 連接到的路由器 IP 地址。
- 路由器的 AS 編號。
- MetalLB應使用的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
總結
云環境還是直接使用LB產品穩定、省事。如果是測試環境,可以使用MetalLB節約成本。