Atlantis
GitHub Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Toggle Dark/Light/Auto mode Back to homepage

1.3 安装与卸载

K3s 的安装与卸载都是使用 shell 脚本实现的。

安装脚本的主要工作是下载二进制文件、解析环境变量、创建systemd service 并启动,二进制文件存放在 /usr/local/bin,默认使用 /var/lib/rancher/k3s/etc/rancher 目录存储数据 ,systemd 的 service 文件存放在 /etc/systemd/system。下面是一个安装 K3s 的示例:

➜  ~ curl -sfL https://get.k3s.io | INSTALL_K3S_VERSION="v1.24.11+k3s1" INSTALL_K3S_EXEC="server" sh -s - --cluster-init --cluster-cidr 10.253.0.0/16 --service-cidr 10.254.0.0/16
[INFO]  Using v1.24.11+k3s1 as release
[INFO]  Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.24.11+k3s1/sha256sum-arm64.txt
[INFO]  Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.24.11+k3s1/k3s-arm64
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Skipping installation of SELinux RPM
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Skipping /usr/local/bin/ctr symlink to k3s, command exists in PATH at /usr/bin/ctr
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO]  env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s.service
[INFO]  systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.
[INFO]  systemd: Starting k3s

K3s 的安装脚本提供了许多环境变量与参数,但我们一般只关注这几个参数:

  1. K3s 版本:由环境变量 INSTALL_K3S_VERSION 控制,可以在 k3s 的 GitHub 版本发布页找到对应的 value
  2. systemd服务启动命令:由环境变量 INSTALL_K3S_EXEC 控制,server 表示作为控制面启动,agent 表示作为普通节点启动
  3. 是否启用 etcd:由标志位 --cluster-init 控制
  4. 集群 PodCIDR:由参数 --cluster-cidr 控制
  5. 集群 ServiceCIDR:由参数 --service-cidr 控制
部署时需要确保 PodCIDR 与 ServiceCIDR 没有冲突,且不与当前系统网卡所在网段冲突,避免后续出现 Pod 网络异常。

集群启动后可以看到只运行了 k3s 进程,并启动了 containerd 子进程。

K3s 的二进制文件里集成了控制面组件(kube-apiserver、kube-controller-manager、kube-scheduler)、节点组件(kubelet、kube-proxy、flanneld)、容器运行时(containerd),其余的附加组件:coredns、metrics-server、service-lb、traefik、local-path-provisioner等,以 Pod 形式运行,二进制文件加上附加组件镜像组成的离线安装包压缩后不超过 200MB。

而卸载脚本则更简单,停止 k3s 守护进程、杀死所有的容器、清理临时目录、Pod 网卡、还原系统 iptables 规则,最后移除掉所有部署时产生的文件。下面是一个卸载 K3s 的示例:

➜  ~ k3s-uninstall.sh
+ id -u
+ [ 0 -eq 0 ]
+ /usr/local/bin/k3s-killall.sh
+ [ -s /etc/systemd/system/k3s.service ]
+ basename /etc/systemd/system/k3s.service
+ systemctl stop k3s.service
+ [ -x /etc/init.d/k3s* ]
+ killtree 1094025 1094121 1094148 1095293 1095368
+ kill -9 1094025 1094196 1094325 1094121 1094191 1094363 1094148 1094204 1094400 1095293 1095313 1095520 1095567 1095368 1095389 1095706
+ do_unmount_and_remove /run/k3s
+ set +x
sh -c 'umount -f "$0" && rm -rf "$0"' /run/k3s/containerd/io.containerd.runtime.v2.task/k8s.io/f1140652264f8f0a4fd285573191874835ab5a3f2e1be141a27a52837150c1cd/rootfs
...
sh -c 'umount -f "$0" && rm -rf "$0"' /run/k3s/containerd/io.containerd.grpc.v1.cri/sandboxes/67d88166d3ab11d7ea526e2b0067dade64d1a22b151797e121fd0278731b7491/shm
+ do_unmount_and_remove /var/lib/rancher/k3s
+ set +x
+ do_unmount_and_remove /var/lib/kubelet/pods
+ set +x
sh -c 'umount -f "$0" && rm -rf "$0"' /var/lib/kubelet/pods/e7029583-50a2-4224-b3b8-3a8f5ed06d21/volumes/kubernetes.io~projected/kube-api-access-24jhx
...
sh -c 'umount -f "$0" && rm -rf "$0"' /var/lib/kubelet/pods/08f4fcb1-54a4-464d-909f-6d7603496e73/volumes/kubernetes.io~projected/kube-api-access-n7864
+ do_unmount_and_remove /var/lib/kubelet/plugins
+ set +x
+ do_unmount_and_remove /run/netns/cni-
+ set +x
sh -c 'umount -f "$0" && rm -rf "$0"' /run/netns/cni-e362530e-72e2-35d5-dd62-cf436cf30a0e
...
sh -c 'umount -f "$0" && rm -rf "$0"' /run/netns/cni-4d87f91b-3028-bcef-c566-96a70981b0cd
+ ip netns show
+ + xargs -r -t -n 1 ip netns delete
grep cni-
+ remove_interfaces
...
+ ip link delete flannel-wg-v6
Cannot find device "flannel-wg-v6"
...
+ rm -rf /var/lib/cni/
+ iptables-save
...
+ systemctl disable k3s
Removed /etc/systemd/system/multi-user.target.wants/k3s.service.
+ systemctl reset-failed k3s
Failed to reset failed state of unit k3s.service: Unit k3s.service not loaded.
+ systemctl daemon-reload
+ rm -f /etc/systemd/system/k3s.service
+ rm -f /etc/systemd/system/k3s.service.env
+ trap remove_uninstall EXIT
+ rm -f /usr/local/bin/kubectl
+ rm -f /usr/local/bin/crictl
+ rm -rf /etc/rancher/k3s
+ rm -rf /run/k3s
+ rm -rf /run/flannel
+ rm -rf /var/lib/rancher/k3s
+ rm -rf /var/lib/kubelet
+ rm -f /usr/local/bin/k3s
+ rm -f /usr/local/bin/k3s-killall.sh
+ remove_uninstall
+ rm -f /usr/local/bin/k3s-uninstall.sh