樹莓派是一種普遍流行的開發板,隨着物聯網的深刻發展,樹莓派大有成爲IoT終端設備標準之趨勢。在支持客戶在IoT場景中落地k3s時,k3s在樹莓派上的部署問題也就出現了。本文記錄了一些其中的關鍵問題,轉述成文,方便其餘用戶參考。linux
硬件設備: 樹莓派4算法
k3s版本: v1.17.3+k3s1ubuntu
操做系統:服務器
ubuntu-18.04.4-preinstalled-server-arm64+raspi3.img架構
安裝採用airgap方式部署後,核心問題是k3s沒法啓動,並有如下日誌報錯信息:dom
關鍵報錯信息:性能
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性能等等。