最近,我將家庭實(shí)驗(yàn)室的架構(gòu)核心切換為一組樹莓派。
盡管在樹莓派上運(yùn)行的 Kubernetes 發(fā)行版眾多,但在資源受限的設(shè)備上運(yùn)行 Kubernetes 時(shí),控制平面的開銷是一個(gè)常見挑戰(zhàn)。使用 Cloudfleet 等允許遠(yuǎn)程本地節(jié)點(diǎn)的托管 Kubernetes 服務(wù),可以卸載這一責(zé)任。這種方法讓樹莓派能夠?qū)⑵滟Y源專門用于運(yùn)行工作負(fù)載,而不是消耗 CPU 和內(nèi)存來處理控制平面任務(wù)。Cloudfleet 提供了一個(gè)免費(fèi)的集群,最多支持 24 個(gè) CPU,這可以覆蓋我的兩臺樹莓派 5,總共 16 個(gè)核心的設(shè)置。
在我之前的嘗試中,在我的環(huán)境中有效實(shí)現(xiàn) Kubernetes 負(fù)載均衡會面臨一些挑戰(zhàn)。與云平臺不同,云平臺上的負(fù)載均衡是現(xiàn)成的服務(wù),本地部署則需要更多的手動網(wǎng)絡(luò)配置。當(dāng)創(chuàng)建類型為 LoadBalancer 的 Kubernetes 服務(wù)時(shí),需要建立一個(gè)虛擬 IP(VIP)并使其在網(wǎng)絡(luò)上可訪問。雖然像 MetalLB 這樣的項(xiàng)目可以通過讓節(jié)點(diǎn)使用 L2 廣播(例如 ARP 請求)來宣布 VIP,但這種方法通常將 VIP 的可用性限制在任何給定時(shí)間只能由單個(gè)節(jié)點(diǎn)使用,這并不符合我的期望。
L2 廣播的一個(gè)更健壯的替代方案是 BGP(邊界網(wǎng)關(guān)協(xié)議)。使用 BGP,你的 Kubernetes 集群可以直接向路由器廣播 LoadBalancer VIP。這允許路由器將流量分配到為負(fù)載均衡服務(wù)提供服務(wù)的多個(gè)節(jié)點(diǎn)上,提供更好的冗余和可擴(kuò)展性潛力。此外,使用 BGP,你還可以廣播 Pod IP,使你的內(nèi)部 Pod 網(wǎng)絡(luò)在局域網(wǎng)中可用。
我在網(wǎng)絡(luò)中使用的是 UniFi 堆棧,直到最近,UniFi Dream Machine Pro(UDM Pro)還缺乏原生 BGP 支持。然而,這一功能現(xiàn)在已經(jīng)可用,使得基于 BGP 的負(fù)載均衡解決方案成為可能。
在這篇文章中,我將引導(dǎo)你完成如何將樹莓派集成到 Cloudfleet 管理的 Kubernetes 集群中,并配置 UDM Pro 的 BGP 網(wǎng)絡(luò),以實(shí)現(xiàn)無縫的服務(wù)暴露。
設(shè)置 Kubernetes 集群
使用 Cloudfleet 創(chuàng)建 Kubernetes 集群非常簡單。首先,你需要通過訪問 Cloudfleet 控制臺進(jìn)行注冊。
注冊并創(chuàng)建組織后,下一步是創(chuàng)建 Kubernetes 集群。有關(guān)安裝 Cloudfleet CLI 和創(chuàng)建集群的詳細(xì)說明,請參閱官方 Cloudfleet 入門指南。
該指南將引導(dǎo)你完成創(chuàng)建空集群和設(shè)置 Cloudfleet CLI 的必要步驟,你需要使用該 CLI 來添加樹莓派節(jié)點(diǎn)。
創(chuàng)建集群后,你將收到一個(gè) CLUSTER_ID。請保留此 ID,因?yàn)槟阈枰鼇硖砑訕漭晒?jié)點(diǎn)。
將樹莓派節(jié)點(diǎn)添加到 Cloudfleet 集群
將樹莓派集成到 Cloudfleet 集群中涉及為樹莓派準(zhǔn)備正確的操作系統(tǒng),然后使用 Cloudfleet CLI 將它們作為自管理節(jié)點(diǎn)添加。
1.Cloudfleet 要求自管理節(jié)點(diǎn)運(yùn)行 Ubuntu 24.04 LTS。將 Ubuntu 24.04 安裝到樹莓派的 microSD 卡上的最簡單方法是使用官方樹莓派成像器。
2.在你的計(jì)算機(jī)上下載并安裝樹莓派成像器。
3.將 microSD 卡插入計(jì)算機(jī)。
4.打開樹莓派成像器。
5.點(diǎn)擊“CHOOSE DEVICE”(選擇設(shè)備)并選擇你的樹莓派型號(例如樹莓派 5)。
6.點(diǎn)擊“CHOOSE OS”(選擇操作系統(tǒng))。導(dǎo)航到“Other general-purpose OS”(其他通用操作系統(tǒng))->“Ubuntu”。
7.選擇“Ubuntu Server 24.04 LTS (64-bit)”(通常建議為無頭 Kubernetes 節(jié)點(diǎn)使用服務(wù)器版)。
8.點(diǎn)擊“CHOOSE STORAGE”(選擇存儲)并選擇你的 microSD 卡。
9.強(qiáng)烈建議點(diǎn)擊齒輪圖標(biāo)以預(yù)配置設(shè)置,如主機(jī)名、啟用 SSH(并設(shè)置密碼或授權(quán)密鑰)以及設(shè)置用戶帳戶。這簡化了無頭設(shè)置。
10.點(diǎn)擊“NEXT”(下一步),然后點(diǎn)擊“YES”(是)以確認(rèn)并開始寫入鏡像。
11.寫入完成后,將 microSD 卡插入樹莓派,通過以太網(wǎng)將其連接到網(wǎng)絡(luò),并接通電源。確保它有一個(gè) IP 地址,并且 SSH 訪問正常。
操作系統(tǒng)準(zhǔn)備好后,在你的機(jī)器上(已安裝 Cloudfleet CLI 并已登錄),對要添加到集群的每個(gè)樹莓派執(zhí)行以下命令:
cloudfleet clusters add-self-managed-node CLUSTER_ID--hostRPI_IP--ssh-usernameSSH_USERNAME--regionmy-home--zonemy-home
將 CLUSTER_ID 替換為你在上一節(jié)中創(chuàng)建的集群的 ID。
將 RPI_IP 替換為樹莓派在你本地網(wǎng)絡(luò)上的 IP 地址。
將 SSH_USERNAME 替換為你為樹莓派上的 SSH 訪問配置的用戶名。
--region my-home 和 --zone my-home 標(biāo)志將為你的節(jié)點(diǎn)分配這些標(biāo)簽。這些標(biāo)簽是任意的,但對于組織節(jié)點(diǎn)很有用,并且可以在 Kubernetes 配置中使用,如我們稍后的 BGP 設(shè)置。
然后,Cloudfleet CLI 將通過 SSH 連接到你的樹莓派,安裝必要的軟件,并將其加入到你的托管 Kubernetes 集群中。一段時(shí)間后,樹莓派應(yīng)顯示為 Cloudfleet 儀表板和通過 kubectl get nodes(在配置 kubectl 指向你的 Cloudfleet 集群后,你可以通過點(diǎn)擊 Cloudfleet 控制臺上的“Connect to cluster”(連接到集群)按鈕了解如何操作)中的就緒節(jié)點(diǎn)。
部署第一個(gè)工作負(fù)載
在進(jìn)行 BGP 設(shè)置并查看 LoadBalancer 服務(wù)的實(shí)際效果之前,為了測試我們的新集群,讓我們部署一個(gè)簡單的 Nginx 應(yīng)用程序。
創(chuàng)建一個(gè)名為 nginx-deployment.yaml 的文件,內(nèi)容如下:
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
將此部署應(yīng)用到你的集群:
kubectlapply -f nginx-deployment.yaml
一段時(shí)間后,Kubernetes 將創(chuàng)建部署和服務(wù)。
你可以檢查服務(wù)的狀態(tài):
kubectlgetsvc nginx-service
查找 EXTERNAL-IP 字段。它將保持 PENDING 狀態(tài),因?yàn)闆]有負(fù)載均衡功能會接收此服務(wù)并為其創(chuàng)建 VIP。這是我們將在下一節(jié)中解決的問題。
為本地負(fù)載均衡設(shè)置 BGP
Cloudfleet 使用 Cilium 作為其 CNI(容器網(wǎng)絡(luò)接口),它提供了 BGP 廣播功能。有關(guān) Cloudfleet 網(wǎng)絡(luò)架構(gòu)的更多詳細(xì)信息,請參閱此處。
https://cloudfleet.ai/docs/networking/architecture/
有關(guān)使用 BGP 進(jìn)行本地負(fù)載均衡的指南,請參閱此處。
https://cloudfleet.ai/docs/networking/on-premises-load-balancing-with-bgp/
1. Cilium BGP 配置
首先,我們需要為集群配置 BGP。這涉及創(chuàng)建幾個(gè) Kubernetes 自定義資源:
a) CiliumLoadBalancerIPPool:這定義了 Cilium 可以分配給 LoadBalancer 服務(wù)的 IP 地址池。這些 IP 應(yīng)該是 UDM Pro 可路由的子網(wǎng)的一部分,并專門用于此目的。
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 中任何現(xiàn)有網(wǎng)絡(luò)的一部分,你應(yīng)該創(chuàng)建一個(gè)覆蓋此 CIDR 的網(wǎng)絡(luò)。否則,UDM PRO 將不會將流量路由到這些 IP。
b) CiliumBGPAdvertisement:此資源指定 Cilium 應(yīng)通過 BGP 廣播哪些路由,例如分配給 LoadBalancer 服務(wù)的 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,我還在向內(nèi)部網(wǎng)絡(luò)廣播 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 代理(節(jié)點(diǎn))上建立 BGP 實(shí)例。它定義了 Kubernetes 集群的本地 ASN 和 BGP 對等細(xì)節(jié)(你的 UDM Pro)。請注意,nodeSelector 現(xiàn)在與添加節(jié)點(diǎn)時(shí)指定的區(qū)域和區(qū)域匹配。
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 文件應(yīng)用到你的 Kubernetes 集群(kubectl apply -f .yaml)。然后,Cilium 的 BGP 組件將嘗試與指定的對等(172.16.10.1)建立 BGP 會話。不要忘記為你的設(shè)置修改 UDM Pro 的 IP 地址!
2. UDM Pro BGP 配置
接下來,必須在你的 UDM Pro 上配置 BGP。UniFi OS 包含 FRRouting 以實(shí)現(xiàn)此類功能。他們的官方指南可以在此處找到。
我使用的 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 關(guān)鍵設(shè)置:
router bgp 65000:設(shè)置 UDM Pro 的 ASN。這應(yīng)與 Cilium 的 localASN(65001)不同,以便進(jìn)行 BGP 對等。
bgp router-id 172.16.10.1:UDM Pro 的路由器 ID,通常是其 LAN IP。
neighbor peer-group cilium:每個(gè)可能運(yùn)行 Cilium BGP 發(fā)言人的樹莓派節(jié)點(diǎn)都被定義為對等。這些應(yīng)該是你添加到 Cloudfleet 集群的樹莓派的 IP。
neighbor cilium remote-as 65001:通知 UDM Pro 這些對等屬于 ASN 65001。
neighbor cilium next-hop-self:確保 UDM Pro 廣告自身為從 Cilium 學(xué)習(xí)到的路由的下一跳。
route-map ALLOW-ALL:一個(gè)基本的路由圖,允許來自/去往 Cilium 對等的所有路由。如果需要,可以對其進(jìn)行細(xì)化以進(jìn)行更具體的過濾。
在應(yīng)用 UDM Pro 和 Cilium BGP 配置后,BGP 會話應(yīng)建立。你可以通過 SSH 登錄到 UDM Pro(例如,在 vtysh 中使用 show ip bgp summary)和使用 Cilium CLI 命令(例如,cilium bgp peers)在 Kubernetes 節(jié)點(diǎn)上檢查 BGP 對等狀態(tài)。
一旦所有設(shè)置都正確完成,現(xiàn)在你可以再次檢查 Load Balancer 服務(wù),你會發(fā)現(xiàn)現(xiàn)在為其分配了一個(gè) VIP。如果你在本地網(wǎng)絡(luò)上導(dǎo)航到此 IP,你將訪問到你剛剛部署的 NGINX。
如果 NGINX Pod 分布在兩個(gè)不同的節(jié)點(diǎn)上,UDM PRO 將在它們之間進(jìn)行負(fù)載均衡。如果只有一個(gè)節(jié)點(diǎn)提供 Pod 服務(wù),則流量將僅流向該節(jié)點(diǎn)。
結(jié)果:高效的家庭實(shí)驗(yàn)室設(shè)置
通過此配置:
我的樹莓派運(yùn)行 Kubernetes 工作負(fù)載,控制平面管理由 Cloudfleet 外部處理。
當(dāng)在 Kubernetes 中創(chuàng)建 LoadBalancer 服務(wù)時(shí),Cilium 會從 172.16.199.x 范圍內(nèi)為其分配一個(gè) IP。
Cilium 通過 BGP 將此 IP(以及可選的 Pod CIDR)廣播給我的 UDM Pro。
UDM Pro 學(xué)習(xí)如何將 172.16.199.x 的流量路由到適當(dāng)?shù)臉漭晒?jié)點(diǎn)。
服務(wù)可以從我的局域網(wǎng)無縫訪問。
你還可以設(shè)置 UDM PRO 的端口轉(zhuǎn)發(fā)功能,將外部流量路由到此 VIP,以簡單地開始從你的家庭實(shí)驗(yàn)室提供網(wǎng)站服務(wù)。祝實(shí)驗(yàn)愉快!
原文地址:
https://itnext.io/kubernetes-on-raspberry-pi-and-bgp-load-balancing-with-unifi-dream-machine-pro-d5b94b6cfe99
-
BGP
+關(guān)注
關(guān)注
0文章
88瀏覽量
16105 -
樹莓派
+關(guān)注
關(guān)注
122文章
2078瀏覽量
110457 -
kubernetes
+關(guān)注
關(guān)注
0文章
263瀏覽量
9494
發(fā)布評論請先 登錄
路由器負(fù)載均衡怎么配置
動態(tài)BGP與靜態(tài)BGP的區(qū)別?
樹莓派5還是香橙派5 Pro?兩款熱門開發(fā)板的詳細(xì)對比
樹莓派安裝Haproxy實(shí)現(xiàn)***負(fù)載均衡
樹莓派部署LabVIEW程序并開機(jī)自啟
Kubernetes Ingress 高可靠部署最佳實(shí)踐
qt源碼庫在樹莓派中的部署方法
通過樹莓派的GPIO進(jìn)行串口通訊
通過命令行訪問樹莓派3系統(tǒng)_通過VNC訪問樹莓派3系統(tǒng)
樹莓派是什么樹莓派的簡單介紹
Kubernetes負(fù)載均衡器MetalLB介紹
樹莓派小技巧:無需鍵盤或顯示器,如何通過WiFi設(shè)置樹莓派?
如何使用樹莓派與OpenCV實(shí)現(xiàn)面部和運(yùn)動追蹤的云臺系統(tǒng)?
樹莓派部署 Kubernetes:通過 UDM Pro 實(shí)現(xiàn) BGP 負(fù)載均衡!
評論