使用 k3sup 一分钟快速搭建 K3s 集群

使用 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 在服务器上安装 K3s
  • join:在远程主机上安装 K3s 代理并将其加入到现有集群
  • ready:使用 kubectl 检查集群是否已就绪。
  • update:打印更新说明
  • version:打印版本

创建集群会用到 installjoin 两个命令。

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."

(转载本站文章请注明作者和出处乱世浮生,请勿用于任何商业用途)

comments powered by Disqus