1. 程式人生 > >IoT裝置實踐丨如果你也在樹莓派上部署了k3s,你也許需要這篇文章

IoT裝置實踐丨如果你也在樹莓派上部署了k3s,你也許需要這篇文章

## 前 言 樹莓派是一種廣泛流行的開發板,隨著物聯網的深入發展,樹莓派大有成為IoT終端裝置標準之趨勢。在支援客戶在IoT場景中落地k3s時,k3s在樹莓派上的部署問題也就出現了。本文記錄了一些其中的關鍵問題,轉述成文,方便其他使用者參考。 **硬體裝置:** 樹莓派4 **k3s版本:** v1.17.3+k3s1 **作業系統:** ubuntu-18.04.4-preinstalled-server-arm64+raspi3.img 安裝採用airgap方式部署後,核心問題是k3s無法啟動,並有以下日誌報錯資訊: ![在這裡插入圖片描述](https://img-blog.csdnimg.cn/20200313104155736.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMjA2ODEz,size_16,color_FFFFFF,t_70) 關鍵報錯資訊: ``` level=error msg="Failed to find memory cgroup, you may need to add \"cgroup_memory=1 cgroup_enable=memory\" to your linux cmdline (/boot/cmdline.txt on a Raspberry Pi)" ``` ## 排查記錄 日誌提示很明顯,所以我們修改/boot/cmdline.txt並重啟,但是重啟後發現問題依舊,還是有這個問題。這個修改的本質是新增核心引數,所以我們從作業系統層面檢查: ``` $ cat /proc/cmdline | grep cgroup_memory # nothing return ``` 也就是說,cmdline的修改沒有生效。所以,我們懷疑ubuntu這個映象修改cmdline有其他方式: ``` $ df -hT | grep mmc /dev/mmcblk0p2 ext4 29G 2.8G 26G 10% / /dev/mmcblk0p1 vfat 253M 117M 136M 47% /boot/firmware # 真正的啟動分割槽在/boot/firmware # 閱讀/boot/firmware/README # 排查後得知,應該修改nobtcmd.txt ``` 在/boot/firmware/nobtcmd.txt新增cgroup相關引數後,重啟後可以看到cmdline有了期望的配置: ``` $ cat /proc/cmdline | grep cgroup_memory coherent_pool=1M ………. cgroup_memory=1 cgroup_enable=memory ``` 這時發現k3s依然沒有完成啟動,日誌輸出緩慢,懷疑係統某些因素影響了啟動過程。排查entropy,發現可用值非常低,低到會阻塞程式執行,一般來說<1000程式就會卡住: ``` $ cat /proc/sys/kernel/random/entropy_avail 522 ``` 很多程式的執行都依賴隨機數生成,比如hash、加密解密等過程。申請隨機數就會消耗系統的entropy(熵),當entropy低到一定閾值,程式就執行緩慢,等待隨機數種子。 一般來說kernel可以從硬體執行資訊中收集噪聲來補充entropy,但樹莓派畢竟硬體能力有限,無法從硬體層面快速生成entropy,所以我們安裝軟體提供模擬演算法進行補充: ``` $ apt install haveged $ systemctl enable haveged $ cat /proc/sys/kernel/random/entropy_avail 2366 ``` 一切妥當之後,再檢視k3s啟動狀態,k3s已經完成啟動。 ## 總 結 Linux執行在諸如樹莓派這種簡易硬體架構下,會有很多細微差別,平日在x86 server體系的認知和經驗可能都是不成立,這就導致執行在伺服器Linux上的軟體並不會那麼容易移植到小型終端裝置上。對於樹莓派,除了文中提及的內容,你還需要關注NTP時間同步,MicroSD卡的IO效能