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

前 言

樹莓派是一種廣泛流行的開發板,隨着物聯網的深入發展,樹莓派大有成爲IoT終端設備標準之趨勢。在支持客戶在IoT場景中落地k3s時,k3s在樹莓派上的部署問題也就出現了。本文記錄了一些其中的關鍵問題,轉述成文,方便其他用戶參考。

硬件設備: 樹莓派4

k3s版本: v1.17.3+k3s1

操作系統:

ubuntu-18.04.4-preinstalled-server-arm64+raspi3.img

安裝採用airgap方式部署後,核心問題是k3s無法啓動,並有以下日誌報錯信息:

在這裏插入圖片描述

關鍵報錯信息:

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性能等等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章