K3s
K3s 為輕量版本的 k8s (kubernetes),由 Rancher Labs 社群維護,在使用上與 k8s 十分相似。
K3s 的名稱由來
K8s 原詞 kubernetes 總共有 10 個字,頭尾的字母保留不算,中間共有 8 個字,因此得命 k8s。
而 k3s 的設計初衷,是希望在記憶體使用上只有 k8s 的一半,所以 10 / 2 = 5,根據 k8s 的命名方式, 5 個字的的詞,如果頭尾字母保留不算,中間會有 3 個字母,k3s 的名稱便是由此而來。
建立 K3s 叢集
簡單介紹如何建立一個 k3s 叢集。
我在 GCP 上啟動三台乾淨的機器 k3s-server、k3s-agent-1 與 k3s-agent-2,作業系統皆為 Ubuntu 22.04。
| type | name | IP | os | k3s role |
|---|---|---|---|---|
| e2-medium | k3s-server | 10.0.1.10 | ubuntu 22.04 | server |
| e2-medium | k3s-agent-1 | 10.0.1.11 | ubuntu 22.04 | agent |
| e2-medium | k3s-agent-2 | 10.0.1.12 | ubuntu 22.04 | agent |
[!Note]
K3s 的 server 就是 k8s 的 master node,agent 就是 k8s 的 worker node。
我們先在 k3s-server 上使用指令安裝 k3s server。
curl -sfL https://get.k3s.io | sh -
如果你想要從外部使用 k3s 的 API Server (例如使用 kubectl 操作 k3s), 那麼在安裝上,需要將 k3s server 的外部 IP 加入到憑證中,可以使用 k3s 提供的 k3s server --tls-san <external-ip> 指令,--tls-san 其中的 san 意思是 subject alternative names。
[!Note]
因為我將叢集放在 private subnet 中,所有訪問叢集的請求皆需要透過 proxy 轉發,因此這裡的外部 IP 我設定成 proxy server 的外部 IP。
curl -sfL https://get.k3s.io | INSTALL_K3S_EXEC="server --tls-san <external-ip>" sh -
安裝完成之後,系統會運行 k3s server,並同時安裝 kubectl。
[!Note]
kubectl為用來操作 k8s 的工具,k3s 也同樣可以使用。
除此之外,也會生成兩個重要的檔案。
/etc/rancher/k3s/k3s.yaml: k3s 的設定檔案,透過 k3s 安裝的kubectl會自動使用這個檔案,如果你想遠端訪問叢集,可以將這個檔案複製到本地的~/.kube/config。/var/lib/rancher/k3s/server/node-token: 這個 token 可以用來將其他機器加入到 k3s 叢集中。
此時可以使用 kubectl 查看目前 k3s 叢集中有多少個 node。
sudo kubectl get nodes
得到的輸出結果如下:
NAME STATUS ROLES AGE VERSION
k3s-server Ready control-plane,master 3s v1.26.5+k3s1
接下來將 k3s-agent-1 與 k3s-agent-2 加入叢集中,分別登入到這兩台機器,並輸入下方的指令。
[!Note]
需要先確保所有機器的防火牆沒有 block 掉 6443 port。
K3s 會用到的 port 可以參考官方文件。
curl -sfL https://get.k3s.io | K3S_URL="https://<myserver>:6443" K3S_TOKEN="<mynodetoken>" sh -
記得將 <myserver> 換成 server 的 domain 或是 IP,根據上面的假設,應該是 10.0.1.10 <mynodetoken> 需要更換成在 k3s-server 上 /var/lib/rancher/k3s/server/node-token 檔案中的值。
安裝完畢之後,可以回到 k3s-server 上,再次使用 kubectl 查看叢集中的 node 數目。
sudo kubectl get nodes
如果 k3s-agent-1 與 k3s-agent-2 成功加入叢集中,則會得到下方的輸出結果。
NAME STATUS ROLES AGE VERSION
k3s-server Ready control-plane,master 1m v1.26.5+k3s1
k3s-agent-1 Ready <none> 1m v1.26.5+k3s1
k3s-agent-2 Ready <none> 1m v1.26.5+k3s1
第三方工具讀取 K3s Config 的問題
我在 k3s server 上使用 k8s 套件管理工具 Helm 的時候,遇到找不到 k3s 的 config 的問題。
Helm 預設會讀取 ~/.kube/config 的內容來操作 k8s, 但是 k3s 的 config 放在 /etc/rancher/k3s/k3s.yaml,而且預設只有 root 權限能夠讀取。
不建議改變設定檔案的權限,我們可以將 k3s.yaml 的內容複製到 ~/.kube/config 中,並給予對應的權限。
首先在 ~/.bashrc 中設定 KUBECONFIG。
export KUBECONFIG=~/.kube/config
接下來建立 ~/.kube/config。
mkdir ~/.kube 2> /dev/null
sudo k3s kubectl config view --raw > "$KUBECONFIG"
# 600 為只有擁有者有讀寫權限,其他人沒有任何權限
chmod 600 "$KUBECONFIG"