Kubernetes 从 v1.20 开始弃用 Docker,并推荐用户切换到基于容器运行时接口(CRI)的容器引擎,如 containerd、cri-o 等。若是你使用了云服务商提供的托管 Kubernetes 服务,那你不用担忧,像 GKE、AKS 等云服务商都已经在新版集群中把默认的运行时切换到 containerd 。node
那对于那些自管的集群,又如何把容器运行时从 Docker 切换到 Containerd 呢?git
首先,标记节点为维护模式,并驱逐其上正在运行的 Pod,避免切换过程当中影响应用的正常运行:github
kubectl cordon <node-name>
kubectl drain <node-name> --ignore-daemonsets
复制代码
而后以 root 用户登陆到 Node 上面,中止 docker 和 kubelet,并删除 docker:docker
systemctl stop kubelet
systemctl stop docker
apt purge docker-ce docker-ce-cli
复制代码
接下来,生成 containerd 配置文件:markdown
mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
复制代码
因为国内环境没法访问 GCR,须要修改 pause 镜像为国内能够访问的地址,好比替换为 MCR:ide
...
[plugins."io.containerd.grpc.v1.cri"]
sandbox_image = "mcr.microsoft.com/oss/kubernetes/pause:1.3.1"
...
复制代码
接下来,打开 /etc/default/kubelet
,修改 kubelet 启动选项,配置容器运行时为 containerd:工具
KUBELET_FLAGS=... --container-runtime=remote --container-runtime-endpoint=unix:///run/containerd/containerd.sock
复制代码
修改完成后, 重启 containerd 和 kubelet:oop
systemctl daemon-reload
systemctl restart containerd
systemctl restart kubelet
复制代码
最后,退出 Node,使用 kubectl 命令验证节点的容器运行时:学习
# kubectl get node <node-name> -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
<node-name> Ready agent 13d v1.18.2 10.241.0.21 <none> Ubuntu 18.04.5 LTS 5.4.0-1039 containerd://1.4.3
复制代码
能够发现,容器运行时已经切换到了 containerd,其版本为 1.4.3。ui
最后,把节点从新加回集群中:
kubectl uncordon <node-name>
复制代码
对其余的节点重复以上步骤,就能够把集群的 docker 替换成 containerd。
除了以上的步骤,切换到 containerd 以后,还须要注意 docker.sock 再也不可用,也就意味着不能再在容器里面执行 docker 命令来构建镜像了。这里,我推荐几种不须要 docker.sock 也能够构建镜像的方法。
第一个是 Docker Buildx,这也是 Kubernetes 社区用于构建多体系结构镜像的方法。好比,你能够执行下面的命令来构建镜像:
docker buildx create --driver kubernetes --driver-opt replicas=3 --use
docker buildx build -t example.com/foo --push .
复制代码
第二个是 Redhat 开源的 Buildah。Buildah 是 Openshift 默认的镜像构建工具,同时支持 OCI 和 Docker 镜像格式。Buildah 的使用方法相似于 docker build,如:
# 构建镜像
buildah bud -t example.com/foo:latest .
# 查询镜像列表
buildah images
复制代码
第三个是 Google 开源的 kaniko。Kaniko 也是不须要 docker daemon 就能够从 Dockerfile 构建镜像。在使用 Kaniko 时要注意,它在构建镜像时须要把构建上下文(context)传入到 kaniko 命令行中,构建上下文能够放到标准输入中,也能够放到 AWS S三、Azure Blob Storage、GCS Bucket 等存储中。
Docker 弃用后,能够把 Kubernetes 容器运行时切换到社区维护并支持 CRI 的容器引擎,如 containerd、cri-o 等。切换以后,也须要注意,原来使用 docker build 构建镜像的应用须要切换到无需 Dockerd 就能够构建镜像的工具,如 docker build、buildah、kaniko 等。
欢迎关注 漫谈云原生 公众号,学习更多云原生知识。