前言
本文目的在本地主機建構一個單節點的 Kubernetes 叢集環境以方便快速測試。雖然 Minikube 相當方便,但採用 Multipass 擁有更大彈性來客製化作業系統(Ubuntu),例如:安裝額外系統套件。幸運的是,Rancher Labs(開發 Rancher 的公司) 提供一個可以用在生產環境的精簡 Kubernetes 發行版本 K3S,重點是 “精簡” 以及 “生產環境”。所以,本文的另一個目的就是讓開發、測試與生產環境都可以使用相同的 K3S。
Multipass 簡介
根據官網說明,Multipass 是一個利用現有平台(Windows、OS X、Linux)原生虛擬機技術,在個人工作機上建置一個迷你雲(mini-cloud)。 在 Windows 系統, Multipass 使用 Hyper-V、OS X 預設使用 Hyperkit 、而在 Linux 系統則預設使用 KVM 來作為虛擬化方案。如同 Docker Desktop 提供方便的工具來管理容器一般,Multipass 則是提供方便的工具來管理多個虛擬機,足夠應付大部分應用情境,如果需要本機較完整的虛擬機自動管理方案,山姆鍋建議使用 Vagrant。
Multipass 安裝
本文假設使用的本地環境是 OS X, 對於其它系統請參考 Multipass 官方文件 ⎘。
在已經安裝 Homebrew 的 OS X 的系統,只需要在終端機執行下列指令就可以安裝 Multipass:
$ brew cask install multipass
K3S 簡介
K3S 是 Rancher Labs 公司針對邊緣計算(edge computing)、IoT 系統、K8S CI/CD 所推出的精簡 K8S 發行版本,特別支援 ARM 處理器架構,所以可以執行在 Raspberry 等單板電腦上。由於移除 K8S 中雲端環境的支援以及使用 SQLite 取代 etcd 等來將符合標準的 K8S 系統縮小到一個執行檔內。
對於 K3S 的更好的中文介紹,可以參考 邊緣運算之容器管理工具 - K3s 之介紹與玩耍 ⎘ 這篇文章。
本地 K8S 環境安裝
建構虛擬機
首先使用 Multipass 建構一個名為 k3s 的虛擬機:
$ multipass launch -n k3s
可以看到 Launched: k3s
顯示訊息即表示虛擬機建構完成。
預設是 1GB 的記憶體、5GB 的硬碟空間,如果需要調整可以參考 Multipass 文件。
安裝 K3S
$ multipass exec k3s -- bash -c "curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE=644 sh -"
可以看到類似下面的輸出訊息:
[INFO] Finding latest release
[INFO] Using v1.17.4+k3s1 as release
[INFO] Downloading hash https://github.com/rancher/k3s/releases/download/v1.17.4+k3s1/sha256sum-amd64.txt
[INFO] Downloading binary https://github.com/rancher/k3s/releases/download/v1.17.4+k3s1/k3s
[INFO] Verifying binary download
[INFO] Installing k3s to /usr/local/bin/k3s
[INFO] Creating /usr/local/bin/kubectl symlink to k3s
[INFO] Creating /usr/local/bin/crictl symlink to k3s
[INFO] Creating /usr/local/bin/ctr symlink to k3s
[INFO] Creating killall script /usr/local/bin/k3s-killall.sh
[INFO] Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO] env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO] systemd: Creating service file /etc/systemd/system/k3s.service
[INFO] systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.
[INFO] systemd: Starting k3s
設定 Kubectl
雖然可以使用 multipass shell k3s
進入虛擬機環境執行 kubectl, 但使用本地的 kubectl 來操作 K8S 還是比較符合需求。
本文假設本地主機已經有安裝 kubectl 命令列工具,如果還沒有安裝,可參考這篇文章 ⎘。
在終端機執行下列指令:
$ multipass info k3s
顯示的訊息中,IPv4
那行即為虛擬機的 IP 位址,透過這個位址本地主機可以跟虛擬機進行連線。本文虛擬主機的 IP 位址為 $K3S_NODE_IP。
執行下列指令將 K3S 的 kubeconfig 檔案複製到本機:
$ multipass exec k3s sudo cat /etc/rancher/k3s/k3s.yaml > ~/.kube/k3s.yaml
由於 k3s.yaml 使用 127.0.0.1 來跟 API server 溝通,需要改成虛擬機的真實 IP 位址才能正常存取。可以使用文件編輯器來將 127.0.0.1 更換成 $K3S_NODE_IP,或者使用下列指令:
$sed -i '' "s/127.0.0.1/$K3S_NODE_IP/" ~/.kube/k3s.yaml
驗證 kubectl 是否可正常連線,執行下列指令:
$ kubectl --kubeconfig ~/.kube/k3s.yaml get nodes
如果看到類似下面輸出,則表示單節點 K8S 環境正常運行中:
NAME STATUS ROLES AGE VERSION
k3s Ready master 27m v1.17.4+k3s1
為了方便操作,可以設定 KUBECONFIG
環境變數,
export KUBECONFIG=~/.kube/k3s.yaml
如此,就有一個基本的 Kubernetes 運行環境了!
下面是將上述步驟自動化的腳本(k3s-launch.sh):
#!/bin/bash
multipass launch -n k3s
multipass exec k3s -- bash -c "curl -sfL https://get.k3s.io | K3S_KUBECONFIG_MODE=644 sh -"
multipass exec k3s sudo cat /etc/rancher/k3s/k3s.yaml > ~/.kube/k3s.yaml
K3S_NODE_IP=$(multipass info k3s | grep IPv4 | awk '{print $2}')
sed -i '' "s/127.0.0.1/$K3S_NODE_IP/" ~/.kube/k3s.yaml
echo
echo "K3s cluster is ready !"
echo
解除安裝
如果要清除 K3S 虛擬機,只需要執行下列指令:
$ multipass delete k3s
$ multipass purge
小結
本文雖然只說明單節點 K8S 叢集的建置,但透過 Multipass + K3S 其實可以建置多節點,甚至高可用的 K8S 叢集。在第一次啟用上,Multipass + K3S 也比 Minikube 明顯稍快,畢竟 Minikube 需要下載以及執行更多元件。