由于Docker在Kubernetes v1.20中已弃用,最近几天在Twitter上发生了很多讨论。
问题背景
Kubernetes v1.20的废弃说明:
如果想了解更多,强烈建议查看此Twitter。
考虑到最近部署了一个Raspberry Pi Kubernetes集群,因此想就地进行更新,以使用Containerd代替Docker作为容器运行时。
免责声明–不要在生产集群中这样做。对于这些集群,只需删除现有节点,然后滚动引入新节点。这个博客只是关于Raspberry Pi集群的一个有趣的话题,看看是否可以在无需重建节点的情况下就地完成更新。
因此,要做的第一件事是drain需要更新的节点(我的节点称为k8s-node-1)并且cordon它:
1 | kubectl drain k8s-node-1 --ignore-daemonsets |
然后ssh进入节点并停止kubelet:
1 | systemctl stop kubelet |
然后删除Docker:
1 | apt-get remove docker.io |
删除旧的依赖项:
1 | apt-get autoremove |
现在unmask现有的containerd服务(Docker使用containerd,这就是为什么它已经存在的原因):
1 | systemctl unmask containerd |
安装所需的依赖项:
1 | apt-get install unzip make golang-go libseccomp2 libseccomp-dev btrfs-progs libbtrfs-dev |
完成以上步骤后,现在我们按照官方说明开始安装containerd。
无论如何,以root身份进行所有操作,获取containerd的源代码:
1 | go get -d github.com/containerd/containerd |
获取protoc 并安装:
1 | wget -c https://github.com/google/protobuf/releases/download/v3.11.4/protoc-3.11.4-linux-x86_64.zip |
获取runc 的源代码:
1 | go get -d github.com/opencontainers/runc |
进入到下载的包目录(检查$ GOPATH变量),使用make进行构建和安装runc和containerd:
1 | cd ~/go/src/github.com/opencontainers/runc |
现在,将containerd.service文件复制到systemd以创建containerd的服务、启动服务并查看启动状态:
1 | cp containerd.service /etc/systemd/system/ |
差不多完成了,现在我们需要更新kubelet,将默认使用的docker改为containerd(参考flag设置)。我们可以通过运行:
1 | sed -i 's/3.2/3.2 --container-runtime=remote --container-runtime-endpoint=unix:\/\/\/run\/containerd\/containerd.sock/g' /var/lib/kubelet/kubeadm-flags.env |
如果上面的命令不起作用,请直接修改kubeadm-flags.env文件。
重启kubelet并查看服务状态:
1 | systemctl start kubelet |
最后,uncordon节点,并查看节点信息中的Runtime已变为containerd:
1 | kubectl uncordon k8s-node-1 |