自动部署k3s集群
2025/10/20
自动部署k3s集群
- 一行命令
 - 自动配置集群
 - 全程无需人工干预
 
1.集群规划
| 主机名 | IP地址 | 类型 | 
|---|---|---|
| k3s-server | 192.168.56.10 | Control Plane 控制平面 | 
| k3s-agent1 | 192.168.56.11 | 工作节点 | 
| k3s-agent2 | 192.168.56.12 | 工作节点 | 
2.Vagrantfile 配置文件
vm_list = [
  { # hash map
    "name" => "k3s-server",
    "cpu" => "2",
    "mem" => "2048",
    "ip_addr" => "192.168.56.10"
  },
  {
    "name" => "k3s-agent1",
    "cpu" => "1",
    "mem" => "1024",
    "ip_addr" => "192.168.56.11"
  },
  {
    "name" => "k3s-agent2",
    "cpu" => "1",
    "mem" => "1024",
    "ip_addr" => "192.168.56.12"
  }
]
Vagrant.configure(2) do |config|
   config.vm.box = "ubuntu/jammy64"
   vm_list.each do |item|
        config.vm.define item["name"] do |node|
            node.vm.provider "virtualbox" do |vbox|
              vbox.name = item["name"];  #虚拟机名称
              vbox.memory = item["mem"]; #内存
              vbox.cpus = item["cpu"];   #CPU
            end
            # 设置hostname
            node.vm.hostname = item["name"]
            # 设置IP
            node.vm.network "private_network", ip: item["ip_addr"]
            # 执行shell脚本
            node.vm.provision "shell" do |script|
              script.path = "k3s-install.sh"   #脚本路径
              script.args = [ item["name"] ]   #传递参数
            end
        end
    end
end3.安装脚本
在安装脚本中,我们通过传入的参数,也就是虚拟机的名字,来执行不同的命令。
环境变量
自动创建K3s集群,需要配置下面两个环境变量:
K3S_TOKEN: 预先约定好token,工作节点自动加入K3S_URL: 主节点API server的访问地址
由于预先分配了IP,所以可以确定API server的访问地址。
Flannel网络
K3s内置了 flannel 作为默认的网络插件(CNI)。
flannel 默认是选择第一个网卡进行网络通信,由于Vagrant虚拟机的第一个网卡是NAT模式,虚拟机之间无法互相访问。因此,在安装k3s时,需要使用 --flannel-iface 将第二个网卡 enp0s8 设置为默认网络。
echo "==> k3s cluster settings:"
K3S_TOKEN=NEIwQ0IxMEUtNTA2MS00RE
K3S_URL=https://192.168.56.10:6443
FLANNEL_IFACE="enp0s8"
echo "    TOKEN: ${TOKEN}"
echo "    API_SERVER:${API_SERVER}"
echo "    FLANNEL_IFACE:${FLANNEL_IFACE}"
echo "==> disable firewall"
ufw disable
if [ $1 == "k3s-server" ]; then
    echo "==> install $1"
    curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
         INSTALL_K3S_MIRROR=cn \
         K3S_TOKEN=${TOKEN} \
         sh -s - server --flannel-iface ${FLANNEL_IFACE}
else
    echo "==> install $1"
    curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
         INSTALL_K3S_MIRROR=cn \
         K3S_URL=https://${API_SERVER}:6443 \
         K3S_TOKEN=${TOKEN} \
         sh -s - --flannel-iface ${FLANNEL_IFACE}
fi评论补充
这段脚本中变量有点错误,修改后可用的:
echo "==> k3s cluster settings:"
K3S_TOKEN=NEIwQ0IxMEUtNTA2MS00RE
K3S_URL=https://192.168.56.10:6443
FLANNEL_IFACE="enp0s8"
echo "    TOKEN: ${K3S_TOKEN}"
echo "    API_SERVER: ${K3S_URL}"
echo "    FLANNEL_IFACE: ${FLANNEL_IFACE}"
echo "==> disable firewall"
ufw disable
if [ $1 == "k3s-server" ]; then
    echo "==> install $1"
    curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
         INSTALL_K3S_MIRROR=cn \
         K3S_TOKEN=${K3S_TOKEN} \
         sh -s - server --flannel-iface ${FLANNEL_IFACE}
else
    echo "==> install $1"
    curl -sfL https://rancher-mirror.rancher.cn/k3s/k3s-install.sh | \
         INSTALL_K3S_MIRROR=cn \
         K3S_URL=${K3S_URL} \
         K3S_TOKEN=${K3S_TOKEN} \
         sh -s - --flannel-iface ${FLANNEL_IFACE}
fi链接到当前文件 0
没有文件链接到当前文件