维护节点
首先标记需要切换的节点为维护模式,强制驱逐节点上正在运行的 Pod,这样可以最大程度降低切换过程中影响应用的正常运行,比如我们先将 node01 节点切换到 containerd
使用 kubectl cordon
命令将 node01 节点标记为 unschedulable
不可调度状态
➜ ~ kubectl cordon node01
node/node01 cordoned
➜ ~ kubectl get nodes
NAME STATUS ROLES AGE VERSION
master Ready master 135d v1.22.0
node01 Ready,SchedulingDisabled <none> 135d v1.22.0
node02 Ready <none> 135d v1.22.0
执行完上面的命令后,node01 节点变成了一个 SchedulingDisabled
状态,表示不可调度,这样新创建的 Pod 就不会调度到当前节点上来了。
接下来维护 node01 节点,使用 kubectl drain
命令来维护节点并驱逐节点上的 Pod:
➜ ~ kubectl drain node01 --ignore-daemonsets
node/node01 already cordoned
evicting pod "github-actions-builder-6ff688f657-wpbp4"
evicting pod "github-actions-builder-6ff688f657-mxzkd"
evicting pod "ingress-nginx-controller-6697dc9fd-j5lpz"
...
node/node1 evicted
上面的命令会强制将 node01 节点上的 Pod 进行驱逐,我们加了一个 --ignore-daemonsets
的参数可以用来忽略 DaemonSet 控制器管理的 Pods,因为这些 Pods 不用驱逐到其他节点去,当节点驱逐完成后接下来我们就可以来对节点进行维护操作了,除了切换容器运行时可以这样操作,比如我们需要变更节点配置、升级内核等操作的时候都可以先将节点进行驱逐,然后再进行维护。
切换containerd
接下来停掉 docker、containerd 和 kubelet
➜ ~ systemctl stop kubelet
➜ ~ systemctl stop docker
➜ ~ systemctl stop containerd
因为我们安装的 Docker 默认安装使用了 containerd 作为后端的容器运行时,所以不需要单独安装 containerd 了,当然你也可以将 Docker 和 containerd 完全卸载掉,然后重新安装,这里我们选择直接使用之前安装的 containerd。
因为 containerd 中默认已经实现了 CRI,但是是以 plugin 的形式配置的,以前 Docker 中自带的 containerd 默认是将 CRI 这个插件禁用掉了的(使用配置 isabled_plugins = ["cri"])
,所以这里我们重新生成默认的配置文件来覆盖掉:
➜ ~ containerd config default > /etc/containerd/config.toml
接下来修改 kubelet 配置,将容器运行时配置为 containerd,打开 /etc/sysconfig/kubelet
文件,在该文件中可以添加一些额外的 kubelet 启动参数,配置如下所示:
KUBELET_EXTRA_ARGS="--container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock"
上面的配置中我们增加了两个参数,--container-runtime
参数是用来指定使用的容器运行时的,可选值为 docker 或者 remote,默认是 docker,由于我们这里使用的是 containerd 这种容器运行时,所以配置为 remote 值(也就是除 docker 之外的容器运行时都应该指定为 remote),然后第二个参数 --container-runtime-endpoint
是用来指定远程的运行时服务的 endpiont 地址的,在 Linux 系统中一般都是使用 unix 套接字的形式,比如这里我们就是指定连接 containerd 的套接字地址 unix:///run/containerd/containerd.sock
。
配置完成后重启 containerd 和 kubelet 即可:
➜ ~ systemctl daemon-reload
➜ ~ systemctl restart containerd
➜ ~ systemctl restart kubelet
重启完成后稍等片刻 查看节点状态是否正常: