Kubernetes 弃用 Docker 后如何切换到 Containerd
Kubernetes 从 v1.20 开始弃用 Docker,并推荐用户切换到基于[容器运行时接口(CRI)](https://kubernetes.io/blog/2016/12/container-runtime-interface-cri-in-kubernetes/)的容器引擎,如 containerd、cri-o 等。如果你使用了云服务商提供的托管 Kubernetes 服务,那你不用担心,像 GKE、AKS 等云服务商都已经在新版集群中把默认的运行时切换到 containerd 。
那对于那些自管的集群,又如何把容器运行时从 Docker 切换到 Containerd 呢?
切换容器运行时的方法
首先,标记节点为维护模式,并驱逐其上正在运行的 Pod,避免切换过程中影响应用的正常运行:
然后以 root 用户登录到 Node 上面,停止 docker 和 kubelet,并删除 docker:
接下来,生成 containerd 配置文件:
由于国内环境无法访问 GCR,需要修改 pause 镜像为国内可以访问的地址,比如替换为 MCR:
接下来,打开 /etc/default/kubelet
,修改 kubelet 启动选项,配置容器运行时为 containerd:
修改完成后, 重启 containerd 和 kubelet:
最后,退出 Node,使用 kubectl 命令验证节点的容器运行时:
可以发现,容器运行时已经切换到了 containerd,其版本为 1.4.3。
最后,把节点重新加回集群中:
对其他的节点重复以上步骤,就可以把集群的 docker 替换成 containerd。
镜像构建的方法
除了以上的步骤,切换到 containerd 之后,还需要注意 docker.sock 不再可用,也就意味着不能再在容器里面执行 docker 命令来构建镜像了。这里,我推荐几种不需要 docker.sock 也可以构建镜像的方法。
第一个是 Docker Buildx,这也是 Kubernetes 社区用于构建多体系结构镜像的方法。比如,你可以执行下面的命令来构建镜像:
第二个是 Redhat 开源的 Buildah。Buildah 是 Openshift 默认的镜像构建工具,同时支持 OCI 和 Docker 镜像格式。Buildah 的使用方法类似于 docker build,如:
第三个是 Google 开源的 kaniko。Kaniko 也是不需要 docker daemon 就可以从 Dockerfile 构建镜像。在使用 Kaniko 时要注意,它在构建镜像时需要把构建上下文(context)传入到 kaniko 命令行中,构建上下文可以放到标准输入中,也可以放到 AWS S3、Azure Blob Storage、GCS Bucket 等存储中。
总结
Docker 弃用后,可以把 Kubernetes 容器运行时切换到社区维护并支持 CRI 的容器引擎,如 containerd、cri-o 等。切换之后,也需要注意,原来使用 docker build 构建镜像的应用需要切换到无需 Dockerd 就可以构建镜像的工具,如 docker build、buildah、kaniko 等。
欢迎关注 漫谈云原生 公众号,学习更多云原生知识。
版权声明: 本文为 InfoQ 作者【倪朋飞】的原创文章。
原文链接:【http://xie.infoq.cn/article/470bfee8219be00bc17df0c47】。文章转载请联系作者。
评论