最新資訊
科技新聞

雲端整合專家,提供全方位雲端顧問服務

科技趨勢

換電腦也能秒速部署 Kubernetes!教你如何在樹莓派 4 運行輕量 MicroK8s 並建立叢集

隨著K8s受歡迎的程度與日俱增, 越來越多人開始使用K8s並且安裝他們的服務在K8s之上. K8s可以說是越來越無所不在, 我們看看K8s可以在哪些地方運行呢?

  • 公有雲: 在公有雲上有很多可以選擇的K8s服務, 例如: AWS EKS, GCP GKE, Azure AKS等等, 很方便基本上幾行指令就可以完成安裝並可以開始使用它.

  • 自建機房: 自建機房也有很多k8s的版本可以使用, 可以選擇VMWare Tanzu, Suse Rancher, IBM Openshift等等.

  • 本地端: 這邊指的是開發者的電腦, 可能是Mac, Linux, 甚至是Windows, 可以選擇的k8s也很多. 例如: minikube, microk8s, kind, k3s, k3d等等.

  • IoT及邊緣計算: 這個算是筆者比較少碰到的, 不過K8s在這個領域也有發行版本, 輕量化的K8s. 例如:k3s 跟 microk8s.

今天我們就來試試看Canonical(發行Ubuntu的公司)製作的其中一種K8s版本. 眼尖的用戶應該馬上就認出它了, 對!就是MicroK8s, 它算是非常輕量也低維運的一種K8s, 它可以單機執行也可以加入多個節點, 具備高可用性的特點, 跟k3s 十分相似卻略有不同, k3s在ARM架構的機器上, 有特別優化並且可以跑在32bits的環境之上, 對於一些環境上有限制的部署, K3s更具備部署的優勢, 之後, 我們也會另外寫一篇來好好介紹K3s.

安裝ubuntu microk8s 在樹莓派4板子上筆者的環境是

  • ubuntu server 22.04
  • 1 台 master
  • 2 台 worker nodes

因為是樹莓派,所以需要一些額外的準備工作, ARM 在預設下並沒有啟用cgroup, 透過修改boot 底下的檔案把cgroup加上並啟用.


 
$ sudo vi /boot/firmware/cmdline.txt

在內文中最後面加入下面那一段, 然後存檔離開.


 
cgroup_enable=memory cgroup_memory=1

cat 查一下文件是否跟下面的設定一樣


 
$ cat /boot/firmware/cmdline.txt

 
console=serial0,115200 dwc_otg.lpm_enable=0 console=tty1 root=LABEL=writable rootfstype=ext4 rootwait fixrtc quiet splash cgroup_enable=memory cgroup_memory=1

在我們要用snap 來安裝microk8s前, 我們先查看一下有哪些版本可以使用.


 
$ snap info microk8s

簡易輸出如下, , latest/stable 是指向v1.23.5, 筆者想用更新但是穩定的版本, 故筆者選用的是1.23/stable版本.


 
name: microk8s summary: Kubernetes for workstations and appliances publisher: Canonical✓ store-url: https://snapcraft.io/microk8s contact: https://github.com/ubuntu/microk8s license: Apache-2.0 description: | MicroK8s is a small, fast, secure, single node Kubernetes that installs on just about any Linux box. Use it for offline development, prototyping, testing, or use it on a VM as a small, cheap, reliable k8s for CI/CD. It's also a great k8s for appliances - develop your IoT apps for k8s and deploy them to MicroK8s on your boxes. snap-id: EaXqgt1lyCaxKaQCU349mlodBkDCXRcg channels: 1.23/stable: v1.23.6 2022-04-29 (3207) 190MB classic 1.23/candidate: v1.23.6 2022-04-29 (3207) 190MB classic 1.23/beta: v1.23.6 2022-04-28 (3207) 190MB classic 1.23/edge: v1.23.6 2022-05-10 (3250) 190MB classic latest/stable: v1.23.5 2022-04-02 (3054) 192MB classic latest/candidate: v1.24.0 2022-05-04 (3224) 199MB classic latest/beta: v1.24.0 2022-05-04 (3224) 199MB classic latest/edge: v1.24.0 2022-05-10 (3251) 199MB classic

接者就是安裝microk8s, 大概會花幾分鐘的時間,


 
$ sudo snap install microk8s --classic --channel=1.23/stable

安裝似乎沒有想像中順利, 遇到了第一個錯, 啟動microk8s service 遇到超時的狀況, 依照系統的建議查看了服務狀況, 也看看日誌輸出, 發現服務確實沒有正常運作. 擔心可能microk8s沒有被安裝好, 所以又重新跑了一次上面的安裝指令.


 
錯誤資訊: - Start snap "microk8s" (3207) services (systemctl command [start snap.microk8s.daemon-containerd.service] failed with exit status 1: Job for snap.microk8s.daemon-containerd.service failed because a timeout was exceeded. See "systemctl status snap.microk8s.daemon-containerd.service" and "journalctl -xeu snap.microk8s.daemon-containerd.service" for details. )

重新安裝後, 終於順利安裝成功, 顯示如下.


 
pi@pimaster:~$ sudo snap install microk8s --classic --channel=1.23/stable Run configure hook of "microk8s" snap if present microk8s (1.23/stable) v1.23.6 from Canonical✓ installed

順便查看一下microk8s服務是否正常, 這邊用剪圖顯示服務已經正常運行了, 指令如下.


 
$ systemctl status snap.microk8s.daemon-containerd.service

安裝完成後, 因為microk8s會創建group也會用到一些superuser的權限, 我們需要把自己用的user也加到group裡面, 加完後記得在su - $USER reload 一下 session.


 
$ sudo usermod -a -G microk8s $USER $ sudo chown -f -R $USER ~/.kube $ su - $USER

