切换Kubernetes容器运行时

1:简介

集群 版本
Kubernetes 1.23.3

2:实践

2.1:维护节点

root@k8s-master:~# kubectl get node -owide
NAME           STATUS   ROLES                  AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
k8s-master     Ready    control-plane,master   3d    v1.23.3   10.1.1.10     <none>        Ubuntu 18.04.6 LTS   4.15.0-167-generic   docker://20.10.14
k8s-worker-1   Ready    <none>                 3d    v1.23.3   10.1.1.11     <none>        Ubuntu 18.04.6 LTS   4.15.0-167-generic   docker://20.10.14
k8s-worker-2   Ready    <none>                 3d    v1.23.3   10.1.1.12     <none>        Ubuntu 18.04.6 LTS   4.15.0-167-generic   docker://20.10.14

1:首先标记需要切换的节点为维护模式,强制驱逐节点上正在运行的 Pod,这样可以最大程度降低切换过程中影响应用的正常运行,比如我们先将 worker-1 节点切换到 containerd
首先使用 kubectl cordon 命令将 worker-1 节点标记为 unschedulable 不可调度状态:

root@k8s-master:~# kubectl cordon k8s-worker-1 
node/k8s-worker-1 cordoned
root@k8s-master:~# kubectl get node
NAME           STATUS                     ROLES                  AGE   VERSION
k8s-master     Ready                      control-plane,master   3d    v1.23.3
k8s-worker-1   Ready,SchedulingDisabled   <none>                 3d    v1.23.3
k8s-worker-2   Ready                      <none>                 3d    v1.23.3

2:执行完上面的命令后,worker-1 节点变成了一个 SchedulingDisabled 状态,表示不可调度,这样新创建的 Pod 就不会调度到当前节点上来了。
接下来维护 worker-1 节点,使用 kubectl drain 命令来维护节点并驱逐节点上的 Pod:

root@k8s-master:~# kubectl drain k8s-worker-1 --ignore-daemonsets 
node/k8s-worker-1 already cordoned
WARNING: ignoring DaemonSet-managed Pods: kube-system/calico-node-c22zs, kube-system/kube-proxy-5thht
evicting pod kube-system/coredns-6d8c4cb4d-ww9vq
evicting pod kube-system/coredns-6d8c4cb4d-dplfx
pod/coredns-6d8c4cb4d-dplfx evicted
pod/coredns-6d8c4cb4d-ww9vq evicted
node/k8s-worker-1 drained

上面的命令会强制将 worker-1 节点上的 Pod 进行驱逐,我们加了一个 --ignore-daemonsets 的参数可以用来忽略 DaemonSet 控制器管理的 Pods,因为这些 Pods 不用驱逐到其他节点去,当节点驱逐完成后接下来我们就可以来对节点进行维护操作了,除了切换容器运行时可以这样操作,比如我们需要变更节点配置、升级内核等操作的时候都可以先将节点进行驱逐,然后再进行维护。

2.2:切换Containerd

接下来停掉 docker、containerd 和 kubelet:(在worker-1操作)
root@k8s-worker-1:~# systemctl stop docker
root@k8s-worker-1:~# systemctl stop kubelet.service 
root@k8s-worker-1:~# systemctl stop containerd.service 

因为我们安装的 Docker 默认安装使用了 containerd 作为后端的容器运行时,所以不需要单独安装 containerd 了,当然你也可以将 Docker 和 containerd 完全卸载掉,然后重新安装,这里我们选择直接使用之前安装的 containerd

因为 containerd 中默认已经实现了 CRI,但是是以 plugin 的形式配置的,以前 Docker 中自带的 containerd 默认是将 CRI 这个插件禁用掉了的(使用配置 disabled_plugins = ["cri"]),所以这里我们重新生成默认的配置文件来覆盖掉:
root@k8s-worker-1:~# containerd config default > /etc/containerd/config.toml

修改配置
root@k8s-worker-1:~# cat /etc/containerd/config.toml | grep sand
    sandbox_image = "registry.aliyuncs.com/k8sxio/pause:3.5"

修改加速
    [plugins."io.containerd.grpc.v1.cri".registry]
      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://6ze43vnb.mirror.aliyuncs.com"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."k8s.gcr.io"]
          endpoint = ["https://registry.aliyuncs.com/k8sxio"]

# 这里有个坑,需要注释一些不需要的配置
接下来修改 kubelet 配置,将容器运行时配置为 containerd,打开 /etc/systemd/system/kubelet.service.d 文件,在该文件中可以添加一些额外的 kubelet 启动参数,配置如下

Environment="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 即可:
上面的配置中我们增加了两个参数,--container-runtime 参数是用来指定使用的容器运行时的,可选值为 docker 或者 remote,默认是 docker,由于我们这里使用的是 containerd 这种容器运行时,所以配置为 remote 值(也就是除 docker 之外的容器运行时都应该指定为 remote),然后第二个参数 --container-runtime-endpoint 是用来指定远程的运行时服务的 endpiont 地址的,在 Linux 系统中一般都是使用 unix 套接字的形式,比如这里我们就是指定连接 containerd 的套接字地址 unix:///run/containerd/containerd.sock。

重启完成后查看节点状态是否正常:
root@k8s-master:~# kubectl get node -owide
NAME           STATUS                     ROLES                  AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION       CONTAINER-RUNTIME
k8s-master     Ready                      control-plane,master   3d    v1.23.3   10.1.1.10     <none>        Ubuntu 18.04.6 LTS   4.15.0-167-generic   docker://20.10.14
k8s-worker-1   Ready,SchedulingDisabled   <none>                 3d    v1.23.3   10.1.1.11     <none>        Ubuntu 18.04.6 LTS   4.15.0-167-generic   containerd://1.5.11
k8s-worker-2   Ready                      <none>                 3d    v1.23.3   10.1.1.12     <none>        Ubuntu 18.04.6 LTS   4.15.0-167-generic   docker://20.10.14

此时看到我们的docker已经切换成了containerd了然后讲worker-1重新加回集群即可:
root@k8s-master:~# kubectl uncordon k8s-worker-1 
node/k8s-worker-1 uncordoned
root@k8s-master:~# kubectl get node
NAME           STATUS   ROLES                  AGE   VERSION
k8s-master     Ready    control-plane,master   3d    v1.23.3
k8s-worker-1   Ready    <none>                 3d    v1.23.3
k8s-worker-2   Ready    <none>                 3d    v1.23.3

# 如果想要更换Master,那么我们需要加入一个新的Master(提前跟换成containerd)来替换master的运行时了
posted @ 2022-05-04 00:33  Layzer  阅读(226)  评论(0编辑  收藏  举报