在平时的使用工作中,为了方便在纯净的分钟环境中进行测试,我经常需要在本地或者公有云环境中频繁地搭建和销毁集群。快速有时是搭建在 我的 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 'inet ' | awk '{ print $2}' | cut -d/ -f1)}export INSTALL_K3S_VERSION=v1.23.8+k3s1curl -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 是一个轻量级工具,用于快速搭建 K3s 集群。
k3sup 的特点是易于使用,只需单个命令即可在不同的平台上安装 K3s。它使用户可以快速创建 Kubernetes 集群,并可以轻松地将新节点加入到现有集群中。
k3sup 通过 SSH 连接到目标服务器,然后自动安装和配置 K3s。这意味着我们可以在任何可以通过 SSH 访问的机器上安装和运行 Kubernetes,包括本地机器、云服务器或树莓派等设备。
简单理解就是使用 k3sup 完成了 ssh 到主机、安装 K3s server、复制 token、ssh 到 agent 主机、安装 K3s agent ... 等一系列的操作。
接下来我们看下如何使用 k3sup。
k3sup 是一个命令行工具,使用前要下载安装 CLI。
Linux:
curl -sLS https://get.k3sup.dev | shsudo install k3sup /usr/local/bin/
macOS:
brew install k3sup
k3sup 支持如下命令:
创建集群会用到 install 和 join 两个命令。
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.11k3sup install --ip $MASTER_IP \ --user addo \ --k3s-channel v1.24 \ --local-path /tmp/config
执行命令会打印安装过程中的日志。
Running: k3sup install2023/10/26 09:04:35 192.168.1.11Public 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/configkubectl config use-context defaultkubectl get node -o wide
执行命令,查看节点的信息。
export KUBECONFIG=/tmp/configkubectl get node -o wideNAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIMEmaster 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 命令可以初始化 agent 节点,并将其加入到当前的集群中,需要使用 --server-ip 指定 server 节点的 IP 地址,同样需要 --k3s-channel 指定安装的版本,强烈建议安装于 server 节点同样的版本。
export AGENT_IP=192.168.1.12k3sup join --ip $AGENT_IP --user addo --server-ip $MASTER_IP --k3s-channel v1.24
Running: k3sup joinAgent: 192.168.1.11 Server: 192.168.1.12Received 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 VERSIONnode-1 Ready <none> 43s v1.24.17+k3s1master Ready control-plane,master 2m58s v1.24.17+k3s1
让 ChatGPT 生成了脚本一键创建集群,有兴趣的小伙伴可以试试创建个双节点的集群需要多久。我试了下,耗时 32s 左右。
# Define IP addressesexport HOSTS="192.168.1.11 192.168.1.12"
#!/bin/bash# Read the list of IP addresses from the environment variableIP_ADDRESSES=($HOSTS)# Define the k3s versionK3S_VERSION="v1.24"# Check if there is at least one IP addressif [ ${ #IP_ADDRESSES[@]} -eq 0 ]; then echo "No IP addresses found. Please ensure the HOSTS environment variable is correctly set." exit 1fi# Install the master nodeMASTER_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 nodesfor 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 fidoneecho "k3s cluster installation complete."
#!/bin/bash# Read the list of IP addresses from the environment variableIP_ADDRESSES=($HOSTS)# Check if there is at least one IP addressif [ ${ #IP_ADDRESSES[@]} -eq 0 ]; then echo "No IP addresses found. Please ensure the HOSTS environment variable is correctly set." exit 1fi# Clean up the master nodeMASTER_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 nodesfor 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 fidoneecho "k3s cluster cleanup complete."
[1] Alfred Snippets: https://www.alfredapp.com/help/features/snippets/
[2] k3sup: https://github.com/alexellis/k3sup
责任编辑:武晓燕 来源: 云原生指北 SSH连接K3s(责任编辑:知识)
埃斯顿(002747.SZ):埃斯顿投资减持749.18万股 占公司总股本的比例约为0.89%
不再受限:用户现可通过App Store对iOS自带应用评论打分
美尚生态(300495.SZ):控股股东解除质押及质押2894万股 占其所持股份比例14.39%
Tequila OS 2.0:拉丁美洲第一个取证 Linux 发行版
华贸物流(603128.SH)拟公开转让厦门华港物流有限公司30%股权