使用 K3s 在樹莓派上執行 Kubernetes 叢集

2020-03-29 12:18:00

跟隨接下來的介紹,自己搭建一個三節點的 Kubernetes 叢集。

我對在樹莓派上搭建 Kubernetes 叢集已經感興趣很長時間了,只要照著網上的教學,我可以在由三個樹莓派組成的叢集中搭建一套 Kubernetes 並正常執行。但在這種情況下,主節點上的記憶體和 CPU 資源捉襟見肘,執行 Kubernetes 任務的時候往往效能不佳,想要升級 Kubernetes 就更不可能了。

這個時候,我非常激動地發現了 K3s 這個專案。K3s 被譽為在可用於資源受限環境下的輕量級 Kubernetes,它還針對 ARM 處理器做出了優化,這讓 Kubernetes 叢集可以在樹莓派上執行得更好。在下文中,我們將會使用 K3s 來建立一個 Kubernetes 叢集。

準備

要按照本文介紹的方式建立 Kubernetes 叢集,首先需要準備:

  • 至少一個樹莓派(包括 SD 卡和電源)
  • 網線
  • 將所有樹莓派連線到一起的交換機或路由器

我們會通過線上安裝的方式安裝 K3s,因此還需要可以連線到網際網路。

叢集概覽

在這個叢集裡,我們會使用三個樹莓派。其中一個樹莓派作為主節點,我們將它命名為 kmaster,並為其分配一個靜態 IP 192.168.0.50(註:假設使用的私有網段是 192.168.0.0/24),而另外兩個樹莓派作為工作節點,分別命名為 knode1knode2,也分別分配 192.168.0.51192.168.0.52 兩個 IP 地址。

當然,如果你實際的網路布局和上面不同,只要將文中所提及到的 IP 替換成你實際可用的 IP 就可以了。

為了不需要通過 IP 來參照某一個節點,我們將每個節點的主機名記錄到 PC 的 /etc/hosts 檔案當中:

echo -e "192.168.0.50\tkmaster" | sudo tee -a /etc/hostsecho -e "192.168.0.51\tknode1" | sudo tee -a /etc/hostsecho -e "192.168.0.52\tknode2" | sudo tee -a /etc/hosts

部署主節點

我們首先部署主節點。最開始的步驟當然是使用映象安裝最新的 Raspbian,這個步驟可以參考我的另一篇文章,在這裡就不展開介紹了。在安裝完成之後,啟動 SSH 服務,將主機名設定為 kmaster,然後分配靜態 IP 192.168.0.50

在主節點上安裝 Raspbian 完成後,啟動樹莓派並通過 ssh 連線上去:

ssh pi@kmaster

在主節點上執行以下命令安裝 K3s:

curl -sfL https://get.k3s.io | sh -

等到命令跑完以後,一個單節點叢集就已經執行起來了。讓我們檢查一下,還在這個樹莓派上執行:

sudo kubectl get nodes

就會看到這樣的輸出:

NAME     STATUS   ROLES    AGE    VERSIONkmaster  Ready    master   2m13s  v1.14.3-k3s.1

獲取連線令牌join token

之後我們需要部署工作節點。在工作節點上安裝 K3s 的時候,會需要用到連線令牌,它放置在主節點的檔案系統上。首先把連線令牌儲存出來以便後續使用:

sudo cat /var/lib/rancher/k3s/server/node-token

部署工作節點

通過 SD 卡在每個作為工作節點的樹莓派上安裝 Raspbian。在這裡,我們把其中一個樹莓派的主機名設定為 knode1,為其分配 IP 地址 192.168.0.51,另一個樹莓派的主機名設定為 knode2,分配 IP 地址 192.168.0.52。接下來就可以安裝 K3s 了。

啟動主機名為 knode1 的樹莓派,通過 ssh 連線上去:

ssh pi@knode1

在這個樹莓派上,安裝 K3s 的過程和之前差不多,但需要另外加上一些引數,表示它是一個工作節點,需要連線到一個已有的叢集上:

curl -sfL http://get.k3s.io | K3S_URL=https://192.168.0.50:6443 \K3S_TOKEN=剛才儲存下來的連線令牌 sh -

K3S_TOKEN 的值需要替換成剛才儲存下來的實際的連線令牌。完成之後,在主機名為 knode2 的樹莓派上重複這個安裝過程。

通過 PC 存取叢集

現在如果我們想要檢視或者更改叢集,都必須 ssh 到叢集的主節點才能使用 kubectl,這是比較麻煩的。因此我們會將 kubectl 放到 PC 上使用。首先,在主節點上獲取一些必要的設定資訊,sshkmaster 上執行:

sudo cat /etc/rancher/k3s/k3s.yaml

複製上面命令的輸出,然後在你的 PC 上建立一個目錄用來放置組態檔:

mkdir ~/.kube

將複製好的內容寫入到 ~/.kube/config 檔案中,然後編輯該檔案,將

server: https://localhost:6443

改為

server: https://kmaster:6443

出於安全考慮,只對自己保留這個組態檔的讀寫許可權:

chmod 600 ~/.kube/config

如果 PC 上還沒有安裝 kubectl 的話,就可以開始安裝了。Kubernetes 官方網站上有各種平台安裝 kubectl方法說明,我使用的是 Ubuntu 的衍生版 Linux Mint,所以我的安裝方法是這樣的:

sudo apt update && sudo apt install -y apt-transport-httpscurl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.listsudo apt update && sudo apt install kubectl

上面幾個命令的作用是新增了一個包含 Kubernetes 的 Debian 軟體庫,獲取 GPG 金鑰以確保安全,然後更新軟體包列表並安裝 kubectl。如果 kubectl 有更新,我們將會通過標準軟體更新機制standard software update mechanism收到通知。

現在在 PC 上就可以檢視 Kubernetes 叢集了:

kubectl get nodes

輸出大概會是這樣:

NAME     STATUS  ROLES   AGE   VERSIONkmaster  Ready   master  12m   v1.14.3-k3s.1knode1   Ready   worker  103s  v1.14.3-k3s.1knode1   Ready   worker  103s  v1.14.3-k3s.1

至此,我們已經搭建了一個三節點的 Kubernetes 叢集。

K3s 的彩蛋

如果執行 kubectl get pods --all-namespaces,就會看到其它服務的一些 Pod,比如 Traefik。Traefik 在這裡起到是反向代理和負載均衡器的作用,它可以讓流量從單個入口進入叢集後引導到叢集中的各個服務。Kubernetes 支援這種機制,但 Kubernetes 本身不提供這個功能,因此 Traefik 是一個不錯的選擇,K3s 安裝後立即可用的優點也得益於此。

在後續的文章中,我們會繼續探討 Traefik 在 Kubernetes ingress 中的應用,以及在叢集中部署其它元件。敬請關注。