背景
在平時的工作中,為了方便在純凈的環境中進行測試,我經常需要在本地或者公有云環境中頻繁地搭建和銷毀集群。有時是在 我的 HomeLab 環境中,雖然 CPU 不強但勝在內存夠大;后來有了微軟 MVP 贈送的 Azure 額度之后,我也會經常在 Azure 的虛擬機 中搭建,因為沒有拉取鏡像的網絡問題。
在兩個環境中我通過 Terraform 實現了虛擬機的快速創建和銷毀,然后在虛擬機上創建 K3s 集群。K3s 集群足夠輕量級,并支持對組件的定制。結合 Alfred Snippets[1],我只需要 ssh 到虛擬機上并鍵入 k3si 就可以快速輸入定制好的命令,然后再獲取虛擬機上的 kubeconfig 文件并替換其中的 api-server 地址(這些也通過 snippet)解決:
export MASTER_IP=${MASTER_IP:-$(ip addr show eth0 | grep '.NET ' | awk '{print $2}' | cut -d/ -f1)}
export INSTALL_K3S_VERSION=v1.23.8+k3s1
curl -sfL https://get.k3s.io | sh -s - --disable traefik --disable local-storage --disable metrics-server --advertise-address=$MASTER_IP --disable servicelb --write-kubeconfig-mode 644 --write-kubeconfig ~/.kube/config
單節點的集群操作起來還算便捷,但需要多節點的集群時也還要 ssh 到所有主機上進行操作,當然少不了復制 master 節點的 token。不免還是有些繁瑣。
后來就發現了更快捷的工具,由 Alex Ellis 創建的 k3sup[2](發音 ‘ketchup’)。
k3sup 簡介
k3sup 是一個輕量級工具,用于快速搭建 K3s 集群。
k3sup 的特點是易于使用,只需單個命令即可在不同的平臺上安裝 K3s。它使用戶可以快速創建 Kubernetes 集群,并可以輕松地將新節點加入到現有集群中。
k3sup 通過 SSH 連接到目標服務器,然后自動安裝和配置 K3s。這意味著我們可以在任何可以通過 SSH 訪問的機器上安裝和運行 Kubernetes,包括本地機器、云服務器或樹莓派等設備。
簡單理解就是使用 k3sup 完成了 ssh 到主機、安裝 K3s server、復制 token、ssh 到 agent 主機、安裝 K3s agent ... 等一系列的操作。
接下來我們看下如何使用 k3sup。
安裝 k3sup
k3sup 是一個命令行工具,使用前要下載安裝 CLI。
linux:
curl -sLS https://get.k3sup.dev | sh
sudo install k3sup /usr/local/bin/
macOS:
brew install k3sup
使用
k3sup 支持如下命令:
- completion:為指定的 shell 生成自動完成腳本
- help:幫助
- install:通過 SSH 在服務器上安裝 K3s
- join:在遠程主機上安裝 K3s 代理并將其加入到現有集群
- ready:使用 kubectl 檢查集群是否已就緒。
- update:打印更新說明
- version:打印版本
創建集群會用到 install 和 join 兩個命令。
install 命令
install 命令用于在服務器上安裝 K3s,使用下面的命令即可在遠程主機上安裝 k3s。
其中 --ip 指向遠程主機的地址,--user 為登錄遠程主機的用戶名,--k3s-channel 這是要安裝的版本,--local-path 集群 kubeconf 的本地保存地址。更多的選項可以通過 k3sup help install 來查看。
k3sup 默認使用 ssh key ~/.ssh/id_rsa 來訪問主機,可通過 --ssh-key 選項指定。
export MASTER_IP=192.168.1.11
k3sup install --ip $MASTER_IP
--user addo
--k3s-channel v1.24
--local-path /tmp/config
執行命令會打印安裝過程中的日志。
Running: k3sup install
2023/10/26 09:04:35 192.168.1.11
Public IP: 192.168.1.11
[INFO] Finding release for channel v1.24
[INFO] Using v1.24.17+k3s1 as release
...
Saving file to: /tmp/config
# Test your cluster with:
export KUBECONFIG=/tmp/config
kubectl config use-context default
kubectl get node -o wide
執行命令,查看節點的信息。
export KUBECONFIG=/tmp/config
kubectl get node -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
master Ready control-plane,master 1m v1.24.17+k3s1 10.0.2.4 <none> Ubuntu 20.04.6 LTS 5.15.0-1047-azure containerd://1.7.3-k3s1
如果是安裝單節點集群,install 命令就足夠了。假如是多節點集群,就還需要用到 join 命令。
join 命令
使用 join 命令可以初始化 agent 節點,并將其加入到當前的集群中,需要使用 --server-ip 指定 server 節點的 IP 地址,同樣需要 --k3s-channel 指定安裝的版本,強烈建議安裝于 server 節點同樣的版本。
export AGENT_IP=192.168.1.12
k3sup join --ip $AGENT_IP --user addo --server-ip $MASTER_IP --k3s-channel v1.24
Running: k3sup join
Agent: 192.168.1.11 Server: 192.168.1.12
Received node-token from 192.168.1.11.. ok.
[INFO] Finding release for channel v1.24
[INFO] Using v1.24.17+k3s1 as release
...
查看節點:
kubectl get no
NAME STATUS ROLES AGE VERSION
node-1 Ready <none> 43s v1.24.17+k3s1
master Ready control-plane,master 2m58s v1.24.17+k3s1
完整腳本
讓 ChatGPT 生成了腳本一鍵創建集群,有興趣的小伙伴可以試試創建個雙節點的集群需要多久。我試了下,耗時 32s 左右。
# Define IP addresses
export HOSTS="192.168.1.11 192.168.1.12"
搭建集群
#!/bin/bash
# Read the list of IP addresses from the environment variable
IP_ADDRESSES=($HOSTS)
# Define the k3s version
K3S_VERSION="v1.24"
# Check if there is at least one IP address
if [ ${#IP_ADDRESSES[@]} -eq 0 ]; then
echo "No IP addresses found. Please ensure the HOSTS environment variable is correctly set."
exit 1
fi
# Install the master node
MASTER_IP=${IP_ADDRESSES[0]}
echo "Installing master node: $MASTER_IP"
k3sup install --ip $MASTER_IP --user addo --k3s-channel $K3S_VERSION
--k3s-extra-args '--write-kubeconfig-mode 644 --write-kubeconfig ~/.kube/config --disable traefik --disable metrics-server --disable local-storage --disable servicelb'
--local-path /tmp/config
# Install the other agent nodes
for i in "${!IP_ADDRESSES[@]}"; do
if [ $i -ne 0 ]; then
AGENT_IP=${IP_ADDRESSES[$i]}
echo "Installing agent node: $AGENT_IP"
k3sup join --ip $AGENT_IP --server-ip $MASTER_IP --user addo --k3s-channel $K3S_VERSION
fi
done
echo "k3s cluster installation complete."
卸載集群
#!/bin/bash
# Read the list of IP addresses from the environment variable
IP_ADDRESSES=($HOSTS)
# Check if there is at least one IP address
if [ ${#IP_ADDRESSES[@]} -eq 0 ]; then
echo "No IP addresses found. Please ensure the HOSTS environment variable is correctly set."
exit 1
fi
# Clean up the master node
MASTER_IP=${IP_ADDRESSES[0]}
echo "Cleaning up master node: $MASTER_IP"
ssh -i ~/.ssh/id_rsa $MASTER_IP k3s-uninstall.sh
# Clean up the other agent nodes
for i in "${!IP_ADDRESSES[@]}"; do
if [ $i -ne 0 ]; then
AGENT_IP=${IP_ADDRESSES[$i]}
echo "Cleaning up agent node: $AGENT_IP"
ssh -i ~/.ssh/id_rsa $AGENT_IP k3s-agent-uninstall.sh
fi
done
echo "k3s cluster cleanup complete."
參考資料
[1] Alfred Snippets: https://www.alfredApp.com/help/features/snippets/
[2] k3sup: https://Github.com/alexellis/k3sup