MetalLB:為裸機 Kubernetes 集群提供的負載均衡解決方案

內容概述

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 的日誌,以監控其運行情況並及時發現潛在問題。

教學影片

參考連結

返回頂端