0%

将Kubernetes群集的Docker切换到为Containerd

由于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
2
wget -c https://github.com/google/protobuf/releases/download/v3.11.4/protoc-3.11.4-linux-x86_64.zip
sudo unzip protoc-3.11.4-linux-x86_64.zip -d /usr/local

获取runc 的源代码:

1
go get -d github.com/opencontainers/runc

进入到下载的包目录(检查$ GOPATH变量),使用make进行构建和安装runc和containerd:

1
2
3
4
5
6
cd ~/go/src/github.com/opencontainers/runc
make
make install
cd ~/go/src/github.com/containerd/containerd
make
make install

现在,将containerd.service文件复制到systemd以创建containerd的服务、启动服务并查看启动状态:

1
2
3
4
5
6
cp containerd.service /etc/systemd/system/
chmod 644 /etc/systemd/system/containerd.service
systemctl daemon-reload
systemctl start containerd
systemctl enable containerd
systemctl status containerd

差不多完成了,现在我们需要更新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
2
systemctl start kubelet
systemctl status kubelet

最后,uncordon节点,并查看节点信息中的Runtime已变为containerd:

1
2
kubectl uncordon k8s-node-1
kubectl get nodes -o wide