k8s弃用docker

简介

k8s 1.20最大的改变就是宣布要废弃dockershim,也就是所谓的弃用docker,直接使用containerd作为容器运行时,这样做的好处对于我来说就是可以省去运行docker的这一部分系统资源,今天就把之前升级到1.20.4版本的所有节点都移除docker,改为直接使用containerd。

环境介绍

下面应该很能说明问题了

  • node1 10.10.100.21 master
  • node2 10.10.100.22 master
  • node3 10.10.100.23 master
  • node4 10.10.100.31 worker
  • node5 10.10.100.32 worker
  • node6 10.10.100.33 worker

之后get nodes一下

kubectl get nodes -o wide

1
2
3
4
5
6
7
NAME    STATUS   ROLES                  AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION               CONTAINER-RUNTIME
node1 Ready control-plane,master 98d v1.20.4 10.10.100.21 <none> CentOS Linux 7 (Core) 3.10.0-1160.2.2.el7.x86_64 docker://20.10.3
node2 Ready control-plane,master 98d v1.20.4 10.10.100.22 <none> CentOS Linux 7 (Core) 3.10.0-1160.2.2.el7.x86_64 docker://20.10.3
node3 Ready control-plane,master 98d v1.20.4 10.10.100.23 <none> CentOS Linux 7 (Core) 3.10.0-1160.2.2.el7.x86_64 docker://20.10.3
node4 Ready <none> 98d v1.20.4 10.10.100.31 <none> CentOS Linux 7 (Core) 3.10.0-1160.2.2.el7.x86_64 docker://20.10.3
node5 Ready <none> 98d v1.20.4 10.10.100.32 <none> CentOS Linux 7 (Core) 3.10.0-1160.2.2.el7.x86_64 docker://20.10.3
node6 Ready <none> 98d v1.20.4 10.10.100.33 <none> CentOS Linux 7 (Core) 3.10.0-1160.2.2.el7.x86_64 docker://20.10.3

可以看到都是使用20.10.3版本的docker

先操作node6

node6是工作节点,首先肯定是配置节点不可调度和驱逐所有容器了

配置节点不可调度

kubectl cordon node6

驱逐所有容器

kubectl drain node6 --ignore-daemonsets --delete-emptydir-data

–ignore-daemonsets 表示忽略daemonsets
–delete-emptydir-data 表示驱逐有本地存储的pod

当所有容器被驱逐且集群正常之后我们就可以停止kubelet了

ssh root@10.10.100.33

systemctl stop kubelet

这个时候节点状态会变为NotReady

之后就是卸载docker

systemctl stop docker

注意如果你的主节点etcd是使用docker搭建的那么不要卸载

yum remove docker-ce-cli.x86_64 docker-ce.x86_64

配置containerd开启cri

vim /etc/containerd/config.toml

注释掉

disabled_plugins = ["cri"]

重启containerd

systemctl restart containerd.service

清除moby namespace里面的资源

ctr --namespace moby containers ls

ctr --namespace moby containers rm $(ctr --namespace moby containers ls -q)

kill -9 $(ps -ef |grep containerd-shim-runc-v2|grep -v grep |awk '{print $2}')

ctr -n moby content rm $(ctr -n moby content ls -q)

删除moby namespace

ctr ns rm moby

之后配置kubelet使用containerd

vim /etc/kubernetes/kubelet.env

KUBELET_ARGS添加下面两行

1
2
--container-runtime=remote \
--container-runtime-endpoint=unix:///run/containerd/containerd.sock \

之后导入镜像

1
for line in `cat images.list`; do filename=`echo $line|  awk -F "/" '{print $2}'`; ctr -n k8s.io images import $filename; done

如果不知道为什么我使用上面命令导入镜像的可以看我的博客

升级家中的k8s集群

启动kubelet

systemctl start kubelet

最后解除不可调度

kubectl uncordon node6

看下节点状态

kubectl get nodes -o wide

1
2
3
4
5
6
7
NAME    STATUS   ROLES                  AGE   VERSION   INTERNAL-IP    EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION               CONTAINER-RUNTIME
node1 Ready control-plane,master 98d v1.20.4 10.10.100.21 <none> CentOS Linux 7 (Core) 3.10.0-1160.2.2.el7.x86_64 docker://20.10.3
node2 Ready control-plane,master 98d v1.20.4 10.10.100.22 <none> CentOS Linux 7 (Core) 3.10.0-1160.2.2.el7.x86_64 docker://20.10.3
node3 Ready control-plane,master 98d v1.20.4 10.10.100.23 <none> CentOS Linux 7 (Core) 3.10.0-1160.2.2.el7.x86_64 docker://20.10.3
node4 Ready <none> 98d v1.20.4 10.10.100.31 <none> CentOS Linux 7 (Core) 3.10.0-1160.2.2.el7.x86_64 docker://20.10.3
node5 Ready <none> 98d v1.20.4 10.10.100.32 <none> CentOS Linux 7 (Core) 3.10.0-1160.2.2.el7.x86_64 docker://20.10.3
node6 Ready <none> 98d v1.20.4 10.10.100.33 <none> CentOS Linux 7 (Core) 3.10.0-1160.2.2.el7.x86_64 containerd://1.4.3

node6使用了1.4.3的containerd

其他的节点也重复上述步骤就好了

  • 配置节点不可调度 kubectl cordon node5
  • 驱逐所有容器 kubectl drain node5 --ignore-daemonsets --delete-emptydir-data
  • 停止kubelet systemctl stop kubelet
  • 卸载docker systemctl stop docker && yum remove docker-ce-cli.x86_64 docker-ce.x86_64
  • 配置containerd开启cri
  • 重启containerd
  • 删除moby namespace
  • 配置kubelet使用containerd
  • 导入镜像
  • 启动kubelet
  • 检查节点状态

欢迎关注我的博客www.bboy.app

Have Fun

欢迎关注我的其它发布渠道