跳至主要內容

自动部署k3s集群

LincZero大约 2 分钟

自动部署k3s集群

  • 一行命令
  • 自动配置集群
  • 全程无需人工干预

1.集群规划

主机名IP地址类型
k3s-server192.168.56.10Control Plane 控制平面
k3s-agent1192.168.56.11工作节点
k3s-agent2192.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

end

3.安装脚本

在安装脚本中,我们通过传入的参数,也就是虚拟机的名字,来执行不同的命令。

环境变量

自动创建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