最近,我將家庭實驗室的架構核心切換為一組樹莓派。
盡管在樹莓派上運行的 Kubernetes 發行版眾多,但在資源受限的設備上運行 Kubernetes 時,控制平面的開銷是一個常見挑戰。使用 Cloudfleet 等允許遠程本地節點的托管 Kubernetes 服務,可以卸載這一責任。這種方法讓樹莓派能夠將其資源專門用于運行工作負載,而不是消耗 CPU 和內存來處理控制平面任務。Cloudfleet 提供了一個免費的集群,最多支持 24 個 CPU,這可以覆蓋我的兩臺樹莓派 5,總共 16 個核心的設置。
在我之前的嘗試中,在我的環境中有效實現 Kubernetes 負載均衡會面臨一些挑戰。與云平臺不同,云平臺上的負載均衡是現成的服務,本地部署則需要更多的手動網絡配置。當創建類型為 LoadBalancer 的 Kubernetes 服務時,需要建立一個虛擬 IP(VIP)并使其在網絡上可訪問。雖然像 MetalLB 這樣的項目可以通過讓節點使用 L2 廣播(例如 ARP 請求)來宣布 VIP,但這種方法通常將 VIP 的可用性限制在任何給定時間只能由單個節點使用,這并不符合我的期望。
L2 廣播的一個更健壯的替代方案是 BGP(邊界網關協議)。使用 BGP,你的 Kubernetes 集群可以直接向路由器廣播 LoadBalancer VIP。這允許路由器將流量分配到為負載均衡服務提供服務的多個節點上,提供更好的冗余和可擴展性潛力。此外,使用 BGP,你還可以廣播 Pod IP,使你的內部 Pod 網絡在局域網中可用。
我在網絡中使用的是 UniFi 堆棧,直到最近,UniFi Dream Machine Pro(UDM Pro)還缺乏原生 BGP 支持。然而,這一功能現在已經可用,使得基于 BGP 的負載均衡解決方案成為可能。
在這篇文章中,我將引導你完成如何將樹莓派集成到 Cloudfleet 管理的 Kubernetes 集群中,并配置 UDM Pro 的 BGP 網絡,以實現無縫的服務暴露。
設置 Kubernetes 集群
使用 Cloudfleet 創建 Kubernetes 集群非常簡單。首先,你需要通過訪問 Cloudfleet 控制臺進行注冊。
注冊并創建組織后,下一步是創建 Kubernetes 集群。有關安裝 Cloudfleet CLI 和創建集群的詳細說明,請參閱官方 Cloudfleet 入門指南。
該指南將引導你完成創建空集群和設置 Cloudfleet CLI 的必要步驟,你需要使用該 CLI 來添加樹莓派節點。
創建集群后,你將收到一個 CLUSTER_ID。請保留此 ID,因為你需要它來添加樹莓派節點。
將樹莓派節點添加到 Cloudfleet 集群
將樹莓派集成到 Cloudfleet 集群中涉及為樹莓派準備正確的操作系統,然后使用 Cloudfleet CLI 將它們作為自管理節點添加。
1.Cloudfleet 要求自管理節點運行 Ubuntu 24.04 LTS。將 Ubuntu 24.04 安裝到樹莓派的 microSD 卡上的最簡單方法是使用官方樹莓派成像器。
2.在你的計算機上下載并安裝樹莓派成像器。
3.將 microSD 卡插入計算機。
4.打開樹莓派成像器。
5.點擊“CHOOSE DEVICE”(選擇設備)并選擇你的樹莓派型號(例如樹莓派 5)。
6.點擊“CHOOSE OS”(選擇操作系統)。導航到“Other general-purpose OS”(其他通用操作系統)->“Ubuntu”。
7.選擇“Ubuntu Server 24.04 LTS (64-bit)”(通常建議為無頭 Kubernetes 節點使用服務器版)。
8.點擊“CHOOSE STORAGE”(選擇存儲)并選擇你的 microSD 卡。
9.強烈建議點擊齒輪圖標以預配置設置,如主機名、啟用 SSH(并設置密碼或授權密鑰)以及設置用戶帳戶。這簡化了無頭設置。
10.點擊“NEXT”(下一步),然后點擊“YES”(是)以確認并開始寫入鏡像。
11.寫入完成后,將 microSD 卡插入樹莓派,通過以太網將其連接到網絡,并接通電源。確保它有一個 IP 地址,并且 SSH 訪問正常。
操作系統準備好后,在你的機器上(已安裝 Cloudfleet CLI 并已登錄),對要添加到集群的每個樹莓派執行以下命令:
cloudfleet clusters add-self-managed-node CLUSTER_ID--hostRPI_IP--ssh-usernameSSH_USERNAME--regionmy-home--zonemy-home
將 CLUSTER_ID 替換為你在上一節中創建的集群的 ID。
將 RPI_IP 替換為樹莓派在你本地網絡上的 IP 地址。
將 SSH_USERNAME 替換為你為樹莓派上的 SSH 訪問配置的用戶名。
--region my-home 和 --zone my-home 標志將為你的節點分配這些標簽。這些標簽是任意的,但對于組織節點很有用,并且可以在 Kubernetes 配置中使用,如我們稍后的 BGP 設置。
然后,Cloudfleet CLI 將通過 SSH 連接到你的樹莓派,安裝必要的軟件,并將其加入到你的托管 Kubernetes 集群中。一段時間后,樹莓派應顯示為 Cloudfleet 儀表板和通過 kubectl get nodes(在配置 kubectl 指向你的 Cloudfleet 集群后,你可以通過點擊 Cloudfleet 控制臺上的“Connect to cluster”(連接到集群)按鈕了解如何操作)中的就緒節點。
部署第一個工作負載
在進行 BGP 設置并查看 LoadBalancer 服務的實際效果之前,為了測試我們的新集群,讓我們部署一個簡單的 Nginx 應用程序。
創建一個名為 nginx-deployment.yaml 的文件,內容如下:
apiVersion: apps/v1kind: Deploymentmetadata: name: nginx-deployment labels: app: nginxspec: replicas: 2# Running two replicas for demonstration selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - name: nginx image: nginx:latest# Using the latest Nginx image ports: - containerPort: 80---apiVersion: v1kind: Servicemetadata: name: nginx-servicespec: selector: app: nginx ports: - protocol: TCP port: 80 # Port accessible on the LoadBalancer IP targetPort: 80# Port on the Nginx pods type: LoadBalancer# This is key for BGP to pick it up
將此部署應用到你的集群:
kubectlapply -f nginx-deployment.yaml
一段時間后,Kubernetes 將創建部署和服務。
你可以檢查服務的狀態:
kubectlgetsvc nginx-service
查找 EXTERNAL-IP 字段。它將保持 PENDING 狀態,因為沒有負載均衡功能會接收此服務并為其創建 VIP。這是我們將在下一節中解決的問題。
為本地負載均衡設置 BGP
Cloudfleet 使用 Cilium 作為其 CNI(容器網絡接口),它提供了 BGP 廣播功能。有關 Cloudfleet 網絡架構的更多詳細信息,請參閱此處。
https://cloudfleet.ai/docs/networking/architecture/
有關使用 BGP 進行本地負載均衡的指南,請參閱此處。
https://cloudfleet.ai/docs/networking/on-premises-load-balancing-with-bgp/
1. Cilium BGP 配置
首先,我們需要為集群配置 BGP。這涉及創建幾個 Kubernetes 自定義資源:
a) CiliumLoadBalancerIPPool:這定義了 Cilium 可以分配給 LoadBalancer 服務的 IP 地址池。這些 IP 應該是 UDM Pro 可路由的子網的一部分,并專門用于此目的。
apiVersion: "cilium.io/v2alpha1"kind: CiliumLoadBalancerIPPoolmetadata: name:"pool"spec: blocks: - start: 172.16.199.2# Ensure this range is available on your network and reserved for K8s stop: 172.16.199.254
如果你要廣播的 CIDR 不是 UDM PRO 中任何現有網絡的一部分,你應該創建一個覆蓋此 CIDR 的網絡。否則,UDM PRO 將不會將流量路由到這些 IP。
b) CiliumBGPAdvertisement:此資源指定 Cilium 應通過 BGP 廣播哪些路由,例如分配給 LoadBalancer 服務的 IP 和 Pod CIDR。
apiVersion: "cilium.io/v2alpha1"kind: CiliumBGPAdvertisementmetadata: name: services labels: advertise: bgp# This label is used to select this advertisementspec: advertisements: - advertisementType: PodCIDR - advertisementType: Service service: addresses: - LoadBalancerIP selector: # This selector aims to advertise all LoadBalancer services. # It matches services having any label by checking for a key not matching 'never-used-value'. matchExpressions: - { key: somekey, operator: NotIn, values: [ 'never-used-value' ] }
通過添加 PodCIDR,我還在向內部網絡廣播 Pod IP,但這完全是可選的。
c) CiliumBGPPeerConfig:這定義了常見的 BGP 對等配置。
apiVersion: cilium.io/v2alpha1kind: CiliumBGPPeerConfigmetadata: name: unifi# Named 'unifi' as it peers with the UDM Prospec: gracefulRestart:# Enabling graceful restart for smoother updates enabled: true restartTimeSeconds: 15 families: - afi: ipv4 safi: unicast advertisements: matchLabels:# Selects the 'services' CiliumBGPAdvertisement via its label advertise:"bgp"
d) CiliumBGPClusterConfig:此主要配置在 Cilium 代理(節點)上建立 BGP 實例。它定義了 Kubernetes 集群的本地 ASN 和 BGP 對等細節(你的 UDM Pro)。請注意,nodeSelector 現在與添加節點時指定的區域和區域匹配。
apiVersion: cilium.io/v2alpha1kind: CiliumBGPClusterConfigmetadata: name: unifispec: nodeSelector:# Ensures this BGP config applies to the specified RPi nodes matchLabels: topology.kubernetes.io/region: my-home topology.kubernetes.io/zone: my-home bgpInstances: - name:"cloudfleet-bgp"# Name of this BGP instance localASN: 65001# ASN for the K8s cluster's BGP peers: - name: unifi# Name of the peer (UDM Pro) peerASN: 65000# ASN of the UDM Pro peerAddress:"172.16.10.1"# IP address of your UDM Pro on the relevant LAN peerConfigRef: name: unifi# References the CiliumBGPPeerConfig defined above
將這些 YAML 文件應用到你的 Kubernetes 集群(kubectl apply -f .yaml)。然后,Cilium 的 BGP 組件將嘗試與指定的對等(172.16.10.1)建立 BGP 會話。不要忘記為你的設置修改 UDM Pro 的 IP 地址!
2. UDM Pro BGP 配置
接下來,必須在你的 UDM Pro 上配置 BGP。UniFi OS 包含 FRRouting 以實現此類功能。他們的官方指南可以在此處找到。
我使用的 FRRouting 配置如下。你在 UDM PRO 的 Web 界面上上傳此文件。
! -*- bgp -*-!hostname $UDMP_HOSTNAMEpassword zebrafrr defaults traditionallog file stdout!router bgp65000 # UDM Pro's ASN (must match peerASN in CiliumBGPClusterConfig)bgp ebgp-requires-policy# Standard practice for eBGPbgp router-id172.16.10.1# UDM Pro's BGP router ID (its LAN IP)maximum-paths2# Optional: allow multiple paths!neighbor cilium peer-group# Using a peer-group for organizationneighbor cilium remote-as65001# ASN of the Cilium BGP (must match localASN in CiliumBGPClusterConfig)neighbor cilium activateneighbor cilium soft-reconfiguration inbound# Allows policy changes without session reset!! Define Raspberry Pi node IPsasBGP neighbors! These are the nodes running the Cilium BGP speakerneighbor172.16.10.241peer-group cilium# IP of RPi 1neighbor172.16.10.242peer-group cilium# IP of RPi 2!address-family ipv4 unicast redistribute connected# Optional: Advertise UDM Pro's connected routes neighbor cilium activate neighbor cilium route-mapALLOW-ALLin# Apply route-map to permit routes neighbor cilium route-mapALLOW-ALL out neighbor ciliumnext-hop-self# Important: UDM advertises itself as the next hopexit-address-family!route-mapALLOW-ALL permit10# A simple route-map permitting all routes!line vty!
UDM Pro BGP 關鍵設置:
router bgp 65000:設置 UDM Pro 的 ASN。這應與 Cilium 的 localASN(65001)不同,以便進行 BGP 對等。
bgp router-id 172.16.10.1:UDM Pro 的路由器 ID,通常是其 LAN IP。
neighbor peer-group cilium:每個可能運行 Cilium BGP 發言人的樹莓派節點都被定義為對等。這些應該是你添加到 Cloudfleet 集群的樹莓派的 IP。
neighbor cilium remote-as 65001:通知 UDM Pro 這些對等屬于 ASN 65001。
neighbor cilium next-hop-self:確保 UDM Pro 廣告自身為從 Cilium 學習到的路由的下一跳。
route-map ALLOW-ALL:一個基本的路由圖,允許來自/去往 Cilium 對等的所有路由。如果需要,可以對其進行細化以進行更具體的過濾。
在應用 UDM Pro 和 Cilium BGP 配置后,BGP 會話應建立。你可以通過 SSH 登錄到 UDM Pro(例如,在 vtysh 中使用 show ip bgp summary)和使用 Cilium CLI 命令(例如,cilium bgp peers)在 Kubernetes 節點上檢查 BGP 對等狀態。
一旦所有設置都正確完成,現在你可以再次檢查 Load Balancer 服務,你會發現現在為其分配了一個 VIP。如果你在本地網絡上導航到此 IP,你將訪問到你剛剛部署的 NGINX。
如果 NGINX Pod 分布在兩個不同的節點上,UDM PRO 將在它們之間進行負載均衡。如果只有一個節點提供 Pod 服務,則流量將僅流向該節點。
結果:高效的家庭實驗室設置
通過此配置:
我的樹莓派運行 Kubernetes 工作負載,控制平面管理由 Cloudfleet 外部處理。
當在 Kubernetes 中創建 LoadBalancer 服務時,Cilium 會從 172.16.199.x 范圍內為其分配一個 IP。
Cilium 通過 BGP 將此 IP(以及可選的 Pod CIDR)廣播給我的 UDM Pro。
UDM Pro 學習如何將 172.16.199.x 的流量路由到適當的樹莓派節點。
服務可以從我的局域網無縫訪問。
你還可以設置 UDM PRO 的端口轉發功能,將外部流量路由到此 VIP,以簡單地開始從你的家庭實驗室提供網站服務。祝實驗愉快!
原文地址:
https://itnext.io/kubernetes-on-raspberry-pi-and-bgp-load-balancing-with-unifi-dream-machine-pro-d5b94b6cfe99
-
BGP
+關注
關注
0文章
87瀏覽量
15632 -
樹莓派
+關注
關注
121文章
1973瀏覽量
107170 -
kubernetes
+關注
關注
0文章
243瀏覽量
9014
發布評論請先 登錄
動態BGP與靜態BGP的區別?
樹莓派安裝Haproxy實現***負載均衡
樹莓派部署LabVIEW程序并開機自啟
Kubernetes Ingress 高可靠部署最佳實踐
qt源碼庫在樹莓派中的部署方法
通過命令行訪問樹莓派3系統_通過VNC訪問樹莓派3系統
Kubernetes負載均衡器MetalLB介紹

評論