Kubernetes 弃用 Docker 后如何切换到 Containerd

标签: kubernetes docker 切换 | 发表时间:2021-03-25 11:52 | 作者:漫谈云原生
出处:https://juejin.cn/tag/%E6%9E%B6%E6%9E%84

Kubernetes 从 v1.20 开始 弃用 Docker,并推荐用户切换到基于 容器运行时接口(CRI)的容器引擎,如 containerd、cri-o 等。如果你使用了云服务商提供的托管 Kubernetes 服务,那你不用担心,像 GKE、AKS 等云服务商都已经在新版集群中把默认的运行时切换到 containerd 。

image.png

那对于那些自管的集群,又如何把容器运行时从 Docker 切换到 Containerd 呢?

切换容器运行时的方法

首先,标记节点为维护模式,并驱逐其上正在运行的 Pod,避免切换过程中影响应用的正常运行:

   kubectl cordon 
kubectl drain  --ignore-daemonsets
复制代码

然后以 root 用户登录到 Node 上面,停止 docker 和 kubelet,并删除 docker:

   systemctl stop kubelet
systemctl stop docker
apt purge docker-ce docker-ce-cli
复制代码

接下来,生成 containerd 配置文件:

   mkdir -p /etc/containerd
containerd config default > /etc/containerd/config.toml
复制代码

由于国内环境无法访问 GCR,需要修改 pause 镜像为国内可以访问的地址,比如替换为 MCR:

   ...
[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:

   systemctl daemon-reload
systemctl restart containerd
systemctl restart kubelet
复制代码

最后,退出 Node,使用 kubectl 命令验证节点的容器运行时:

   # kubectl get node  -o wide
NAME          STATUS   ROLES   AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION     CONTAINER-RUNTIME
   Ready    agent   13d   v1.18.2   10.241.0.21           Ubuntu 18.04.5 LTS   5.4.0-1039  containerd://1.4.3
复制代码

可以发现,容器运行时已经切换到了 containerd,其版本为 1.4.3。

最后,把节点重新加回集群中:

   kubectl uncordon 
复制代码

对其他的节点重复以上步骤,就可以把集群的 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 S3、Azure Blob Storage、GCS Bucket 等存储中。

总结

Docker 弃用后,可以把 Kubernetes 容器运行时切换到社区维护并支持 CRI 的容器引擎,如 containerd、cri-o 等。切换之后,也需要注意,原来使用 docker build 构建镜像的应用需要切换到无需 Dockerd 就可以构建镜像的工具,如 docker build、buildah、kaniko 等。

欢迎关注 漫谈云原生 公众号,学习更多云原生知识。

相关 [kubernetes docker 切换] 推荐:

kubernetes移除Docker?

- -
两周前,Kubernetes在其最新的Changelog中宣布1.20之后将要弃用dockershime,也就说Kubernetes将不再使用Docker做为其容器运行时. 这一消息持续发酵,掀起了不小的波澜,毕竟Kubernetes+Docker的经典组合是被市场所认可的,大量企业都在使用. 看上去这个“弃用”的决定有点无厘头,那么为什么Kubernetes会做出这样的决定.

Kubernetes 弃用 Docker 后如何切换到 Containerd

- - 掘金 架构
Kubernetes 从 v1.20 开始 弃用 Docker,并推荐用户切换到基于 容器运行时接口(CRI)的容器引擎,如 containerd、cri-o 等. 如果你使用了云服务商提供的托管 Kubernetes 服务,那你不用担心,像 GKE、AKS 等云服务商都已经在新版集群中把默认的运行时切换到 containerd.

Kubernetes 切换到 Containerd

- - bleem
由于 Kubernetes 新版本 Service 实现切换到 IPVS,所以需要确保内核加载了 IPVS modules;以下命令将设置系统启动自动加载 IPVS 相关模块,执行完成后需要重启. 重启完成后务必检查相关 module 加载以及内核参数设置:. 1.2、安装 Containerd. Containerd 在 Ubuntu 20 中已经在默认官方仓库中包含,所以只需要 apt 安装即可:.

docker/kubernetes国内源/镜像源解决方式

- - Xinkun Blog
最近在使用kubeadm时,被各种连接不上搞到崩溃. 这里统一整理了国内的一些镜像源,apt源,kubeadm源等,以便查阅. Azure China提供了目前用过的质量最好的镜像源. 而且都支持匿名拉取,也就是不需要登录. 这里,我开发了一个小的脚本azk8spull,这个脚本可以自动根据镜像名称进行解析,转换为azure的mirror镜像源域名.

Kubernetes组件问题排查思路 – 十点运维吧-Linux|Kubernetes|Docker|Prometheus|Python|Golang|云原生|SRE

- -
Kubernetes的基础组件就像一栋房子的地基,它们的重要性不言而喻. 作为Kubernetes集群的维护者,经常会遇到组件的问题,那平时是怎么去定位解决的呢. 这里简要分析一下我的排查思路. 通过集群的状态,找到故障的节点或者组件. 使用pprof分析组件的具体性能. Kubernetes的基础组件不多,而且部署也非常简单,所以在定义范围的时候还是很容易的,比如我们在使用.

[分享创造] Vesta: 一个 Docker 和 Kubernetes 配置安全的快速检查工具

- - V2EX
伴随着容器技术的快速发展,容器安全问题也逐渐成为企业所关注的话题,越来越多的公司以及个人开发着选择将他们的服务迁移到云上. 目前市面上的容器扫描或容器配置检查的产品大部门都需要进行繁琐的环境配置,同时对机器性能也有着比较高的要求,而开发者或安全测试者或许只是需要扫描少数的镜像或者配置,繁琐的配置和高昂的机器费用对他们来说难以承担,导致安全检查的效率不佳.

Docker & Flatpak

- - IT瘾-dev
目前最流行的技术莫过于Docker,Docker和Docker衍生的东西用到了很多很酷的技术,目前deepin应用软件发布转变成flatpak,这些看似风牛马不相及的技术方案,实际都使用了一个共同的底层技术——Namespace,假如没有namespace支持,这些技术实现都将成为空中楼阁. 一句话总结,无论是Docker、sysmted-nspawn还是flatpak,都是在namespace基础上,针对不同的场景,生出的不同的解决方案.

Kubernetes & Microservice

- - 午夜咖啡
这是前一段时间在一个微服务的 meetup 上的分享,整理成文章发布出来. 谈微服务之前,先澄清一下概念. 微服务这个词的准确定义很难,不同的人有不同的人的看法. 比如一个朋友是『微服务原教旨主义者』,坚持微服务一定是无状态的 http API 服务,其他的都是『邪魔歪道』,它和 SOA,RPC,分布式系统之间有明显的分界.

docker初体验之docker-tomcat

- - BlogJava-首页技术区
docker已经是现在最热的容器技术,最近也去体验了一下,在daocloud注册了一个账号,并开始本机实战docker. daocloud免费有两个容器可用,体验送T恤,邀请送书,这里我分享一个daocloud的邀请码 https://account.daocloud.io/signup?invite_code=mxeq2jkmcur37vz6ven8,daocloud是非常棒的容器云平台,使用体验好,问题响应也及时,绑定微信还送一个额外容器.

Kubernetes学习(Kubernetes踩坑记)

- - Z.S.K.'s Records
记录在使用Kubernetes中遇到的各种问题及解决方案, 好记性不如烂笔头. prometheus提示 /metrics/resource/v1alpha1 404. 原因: 这是因为[/metrics/resource/v1alpha1]是在v1.14中才新增的特性,而当前kubelet版本为1.13.