Skip to content

運用 Multipass 與 K3S 建立 Kubernetes 測試環境

Published: 8 分鐘

K3s architecture

前言

本文目的在本地主機建構一個單節點的 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 需要下載以及執行更多元件。

郭信義 (Sam Kuo)

奔騰網路科技技術長,專長分散式系統、Web 應用與雲端服務架構、設計、開發、部署與維運。工作之餘,喜歡關注自由軟體的發展與應用,偶爾寫一下部落格文章。