內容概述
MetalLB 是專為裸機(Bare Metal)Kubernetes 集群設計的網路負載均衡器,透過標準路由協議實現服務的高可用性和可擴展性。
在缺乏雲端供應商提供的負載均衡服務時,MetalLB 為使用者提供了一個有效的替代方案。
應用場景
在公有雲平台(如 GCP、AWS、Azure)上,Kubernetes 通常利用雲供應商的負載均衡服務來實現 Service 的 LoadBalancer 類型。
然而,在裸機環境或不支援此類服務的私有雲中,這種方法不可行。
MetalLB 旨在填補這一空白,使裸機 Kubernetes 集群也能夠輕鬆地創建 LoadBalancer 類型的 Service。
技術特點
- 地址分配:MetalLB 從預先配置的 IP 位址池中為每個 LoadBalancer Service 分配一個外部 IP。
- 對外公告:透過 Layer2(ARP/NDP)或 BGP 協議,將服務的 IP 位址公告給外部網路。
- 操作模式:
- Layer2 模式:使用 ARP(IPv4)或 NDP(IPv6)協議,將服務 IP 宣告給本地網路。
- BGP 模式:與鄰近路由器建立 BGP 對等會話,宣告服務 IP,實現多節點負載均衡和精細的流量控制。
其他整合
MetalLB 可以與多種 Kubernetes 網路插件(如 Flannel、Calico、Cilium 等)協同工作,提供靈活的網路配置選項。
在使用 BGP 模式時,可能需要確保網路基礎設施支援 BGP 協議。
安裝步驟
以下是使用 Kubernetes 清單(manifests)安裝 MetalLB 的步驟:
準備工作:
1. 確保 Kubernetes 版本為 1.13.0 或更高,且尚未配置其他網路負載均衡器。
- 為 MetalLB 提供一組可用的 IPv4 位址。
- 如果使用 kube-proxy 的 IPVS 模式,需啟用嚴格 ARP 模式。
2. 安裝 MetalLB:
kubectl apply -f https://raw.githubusercontent.com/metallb/metallb/v0.14.9/config/manifests/metallb-native.yaml
namespace/metallb-system created
customresourcedefinition.apiextensions.k8s.io/bfdprofiles.metallb.io created
customresourcedefinition.apiextensions.k8s.io/bgpadvertisements.metallb.io created
customresourcedefinition.apiextensions.k8s.io/bgppeers.metallb.io created
customresourcedefinition.apiextensions.k8s.io/communities.metallb.io created
customresourcedefinition.apiextensions.k8s.io/ipaddresspools.metallb.io created
customresourcedefinition.apiextensions.k8s.io/l2advertisements.metallb.io created
customresourcedefinition.apiextensions.k8s.io/servicel2statuses.metallb.io created
serviceaccount/controller created
serviceaccount/speaker created
role.rbac.authorization.k8s.io/controller created
role.rbac.authorization.k8s.io/pod-lister created
clusterrole.rbac.authorization.k8s.io/metallb-system:controller created
clusterrole.rbac.authorization.k8s.io/metallb-system:speaker created
rolebinding.rbac.authorization.k8s.io/controller created
rolebinding.rbac.authorization.k8s.io/pod-lister created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:controller created
clusterrolebinding.rbac.authorization.k8s.io/metallb-system:speaker created
configmap/metallb-excludel2 created
secret/metallb-webhook-cert created
service/metallb-webhook-service created
deployment.apps/controller created
daemonset.apps/speaker created
validatingwebhookconfiguration.admissionregistration.k8s.io/metallb-webhook-configuration created
3. 確認目前叢集worker所使用的IP網段範圍(以KIND Cluster為例):
docker network inspect -f ‘{{.IPAM.Config}}’ kind
[{172.18.0.0/16 172.18.0.1 map[]} {fc00:f853:ccd:e793::/64 fc00:f853:ccd:e793::1 map[]}]
4. 配置位址池: 創建一個 ConfigMap,定義 MetalLB 可用的 IP 位址範圍:
apiVersion: v1
kind: ConfigMap
metadata:
namespace: metallb-system
name: config
data:
config: |
address-pools:
- name: default
protocol: layer2
addresses:
- 172.18.0.1-172.18.0.250
將上述配置保存為 metallb-config.yaml
,然後執行:
kubectl apply -f metallb-config.yaml
存取和操作
安裝並配置 MetalLB 後,您可以像在雲環境中一樣,創建 LoadBalancer 類型的 Service。
MetalLB 會自動分配外部 IP,並將其公告給網路,使服務可供外部訪問。
小技巧
- 在 Layer2 模式下,確保所有節點之間的 TCP 和 UDP 7946 端口是互通的。
- 在 BGP 模式下,確保網路基礎設施支援 BGP,並正確配置路由策略。
- 定期檢查 MetalLB 的日誌,以監控其運行情況並及時發現潛在問題。