简介
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
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了
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
添加下面两行
--container-runtime=remote \
--container-runtime-endpoint=unix:///run/containerd/containerd.sock \
之后导入镜像
for line in `cat images.list`; do filename=`echo $line| awk -F "/" '{print $2}'`; ctr -n k8s.io images import $filename; done
如果不知道为什么我使用上面命令导入镜像的可以看我的博客
启动kubelet
systemctl start kubelet
最后解除不可调度
kubectl uncordon node6
看下节点状态
kubectl get nodes -o wide
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