使用 k3sup 一分钟快速搭建 K3s 集群
背景
在平时的工作中,为了方便在纯净的环境中进行测试,我经常需要在本地或者公有云环境中频繁地搭建和销毁集群。有时是在 我的 HomeLab 环境中,虽然 CPU 不强但胜在内存够大;后来有了微软 MVP 赠送的 Azure 额度之后,我也会经常在 Azure 虚拟机 中搭建,因为没有拉取镜像的网络问题。
在两个环境中我通过 Terraform 实现了虚拟机的快速创建和销毁,然后在虚拟机上创建 K3s 集群。K3s 集群足够轻量级,并支持对组件的定制。结合 Alfred Snippets,我只需要 ssh 到虚拟机上并键入 k3si
就可以快速输入定制好的命令,然后再获取虚拟机上的 kubeconfig
文件并替换其中的 api-server 地址(这些也通过 snippet)解决:
export MASTER_IP=${MASTER_IP:-$(ip addr show eth0 | grep 'inet ' | 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(发音 ‘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 在服务器上安装 K3sjoin
:在远程主机上安装 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 左右。可以从 gist 获取最新的脚本。
# 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."