點(diǎn)K3s集群搭建實(shí)戰(zhàn)指南)
去年夏天我接了個(gè)需求要在本地搭一套四節(jié)點(diǎn)的樹莓派集群用來跑K8s學(xué)習(xí)和邊緣側(cè)的定時(shí)任務(wù)。剛開始很自然就想到買四塊樹莓派4B疊起來電源、網(wǎng)線、散熱片、亞克力支架全算上桌面基本沒法看了四根網(wǎng)線從交換機(jī)拖出來每個(gè)節(jié)點(diǎn)還得配一個(gè)官方電源適配器插線板上密密麻麻全是充電頭。后來發(fā)現(xiàn)市面上有基于Compute Module 4的四槽集群板一塊PCB解決供電、網(wǎng)絡(luò)和固定起售價(jià)80美元左右一下子把布線復(fù)雜度打下來了。這篇文章就圍繞這塊板子從硬件架構(gòu)、CM4選型、系統(tǒng)燒錄到集群初始化把從裸板到四節(jié)點(diǎn)K3s跑通的全過程記錄下來也把過程中踩過的坑一并說清楚。如果你也在糾結(jié)要不要用集群板替代樹莓派4B堆疊或者已經(jīng)入手了類似的CM4集群板但不知道怎么開始這篇文章基本就是一份完整的上手指南涵蓋硬件、系統(tǒng)、網(wǎng)絡(luò)和常見排障。1. 為什么搞四槽集群板而不是堆四塊樹莓派4B1.1 傳統(tǒng)堆疊方案的真實(shí)痛點(diǎn)用四塊樹莓派4B組集群聽起來簡單實(shí)際上從物理層面就有一堆麻煩。首先是供電每塊4B需要獨(dú)立的5V/3A電源四塊板子就是四個(gè)充電頭還要確保墻插面板有足夠的插座一旦某個(gè)電源質(zhì)量不過關(guān)重負(fù)載下電壓跌落節(jié)點(diǎn)隨機(jī)重啟就是家常便飯。其次是網(wǎng)絡(luò)四根網(wǎng)線從交換機(jī)到每個(gè)派想理清楚哪根線對應(yīng)哪個(gè)節(jié)點(diǎn)得貼標(biāo)簽時(shí)間一長標(biāo)簽脫落排查鏈路問題非常痛苦。然后是散熱樹莓派4B在CPU持續(xù)負(fù)載下SoC溫度輕松超過80攝氏度疊層支架如果風(fēng)道設(shè)計(jì)不好上層板子吸下層熱風(fēng)溫度更難壓。這些問題單獨(dú)看都能忍受但湊在一起就非常難受。最關(guān)鍵的是樹莓派4B本身是一臺(tái)完整的小電腦HDMI、USB、音頻等接口在集群場景里幾乎用不上這些接口卻占用了大量PCB面積導(dǎo)致四塊板子堆疊起來體積很夸張。集群板方案不同它把計(jì)算模塊直接插在一張大底板上整塊板子統(tǒng)一供電、統(tǒng)一走線、統(tǒng)一散熱所有IO通過板載接口引出密度和整潔度完全是另一個(gè)級別。1.2 集群板方案的核心思路所謂四槽Raspberry Pi集群板本質(zhì)上是為樹莓派Compute Module設(shè)計(jì)的主板板上沒有CPU、內(nèi)存和存儲(chǔ)只提供電源、網(wǎng)絡(luò)、M.2插槽、GPIO引出等周邊電路。你需要自己買四塊Compute Module插上去再配一個(gè)12V電源適配器插一根上行網(wǎng)線到主路由器四個(gè)節(jié)點(diǎn)就都通電入網(wǎng)了。這個(gè)思路和服務(wù)器主板的邏輯一模一樣CPU、內(nèi)存條是獨(dú)立模塊主板負(fù)責(zé)供電和互連。Cluster Board把這種模塊化思路帶到了樹莓派生態(tài)里。它解決的不僅是整潔問題更重要的是運(yùn)維體驗(yàn)——四個(gè)節(jié)點(diǎn)共享一個(gè)電源入口、一個(gè)上行網(wǎng)絡(luò)口重啟時(shí)不用蹲在插線板面前挨個(gè)拔插頭直接斷電整板重啟或者通過板載管理功能獨(dú)立控制每個(gè)節(jié)點(diǎn)的通斷。80美元的價(jià)格指的是裸板價(jià)格不含CM4模塊、電源、M.2 SSD這一點(diǎn)要提前有數(shù)。但和四塊樹莓派4B加四個(gè)電源加一個(gè)五口交換機(jī)的方案比集群板方案在成本上并不吃虧尤其在散熱風(fēng)扇、亞克力支架這些配件上省了不少錢桌面空間更是省出了一大塊。1.3 這套方案適合誰我不是說每個(gè)人都應(yīng)該用集群板。普通玩家手里如果已經(jīng)有兩三塊樹莓派4B拿來跑點(diǎn)輕量服務(wù)完全沒必要換。但如果你有明確的多節(jié)點(diǎn)需求比如學(xué)K8s、跑Ceph實(shí)驗(yàn)、搭分布式爬蟲、在家部署一套小型CI/CD集群集群板能把很多體力活省掉。還有一類人非常適合經(jīng)常做硬件測試的嵌入式工程師。CM4模組在量產(chǎn)項(xiàng)目里非常常見做固件、驅(qū)動(dòng)、散熱用例時(shí)一塊四槽集群板加上不同內(nèi)存/存儲(chǔ)容量的CM4混合插調(diào)試效率比單槽載板高很多一個(gè)節(jié)點(diǎn)刷掛了大不了重插。2. 80美元基板背后的硬件架構(gòu)這錢到底花在哪2.1 四槽位板子的核心組成部分市面上這類四槽CM4集群板雖然品牌不同但硬件架構(gòu)大同小異。核心部件有這幾個(gè)四個(gè)CM4板對板連接器插槽用于插Compute Module 4電源輸入電路通常是一個(gè)12V DC接口加DC-DC降壓電路板載千兆交換機(jī)芯片負(fù)責(zé)四個(gè)節(jié)點(diǎn)與上行口的二層轉(zhuǎn)發(fā)每組節(jié)點(diǎn)一個(gè)M.2 M-Key插槽通常支持Gen3 x1 NVMe SSD40Pin GPIO引出排針方便接線調(diào)試每節(jié)點(diǎn)電源LED、狀態(tài)LED和一個(gè)復(fù)位按鍵供電是這類板子最需要重視的部分。CM4滿載時(shí)單顆功耗大概在5到7瓦四顆滿載就是20到28瓦考慮到M.2 SSD和交換芯片的功耗整板峰值功耗接近35到40瓦。用12V輸入的好處是電流只有3A左右對DC接口和線材的負(fù)擔(dān)比5V方案小很多。板上各節(jié)點(diǎn)使用獨(dú)立的DC-DC降壓電路把12V轉(zhuǎn)為5V供CM4使用各節(jié)點(diǎn)之間電源基本隔離。網(wǎng)絡(luò)部分板載交換芯片讓四個(gè)節(jié)點(diǎn)的千兆MAC非常方便地匯聚成一個(gè)上行口。我在用的時(shí)候把上行口接到主交換機(jī)整組四個(gè)節(jié)點(diǎn)在局域網(wǎng)里就像一個(gè)小型接入層設(shè)備不再需要外置交換機(jī)和四根長網(wǎng)線。需要注意的是一些廉價(jià)板子可能用百兆交換芯片買的時(shí)候一定認(rèn)準(zhǔn)千兆。2.2 為什么用CM4而不是樹莓派4B樹莓派Compute Module 4和樹莓派4B用的是同一顆BCM2711 SoC計(jì)算性能沒有差別。區(qū)別在于CM4是一顆模塊化的核心板尺寸大概只有一張名片大小55mm x 40mm沒有網(wǎng)口、USB、HDMI這類周邊接口只通過底部的金手指把GPIO、PCIe、HDMI、USB等信號全部引出。對集群板而言CM4這個(gè)形態(tài)有兩個(gè)巨大優(yōu)勢。第一是體積密度四塊CM4加上底座整體占用的空間大概只有兩塊樹莓派4B疊起來那么大相同面積內(nèi)計(jì)算核心數(shù)量翻倍。第二是靈活性同一塊集群板可以隨時(shí)更換不同配置的CM4比如四個(gè)節(jié)點(diǎn)用2GB版本跑K3s另外一個(gè)節(jié)點(diǎn)單獨(dú)插一塊8GB的版本作為管理節(jié)點(diǎn)這種混合配置在整機(jī)樹莓派方案里非常難實(shí)現(xiàn)。很多人問CM4的GPIO引腳圖和樹莓派4B是否一致。答案是基本一致的CM4底部的金手指同樣引出了40Pin GPIO包括I2C、SPI、UART、PWM等復(fù)用功能電氣電平同樣是3.3V。但要注意集群板上這些GPIO通常通過排針引出引出的順序在某些板子上可能不是標(biāo)準(zhǔn)的40Pin排針排列務(wù)必參考你板子的說明書和原理圖別默認(rèn)拿樹莓派4B的引腳定義去直接接線這一點(diǎn)后面會(huì)細(xì)說。2.3 完整成本拆解80美元只是開始標(biāo)題里Starts at $80很有迷惑性很多人以為80美元就能拿到四節(jié)點(diǎn)集群實(shí)際上這只是底板價(jià)格。我按當(dāng)時(shí)市場行情做了一個(gè)成本清單方便你評估總預(yù)算部件參考價(jià)格說明四槽集群板約80美元裸板含電源配件的話另算CM4 2GB Lite x4約120-160美元按單顆30-40美元估算實(shí)際波動(dòng)大M.2 NVMe SSD 256GB x4約80-120美元可選不上SSD可用SD卡或eMMC12V 5A電源適配器約15-25美元大廠品牌略貴但更穩(wěn)散熱套件散熱片風(fēng)扇約10-20美元強(qiáng)烈建議買合計(jì)約305-405美元不含TF卡和雜項(xiàng)對比樹莓派4B 4GB版本單價(jià)按60美元算四塊就是240美元加上四個(gè)電源、一個(gè)五口交換機(jī)、支架和風(fēng)扇總成本接近300美元。兩者在硬件總價(jià)上其實(shí)能打個(gè)平手集群板方案勝在結(jié)構(gòu)緊湊、運(yùn)維方便樹莓派4B方案勝在單板可以獨(dú)立拿出來單獨(dú)用比如偶爾拔一塊出去做點(diǎn)別的實(shí)驗(yàn)。具體怎么選看你更看重哪種使用方式。3. Compute Module 4怎么選內(nèi)存、eMMC、WiFi、GPIO引腳一個(gè)都不能錯(cuò)3.1 內(nèi)存版本選多大合適CM4有1GB、2GB、4GB、8GB四個(gè)內(nèi)存版本。做集群節(jié)點(diǎn)我建議至少2GB起步。如果跑K3s控制平面加工作節(jié)點(diǎn)如果都在這四顆里跑2GB節(jié)點(diǎn)勉強(qiáng)能跑但很緊張4GB會(huì)更從容單節(jié)點(diǎn)上可以多部署幾個(gè)Pod。如果只是跑Docker Swarm或者普通容器2GB就夠用了。我自己的方案是四顆全部用2GB Lite版加NVMe SSD跑K3s時(shí)把主節(jié)點(diǎn)和工作節(jié)點(diǎn)都在四節(jié)點(diǎn)上鋪開。實(shí)測跑起來內(nèi)存基本在70%到80%部署一些輕量服務(wù)問題不大但如果要跑Ceph或者構(gòu)建大型Java項(xiàng)目內(nèi)存就會(huì)吃緊。3.2 eMMC版本和Lite版本怎么判斷CM4有帶eMMC和不帶eMMC兩種不帶eMMC的版本叫Lite版。Lite版沒有板載存儲(chǔ)必須從SD卡、NVMe或網(wǎng)絡(luò)啟動(dòng)帶eMMC版本則可以直接把系統(tǒng)寫進(jìn)eMMC里。給集群選型時(shí)我強(qiáng)烈建議優(yōu)先考慮Lite版加M.2 NVMe。原因很簡單系統(tǒng)跑在NVMe上IO性能遠(yuǎn)超eMMC軟件包安裝、容器拉取、日志寫入都明顯更快。還有一個(gè)非?,F(xiàn)實(shí)的原因eMMC版燒錄系統(tǒng)比SD卡/NVMe麻煩需要在Windows/Linux上用rpiboot工具把CM4切換到USB mass storage模式對新手不太友好。Lite版在集群板上只要插一張TF卡或者從M.2 NVMe上的系統(tǒng)引導(dǎo)省心很多。3.3 帶不帶WiFi的版本怎么選CM4分無線版和無無線版。我在集群場景里堅(jiān)決選無WiFi版。原因有幾個(gè)一是集群節(jié)點(diǎn)之間通信主要走有線網(wǎng)絡(luò)WiFi接口完全用不上二是無WiFi版的板載天線區(qū)域會(huì)空出來信號電路不存在理論功耗略低三是WiFi模塊在密集電磁環(huán)境下偶爾會(huì)爭搶天線資源干擾有線通信雖小但沒必要冒這個(gè)風(fēng)險(xiǎn)。當(dāng)然如果某個(gè)節(jié)點(diǎn)需要臨時(shí)脫離集群網(wǎng)絡(luò)自己接入WiFi熱點(diǎn)那么帶無線版本就方便了。不過這種情況完全可以靠一塊USB無線網(wǎng)卡臨時(shí)解決沒必要為了這個(gè)場景給四顆CM4都上無線版。3.4 GPIO引腳圖才是最容易翻車的地方前面提到CM4的金手指引腳定義和樹莓派4B的40Pin排針是兼容的但這里有幾個(gè)實(shí)戰(zhàn)中特別容易踩的坑。CM4的GPIO不是像4B那樣從PCB頂部的排針引出而是從底部的板對板連接器上通過金手指引出的。在集群板上廠商會(huì)把GPIO信號接到板載排針但排針的物理排列順序不一定按樹莓派的40Pin標(biāo)準(zhǔn)走。有的板子做成兩排20Pin有的做成兩個(gè)單獨(dú)的接頭。我吃過一次虧拿到板子后默認(rèn)按樹莓派標(biāo)準(zhǔn)40Pin布局接了一個(gè)I2C溫濕度傳感器結(jié)果SCL和SDA完全反了排查半天發(fā)現(xiàn)板子上GPIO排針第二腳并不是5V而是被設(shè)計(jì)成I2C的SDA。從那以后任何集群板到手我第一步永遠(yuǎn)是去官網(wǎng)下載原理圖和管腳定義表拿萬用表測一下排針電壓再?zèng)Q定接線方式。GPIO的電氣特性也要注意CM4的GPIO是3.3V邏輯電平不是5V。如果接5V電平的外設(shè)必須加電平轉(zhuǎn)換模塊不然大概率燒壞GPIO引腳。板上如果同時(shí)有多個(gè)節(jié)點(diǎn)的GPIO排針還要確認(rèn)所有節(jié)點(diǎn)是否共地不共地的話I2C/UART通信會(huì)出現(xiàn)隨機(jī)數(shù)據(jù)錯(cuò)誤。4. 組裝與上電從裸板到四節(jié)點(diǎn)就緒的完整流程4.1 安裝CM4和散熱片第一步把四顆CM4從防靜電袋取出來先裝散熱片。CM4的SoC在PCB正面居中位置附帶的小散熱片用導(dǎo)熱硅膠或卡扣固定即可。我一般會(huì)額外加一個(gè)微型風(fēng)扇對著整板吹只用散熱片的話連續(xù)高負(fù)載還是會(huì)熱到降頻。裝散熱片之后再插CM4到插槽上插之前先觀察金手指邊緣的定位缺口和板載插槽的凸臺(tái)方向?qū)?zhǔn)后輕輕推到底然后壓下兩側(cè)的壓桿或卡扣。Tinker的時(shí)候千萬別用蠻力CM4的板對板連接器觸點(diǎn)很密歪著硬插很容易把金手指或插槽針腳弄壞。裝好之后可以順手檢查每顆CM4是否安裝到位看插槽卡扣是否完全固定。接著裝M.2 NVMe SSD。打開集群板背面的M.2固定螺絲把SSD斜著插入卡槽壓下后用螺絲固定。注意M.2插槽上的固定柱可能有多個(gè)孔位對應(yīng)不同長度的SSD裝之前比一下長度別固定錯(cuò)孔位把SSD壓彎。4.2 連接電源和上行網(wǎng)口集群板的電源接口通常是5.5mm DC接口部分板子也帶USB-C PD接口。用配套的12V電源適配器接上AC端DC端插入板子即可。第一次上電之前強(qiáng)烈建議先用萬用表確認(rèn)DC接口輸出電壓極性中心正極、外圈負(fù)極是常見標(biāo)準(zhǔn)但個(gè)別板子可能不同。上行網(wǎng)口也就是Uplink口接到家里的主路由器或交換機(jī)上。此時(shí)理想情況下四個(gè)節(jié)點(diǎn)的網(wǎng)卡會(huì)各自從路由器的DHCP拿到一個(gè)IP地址。但上電前你大概率還沒給系統(tǒng)裝boot介質(zhì)所以CM4現(xiàn)在還沒有系統(tǒng)自然不會(huì)有IP。這個(gè)階段的目的只是確認(rèn)電源系統(tǒng)正常按一下每節(jié)點(diǎn)附近的復(fù)位鍵能看到對應(yīng)的電源LED亮起。等所有LED正常亮起再把M.2 SSD如果已經(jīng)裝好插好準(zhǔn)備進(jìn)入刷系統(tǒng)環(huán)節(jié)。如果這個(gè)階段就發(fā)現(xiàn)某個(gè)節(jié)點(diǎn)LED不亮檢查CM4是否插到位、散熱片有沒有頂?shù)讲宀垡约半娫催m配器是否給力。4.3 第一次上電觀察供電和溫度上電后如果裝了系統(tǒng)可以登錄任意一個(gè)節(jié)點(diǎn)查看整板供電是否穩(wěn)定。有幾點(diǎn)值得記錄用cat /sys/class/thermal/thermal_zone0/temp查看CPU溫度剛上電待機(jī)應(yīng)該在40到50攝氏度用vcgencmd measure_volts core查看核心電壓是否穩(wěn)定同時(shí)用dmesg | grep -i error看看有沒有硬件相關(guān)報(bào)錯(cuò)。如果整板四個(gè)節(jié)點(diǎn)同時(shí)高負(fù)載供電紋波偏大會(huì)導(dǎo)致個(gè)別節(jié)點(diǎn)隨機(jī)重啟。我遇到過一次當(dāng)時(shí)換了個(gè)便宜電源適配器標(biāo)稱12V/3A實(shí)際四個(gè)節(jié)點(diǎn)跑編譯任務(wù)時(shí)一個(gè)節(jié)點(diǎn)反復(fù)重啟換回12V/5A的電源后問題消失。供電問題非常隱蔽排查時(shí)建議直接換一個(gè)大功率電源測試別一開始就懷疑系統(tǒng)配置。5. 四節(jié)點(diǎn)集群的軟件初始化燒錄、網(wǎng)絡(luò)規(guī)劃、SSH免密與Ansible批量配置5.1 系統(tǒng)鏡像選擇與燒錄方式CM4能跑的系統(tǒng)很多做集群我推薦Raspberry Pi OS Lite 64位、Ubuntu Server for ARM、DietPi這三個(gè)。Raspberry Pi OS Lite最省心官方維護(hù)好Ubuntu Server對現(xiàn)代容器工具鏈更友好DietPi自帶不少優(yōu)化腳本適合小內(nèi)存節(jié)點(diǎn)。Lite版CM4如果走TF卡用樹莓派官方Imager直接燒錄鏡像到TF卡非常省事。如果走M(jìn).2 NVMe比較復(fù)雜因?yàn)锽ootROM默認(rèn)不會(huì)從PCIe NVMe啟動(dòng)需要先把系統(tǒng)寫到TF卡啟動(dòng)然后更新bootloader的BOOT_ORDER或者使用rpiboot工具通過USB連接CM4配置啟動(dòng)順序。說實(shí)話每次給M.2寫系統(tǒng)都比較折騰我習(xí)慣是先在TF卡上燒好系統(tǒng)啟動(dòng)后把系統(tǒng)完整復(fù)制到NVMe或者直接用rpi-eeprom-update讓bootloader支持NVMe啟動(dòng)。5.2 四節(jié)點(diǎn)網(wǎng)絡(luò)規(guī)劃別靠路由器DHCP硬分四個(gè)節(jié)點(diǎn)啟動(dòng)后默認(rèn)都從路由器DHCP拿IPIP地址的分配順序取決于誰先啟動(dòng)非常不固定。做集群必須固定IP兩種常用方式在路由器后臺(tái)給四個(gè)MAC地址綁定固定IP或者在系統(tǒng)里配置靜態(tài)IP。個(gè)人推薦直接在系統(tǒng)層配靜態(tài)IP這樣換網(wǎng)絡(luò)環(huán)境也不會(huì)失效。規(guī)劃一個(gè)簡單的內(nèi)網(wǎng)網(wǎng)段比如管理網(wǎng)絡(luò)用192.168.10.0/24節(jié)點(diǎn)1管理地址192.168.10.11節(jié)點(diǎn)2管理地址192.168.10.12節(jié)點(diǎn)3管理地址192.168.10.13節(jié)點(diǎn)4管理地址192.168.10.14集群上行口網(wǎng)關(guān)192.168.10.1配置方式編輯/etc/dhcpcd.conf加入interface eth0 static ip_address192.168.10.11/24 static routers192.168.10.1 static domain_name_servers192.168.10.1改完重啟網(wǎng)絡(luò)或直接重啟節(jié)點(diǎn)等四個(gè)節(jié)點(diǎn)都通了再繼續(xù)。5.3 開通SSH并配置免密登錄每一張燒錄好的TF卡第一次啟動(dòng)前在boot分區(qū)創(chuàng)建空白ssh文件就能開啟SSH。首次登錄用pi用戶默認(rèn)密碼是raspberry但強(qiáng)烈建議登錄后馬上執(zhí)行passwd改密碼。四個(gè)節(jié)點(diǎn)一個(gè)一個(gè)做太累我的做法是先在節(jié)點(diǎn)1上生成密鑰對ssh-keygen -t ed25519然后把公鑰復(fù)制到其他節(jié)點(diǎn)ssh-copy-id pi192.168.10.12。做完之后本地主機(jī)也可以把公鑰依次拷貝到四個(gè)節(jié)點(diǎn)之后管理節(jié)點(diǎn)、節(jié)點(diǎn)之間互通全部免密。注意ssh-copy-id第一次會(huì)提示輸入密碼后面就全自動(dòng)了。5.4 用Ansible把四節(jié)點(diǎn)配置成統(tǒng)一狀態(tài)四節(jié)點(diǎn)的系統(tǒng)配置如果一個(gè)個(gè)手動(dòng)改配置漂移是早晚的事。所以我在四節(jié)點(diǎn)基礎(chǔ)裝完系統(tǒng)后立刻用Ansible做統(tǒng)一初始化包括修改hostname、更新軟件源、安裝常用工具、關(guān)閉閃爍無關(guān)的服務(wù)等。寫一個(gè)簡單的inventory文件hosts.ini[cluster] node1 ansible_host192.168.10.11 node2 ansible_host192.168.10.12 node3 ansible_host192.168.10.13 node4 ansible_host192.168.10.14 [cluster:vars] ansible_userpi ansible_becomeyes再寫個(gè)最小化的playbookinit.yml- hosts: cluster tasks: - name: 更新軟件源 apt: update_cache: yes - name: 安裝常用工具 apt: name: - git - htop - vim - curl - ca-certificates state: present - name: 關(guān)閉無用的藍(lán)牙服務(wù)可選 systemd: name: bluetooth state: stopped enabled: no執(zhí)行ansible-playbook -i hosts.ini init.yml四個(gè)節(jié)點(diǎn)一次性完成初始化整個(gè)過程比手動(dòng)操作省至少半小時(shí)。后續(xù)要給所有節(jié)點(diǎn)裝Docker、裝K3s的agent也都是Playbook的事。6. 四節(jié)點(diǎn)集群能跑什么K3s、Ceph、監(jiān)控與HomeLab服務(wù)的實(shí)測6.1 用K3s把四節(jié)點(diǎn)變成迷你Kubernetes集群四節(jié)點(diǎn)ARM集群最常跑的負(fù)載就是Kubernetes。樹莓派上直接裝傳統(tǒng)K8s非常臃腫內(nèi)存占用大K3s是Rancher推出的輕量版K8s把etcd替換成內(nèi)嵌的SQLite或嵌入式etcd默認(rèn)用containerd運(yùn)行時(shí)特別適合樹莓派。安裝K3s很簡單在第一個(gè)節(jié)點(diǎn)我先定為192.168.10.11curl -sfL https://get.k3s.io | sh -安裝完成后在服務(wù)端節(jié)點(diǎn)查看tokensudo cat /var/lib/rancher/k3s/server/node-token然后在剩下三個(gè)節(jié)點(diǎn)上執(zhí)行curl -sfL https://get.k3s.io | K3S_URLhttps://192.168.10.11:6443 K3S_TOKEN你的token sh -大約一分鐘后在管理節(jié)點(diǎn)執(zhí)行kubectl get nodes能看到四個(gè)節(jié)點(diǎn)全部Ready。實(shí)測在2GB內(nèi)存的CM4節(jié)點(diǎn)上K3s的kube-system相關(guān)Pod占內(nèi)存約300MB到400MB2GB內(nèi)存還能剩1GB多給業(yè)務(wù)容器跑但如果要在同一節(jié)點(diǎn)跑Ceph或大型數(shù)據(jù)庫還是會(huì)緊張。一個(gè)小建議K3s服務(wù)端默認(rèn)的Pod數(shù)限制和Service數(shù)限制在集群板上可以適當(dāng)調(diào)低/etc/rancher/k3s/config.yaml里加上max-pods: 50避免資源競賽。6.2 千萬別對Ceph抱太大期望除非你只是想學(xué)習(xí)樹莓派集群跑Ceph是很多人的執(zhí)念我也試過。結(jié)論是能跑但性能非常有限。CM4的NVMe是通過PCIe Gen3 x1連接到SoC的單盤持續(xù)讀寫能跑到500MB/s上下看起來還行。但Ceph的副本寫入會(huì)同時(shí)寫多個(gè)節(jié)點(diǎn)多副本疊加后網(wǎng)絡(luò)變成瓶頸千兆網(wǎng)的限制大約125MB/s所以性能遠(yuǎn)不如單機(jī)磁盤。加上內(nèi)存只有2GBOSD進(jìn)程、Mon進(jìn)程、MGR進(jìn)程一擁而上很容易OOM。如果只是想學(xué)Ceph的部署思路、CRUSH map原理、故障域設(shè)計(jì)四節(jié)點(diǎn)集群完全夠用建議每個(gè)節(jié)點(diǎn)只跑一個(gè)OSDpool的size設(shè)為2min_size設(shè)為1至少不會(huì)讓所有節(jié)點(diǎn)都忙起來。如果對性能有實(shí)際要求樹莓派集群確實(shí)不合適直接用一臺(tái)二手x86服務(wù)器加幾塊大容量HDD更靠譜。6.3 監(jiān)控全家桶Prometheus Grafana集群跑起來之后監(jiān)控是必需品。四節(jié)點(diǎn)CM4資源本就緊張監(jiān)控全家桶也要輕量化。我在管理節(jié)點(diǎn)上部署了Prometheus四個(gè)節(jié)點(diǎn)都裝了node_exporter。安裝方式很簡單下載ARM64版本的二進(jìn)制包wget https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-arm64.tar.gz tar xvf node_exporter-1.7.0.linux-arm64.tar.gz sudo mv node_exporter-1.7.0.linux-arm64/node_exporter /usr/local/bin/配置systemd服務(wù)讓node_exporter開機(jī)自啟然后在Prometheus配置里把四個(gè)節(jié)點(diǎn)的9100端口作為target加入。Grafana同樣裝ARM64版開一個(gè)Dashboard模板就能看到CPU、內(nèi)存、磁盤、網(wǎng)絡(luò)、溫度等實(shí)時(shí)數(shù)據(jù)。實(shí)測Prometheus本機(jī)內(nèi)存占用約200MBGrafana約150MB在2GB節(jié)點(diǎn)上屬于可接受范圍但盡量讓Grafana和Prometheus跑在同一個(gè)節(jié)點(diǎn)最好不要和業(yè)務(wù)容器搶太多內(nèi)存。6.4 更接地氣的Homelab玩法如果你的K3s還沒完全玩轉(zhuǎn)或者根本不需要K8s四個(gè)樹莓派節(jié)點(diǎn)還有一堆更接地氣的玩法Pi-hole在其中一個(gè)節(jié)點(diǎn)部署Pi-hole做全網(wǎng)DNS過濾廣告攔截效果立竿見影Nginx反向代理四個(gè)節(jié)點(diǎn)分別部署Web服務(wù)用Nginx做負(fù)載均衡或反向代理模擬一個(gè)微型網(wǎng)關(guān)Uptime Kuma監(jiān)控家里其他服務(wù)NAS、路由器、各類Web應(yīng)用的在線狀態(tài)Alert通知到TelegramGitea輕量Git服務(wù)代碼倉庫放在集群里比單一樹莓派多一份冗余分布式爬蟲Scrapy或Playwright多節(jié)點(diǎn)并行抓取四個(gè)節(jié)點(diǎn)的并發(fā)能力比單機(jī)強(qiáng)很多7. 實(shí)測中的關(guān)鍵排障與避坑記錄7.1 供電不足導(dǎo)致節(jié)點(diǎn)反復(fù)重啟我最初用的是某個(gè)第三方12V/3A電源適配器待機(jī)時(shí)一切正常四顆CM4同時(shí)跑apt upgrade并且四個(gè)編譯任務(wù)并行時(shí)節(jié)點(diǎn)一個(gè)接一個(gè)重啟重災(zāi)區(qū)是離電源接口最遠(yuǎn)的那個(gè)槽位。查了半天確認(rèn)不是CPU過熱、不是SSD故障最終懷疑是供電不足。換成12V/5A的明緯工業(yè)電源后問題徹底消失。原因很直觀CM4在跑編譯任務(wù)時(shí)瞬時(shí)功耗能沖到5W以上四顆加SSD一起瞬態(tài)電流可能超過3A而廉價(jià)適配器的電壓調(diào)整率太差帶載后電壓跌落幅度大。集群板上的DC-DC降壓電路雖然有穩(wěn)壓能力但輸入電壓跌落太多輸出自然穩(wěn)不住。給集群板配電源建議直接選12V/5A及以上、紋波小的品牌電源不要省這幾十塊錢。如果板子支持也可以考慮PD誘騙頭配合大功率PD充電器。判斷供電是否正常可以在高負(fù)載時(shí)用萬用表測DC接口電壓如果低于11.5V就說明電源太弱。7.2 散熱沒做好四顆SoC集體降頻CM4的SoC和樹莓派4B一樣超過85攝氏度會(huì)觸發(fā)降頻。四顆CM4密集分布在一塊板上散熱空間有限單純靠散熱片無風(fēng)扇高負(fù)載下SoC溫度穩(wěn)定在85度以上直接降頻到900MHz性能打折非常明顯。我最終的散熱方案是每顆CM4貼一塊帶小風(fēng)扇的散熱器整板上方再加一個(gè)低速大風(fēng)量風(fēng)扇讓空氣從一側(cè)進(jìn)、另一側(cè)出形成貫穿式風(fēng)道。改造后高負(fù)載時(shí)機(jī)箱內(nèi)溫度大概45度SoC溫度能壓在65度左右性能明顯穩(wěn)定。如果你不想上風(fēng)扇至少要保證機(jī)箱通風(fēng)孔足夠大否則長時(shí)間跑容器任務(wù)等待你的就是頻繁降頻。7.3 eMMC和NVMe的啟動(dòng)順序坑Lite版CM4配合NVMe SSD啟動(dòng)時(shí)最常踩的坑是BOOT_ORDER默認(rèn)不包含PCIe。第一次插上帶系統(tǒng)的NVMe開機(jī)后毫無反應(yīng)顯示器黑屏如果有接HDMI日志也沒有。原因在于新版bootloader雖然支持NVMe啟動(dòng)但需要把BOOT_ORDER里加一個(gè)2代表PCIe。方法是在一個(gè)能啟動(dòng)的Linux環(huán)境里運(yùn)行sudo rpi-eeprom-config --edit把BOOT_ORDER改成類似0xf26這樣的值或者使用raspi-config的更新引導(dǎo)器選項(xiàng)然后重啟。改完保存后NVMe就能作為啟動(dòng)設(shè)備了。不過要注意不同的eMMC版本和bootloader版本默認(rèn)值不一樣還是得看當(dāng)前配置別盲改。7.4 GPIO排針方向和電平問題前面提過GPIO排針排列不一定和樹莓派4B一致這里再補(bǔ)充一個(gè)常見坑板子上的GPIO排針可能沒有絲印標(biāo)注引腳序號或者標(biāo)注得很小。拿到板子先用萬用表測排針的5V和3.3V引腳位置確定第1腳方向。如果你外接傳感器出現(xiàn)讀數(shù)全零或者漂移大概率是SDA/SCL接反了或者共地沒做好。另外做GPIO實(shí)驗(yàn)時(shí)建議先用簡單的LED點(diǎn)燈驗(yàn)證引腳編號別直接接高價(jià)值外設(shè)。我習(xí)慣用BCM編號寫代碼比如GPIO17對應(yīng)排針第11腳標(biāo)準(zhǔn)40Pin定義但在集群板上需要先對照原理圖確認(rèn)這個(gè)物理位置是否真的連到了CM4的GPIO17。8. 個(gè)人體會(huì)和后續(xù)擴(kuò)展方向這套四槽集群板加四顆CM4的組合我跑了快半年最大的感受就是樹莓派集群的性能天花板其實(shí)不高它最大的價(jià)值是給了你一個(gè)低成本、高密度、貼近真實(shí)服務(wù)器拓?fù)涞膶?shí)驗(yàn)環(huán)境。K3s的調(diào)度邏輯、Prometheus的采集體系、Ansible的批量管理這些在普通單板機(jī)上也能學(xué)但只有多節(jié)點(diǎn)環(huán)境下才能體會(huì)到節(jié)點(diǎn)故障、網(wǎng)絡(luò)分區(qū)、資源調(diào)度這些概念到底是怎么回事。如果后續(xù)想繼續(xù)擴(kuò)展我會(huì)考慮這幾個(gè)方向加一塊USB轉(zhuǎn)串口模塊把四節(jié)點(diǎn)的serial console接出來方便內(nèi)核層面調(diào)試用Power over EthernetPoEHAT替代DC供電進(jìn)一步簡化布線搭一個(gè)基于K3s的GitOps流水線用Flux或Argo CD自動(dòng)同步Git倉庫里的應(yīng)用配置把其中兩個(gè)節(jié)點(diǎn)遷移到Ubuntu Server測試跨操作系統(tǒng)集群的兼容性最后再分享一個(gè)實(shí)際運(yùn)維中的小技巧因?yàn)樗膫€(gè)節(jié)點(diǎn)經(jīng)常要同時(shí)執(zhí)行同樣的命令我在本機(jī)配置了~/.ssh/config把node1到node4分別加上Host別名再寫了一個(gè)簡單的cl函數(shù)直接cl hostname就能在所有節(jié)點(diǎn)上并行執(zhí)行命令省去了循環(huán)SSH的麻煩。具體就是一段不足十行的shell函數(shù)配合pssh或者Ansible的ad-hoc命令日常管理和巡檢效率提升非常明顯。