到這邊都沒有問題的話, 安裝步驟也即將完成, 我們來試試看microk8s的指令, 這邊加上了option --wait-ready, 是為了等k8s的初始化完成. 樹莓派就是這樣矯情呀, 不等它一下, 馬上就鬧鱉扭... (不知道有沒有打錯字)


 
$ microk8s status --wait-ready

筆者剛好都沒有遇到錯誤訊息, 得到的輸出如下. 關鍵字是 microk8s is running

如果只是要一個樹莓派運行k8s,到這裡就算完成了, 但是我想嘗試join 三塊樹莓派來運行k8s的叢集, 所以.....

眼尖的各位, 應該有注意到筆者的三個樹莓派(pimaster, piworker01, piworker02), 我們繼續對piworker01 跟 piworker02 進行

  • 修改cgroup, 把cgroup_enable=memory cgroup_memory=1 改好後存檔

 
pi@piworker01:~$ sudo vi /boot/firmware/cmdline.txt pi@piworker02:~$ sudo vi /boot/firmware/cmdline.txt
  • 安裝microk8s, 版本一定要跟pimaster 上的microk8s相同喔!

 
pi@piworker01:~$ sudo snap install microk8s --classic --channel=1.23/stable microk8s (1.23/stable) v1.23.6 from Canonical✓ installed pi@piworker02:~$ sudo snap install microk8s --classic --channel=1.23/stable microk8s (1.23/stable) v1.23.6 from Canonical✓ installed
  • 加入group的動作, 本來以為只會在pimaster上操作k8s叢集, 覺得這個步驟可以忽略, 但是在join的時候, 竟然gg了, 錯誤訊息就是要你把user加到 group 才能使用, pi是我的user名稱, 也可以帶變數($USER)的方式進行下面步驟, 記得piworker01 跟 piworker02都要執行喔!

 
sudo usermod -a -G microk8s pi sudo chown -f -R pi ~/.kube su - pi

這些步驟都完成後, 我們跳回pimaster, 重頭戲來了, 我們要來加入 microk8s的叢集囉~ 興不興奮?開不開心?


 
pi@pimaster:~$ microk8s add-node

輸出如下

總共它分成了三個段落, 若你要加入的node具有control plane(也就是master)的功能, 那你就要複製第一個指令. 這邊, 筆者想要的k8s叢集架構是一個master搭配兩個worker nodes, 所以用的是第二個指令, 差別是多了 --worker的option.

最後一個段落, 其實蠻搞笑的, 如果reach不到node, 那還加它幹嘛?是在哈囉嗎? 還有指令也跟第一個段落給的一樣, 後續若知道了正確的使用場景, 再加上來跟大家分享囉! 這次先跳過不理他了.

有了指令, 現在就要到piworker01 跟 piworker02上去執行join的命令了, 筆者在這裡有遇到一些奇怪的問題, 第二台 piworker02 join的時候, 顯示token失效, 但是重新join一次後就正常了

錯誤訊息在此:


 
pi@piworker02:~$ microk8s join 192.168.0.109:25000/9dd299d5841de3dc64c4849d41cab927/ac548aa53083 --worker Contacting cluster at 192.168.0.109 Connection failed. Invalid token (500).

成功訊息在此:

piworker01

piworker02

當然我們也要在pimaster 上面檢查一下, 哎~~等一下!為什麼一定要在master 上面查看呀? worker node 就不行嗎? 當加入成為work node 後, 其實系統會因為資安因素而有所調整, 其實這跟運行其他的k8s 一樣, 大家記得要使用 kubectl 的指令, 都在master上喔.

pimaster

我們試試看這行指令 microk8s kubectl get no,若node加入成功,就會看到囉, 這邊筆者也有遇到問題, 可能是筆者目前在樹莓派上使用的是microSD 的記憶卡, 所有的資訊寫入都不是那麼的快又有效, 使用樹莓派要有耐心, 不要一言不合就冰的拉((╯°□°)╯︵ ┻━┻)

到這裡, 我們已經完成了microk8s 叢集的建置, 有一個control plane跟兩個worker node, 不過下k8s的指令, 要打那麼一長串, 實在是讓人受不了, 我們再花一分鐘時間用vi調整一下bashrc


 
$ vi ~/.bashrc

筆者習慣加在設定檔的最後面, 請看紅色圈圈處.


 
# microk8s commmand alias alias k="microk8s kubectl" alias kd="microk8s kubectl describe"

存檔後記得source 一下 source ~/.bashrc, 然後我們來試試看下面幾個指令. 筆者覺得打k比打kubectl 簡單舒服多了, 喜歡練打字的, 也可以不增加alias喔!


 
$ k get no $ k cluster-info $ k get po -A

後記

試著在microk8s 上創建資源, 不管是deployment還是單純的pod, 發現microSD 真的蠻讓人抓狂的, 下一步應該是把microSD 拔除, 另外也考慮把nfs 創建起來.

附上一張照片, 當初就是在youtube上, 看到人家買了這樣的樹莓派大樓來部署k3s, 心癢難耐之下, 筆者也依樣畫葫蘆地搞一下microk8s, k3s 跟 microk8s 各有所長, 筆者會繼續研究如何可以讓microk8s在樹莓派上更有發揮, 期待筆者能有更多的microk8s文章!

參考資料

  1. 基本安裝 - https://microk8s.io/docs/getting-started

  2. 高可用性 - https://microk8s.io/docs/high-availability

  3. 樹莓派的額外設定 - https://microk8s.io/docs/install-alternatives#heading--arm