Docker?Rkt?Lxd?细说K8S容器进行时的又一选项Containerd

Containerd作为Kubernetes的容器运行时,提供了一种轻量级、可嵌入的解决方案。与Docker相比,它拥有更小的代码库,易于维护且更契合Kubernetes的需求。本文介绍了Containerd的工作原理及与Kubernetes的集成方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Markdown

器运行时是执行容器并在节点上管理容器镜像的软件,目前,最广为人知的容器运行时是Docker,但在生态系统中还有其他容器运行时软件,比如Rkt、Containerd和Lxd。Docker是现在于Kubernetes环境中使用的最常见的容器运行时,今天数人云给大家推荐一个Docker的组件——Containerd,它可能是更好的选择。

本文是由谷歌的软件工程师Lantao Liu和IBM的开源开发者Mike Brown基于自身相关实践,共同编写。

Kubernetes 1.5引入了一个名为容器运行时接口(CRI)的内部插件API,以方便地访问不同的容器运行时,CRI允许Kubernetes使用各种容器运行时,而不需要重新编译。从理论上说,Kubernetes可以使用任何实现CRI的容器运行时管理容器和容器镜像。

在过去的6个月中,来自Google、Docker、IBM、中兴和ZJU的工程师们一直在努力为CRI For Containerd,这个项目被称为cri-containerd,用户可以使用容器作为底层运行时运行Kubernetes集群,并且无需安装Docker。

Containerd

Containerd是一个兼容OCI的核心容器运行时,它被设计为嵌入到更大的系统当中,提供了在一个节点上执行容器和管理镜像的最小功能集,它是由Docker公司发起,并于2017年3月加入了CNCF,Docker引擎本身是建立在早期版本的容器之上,并且很快将更新到最新版本。

与Docker相比,Containerd的规模要小得多,提供了Golang客户端API,而且更专注于可嵌入,较小范围会导致一个更小的代码库,随着时间的推移,其更容器维护以及匹配Kubernetes的需求,如下图所示:

Markdown

Markdown

综上所述,从技术的角度来看,Containerd是Kubernetes的容器进行时比较好的选择。

Cri-Containerd

Cri-Containerd是对于容器的一个实现,它在与Kubelet和 Containerd相同的节点上运行,在Kuberntes和Containerd之间的分层中,Cri-Containerd处理来自Kubelet的所有国际服务请求,并使用Containerd管理容器和容器镜像,Cri-Containerd管理这些服务请求,在一定程度上是通过形成Containerd服务请求,同时添加足够的附加功能来去支持CRI需求。

Markdown

与当前的Docker CRI实现(Dockershim)相比,Cri-Containerd消除了栈中的额外跳转,使堆栈更加稳定和高效。

体系结构

Markdown

可以通过下面这个例子来演示当Kubele创建一个单一容器的时候,如何使用Cri-Containerd。

  • Kubelet通过国际运行时服务API调用了Cri-Containerd,用以创建一个Pod;

  • Cri-Containerd使用Containerd创建和启动一个特殊的暂停容器(沙箱容器),并将该容器放在Pod的Cgroups和名称空间中;

  • Containerd使用CNI配置了Pod的网络名称空间;

  • Kubelet随后通过国际服务API调用了“容器”,以拉出应用程序的容器的镜像;

  • 如果镜像不存在于节点,则Cri-Containerd将进一步使用Containerd来拉出镜像;

  • 然后,Kubelet通过“CRI”服务API调了“Cri-Containerd”通过拉取容器的镜像来创建和启动应用程序容器;

  • Cri-Containerd最终调用Containerd来创建应用程序容器,将其放入Pod的Cgroups和命名空间中,然后启动该容器的新应用程序容器。

在这些步骤之后,将创建并运行一个Pod及其相应的应用程序容器。

现阶段状态

Cri-Containerd V1.0.0-alpha.0是在2017年9月25日发布的。

其功能完备,所有的Kubernetes的特性都得到了支持。

所有的CRI validation test(CRI validation test是一种测试框架,用于验证是否符合Kubernetes的所有要求。地址:https://github.com/kubernetes...

所有的 Node e2e Test都已通过(用于测试Kubernetes节点级功能的测试框架如Managing Pods、Mounting Volumes等,地址:https://github.com/kubernetes...)。

若想了解更多关于V1.0-Alpha的相关内容,请前往:https://github.com/kubernetes...

延伸阅读

对于一个多节点集群安装程序,并使用能应用和Kubeadm启动步骤请参见:https://github.com/kubernetes...

若想在Google云端从头创建一个集群,请参见:https://github.com/kelseyhigh...

对于一个自发布Tarball的自定义安装,请参见:https://github.com/kubernetes...

对于在本地VM上安装LinuxKit,请参见:https://github.com/linuxkit/l...

下一阶段

Containerd承诺,在下一阶段将主要改进稳定性和可用性方面的问题:

稳定性:

在Kubernetes的测试基础设施上建立一套完整的Kubernetes集成测试,包括Ubuntu、COS(容器化的OS 地址:https://cloud.google.com/cont...)等等。

积极解决用户报告的任何测试失败和其他问题。

可用性:

提高Crictl(https://github.com/kubernetes...)的用户体验,Crictl是所有的CRI容器运行时的可移植命令行工具,这里的目标是使其易于用于调试和开发场景。

集成Kube-up.sh(https://kubernetes.io/docs/ge...)帮助用户使用Cri-Containerd来提高Kubernetes集群的生产质量。

改进文档。

预计在2017年底发布V1.0-Beta。

提供建议

Cri-Containerd是一个Kubernetes的孵化器项目,地址:ttps://github.com/kubernetes-incubator/cri-containerd。欢迎提供任何具有建设性的意见和建议,具体的使用入门指南请参见:https://github.com/kubernetes...

社区

Cri-Containerd是由Kubernetes Signode社区开发和维护的,如有相关的建议,可以加入社区:

Sig-Node社区网站:https://github.com/kubernetes...

Slack:Kubernetes(kubernet.slack.com)的sig-节点通道:https://kubernetes.slack.com/

原文作者:Kubernetes
原文链接:http://blog.kubernetes.io/201...

<think>根据用户的问题,用户想在CentOS7上将Kubernetes的容器运行时从containerd切换为Docker。在回答之前,需要注意以下重要背景信息:1.用户当前的Kubernetes集群可能正在使用containerd作为容器运行时(根据用户引用的内容,Kubernetes1.20及以后版本默认使用containerd)。2.从Kubernetes1.24版本开始,dockershim已被移除,因此官方不再支持Docker作为容器运行时。但用户明确要求从containerd切换到Docker,所以我们需要考虑用户的环境是否低于1.24版本(用户提到验证1.18版本,所以可行)。3.用户提供的引用[1]中提到了安装Docker的方法,引用[2]提到Kubernetes1.20将容器运行时改为Containerd。由于用户使用的是Kubernetes1.18.0(根据引用[1]),该版本仍然支持dockershim,所以可以切换回Docker。操作步骤:1.在集群的每个节点上安装Docker(如果尚未安装)。2.配置Docker守护进程,特别是cgroup驱动需要与kubelet致。3.修改kubelet的配置,将其指向Docker作为容器运行时。4.重启kubelet服务。5.验证切换是否成功。但是请注意:Kubernetes集群运行时切换容器运行时需要非常谨慎,因为可能会导致运行中的容器中断。建议在维护窗口进行,并确保集群状态可恢复(如备份重要数据)。具体步骤:步骤1:安装Docker(参照引用[1])在每台节点上执行以下命令安装Docker(这里以Docker版本18.06.1为例):```bash#安装依赖包yuminstall-yyum-utilsdevice-mapper-persistent-datalvm2#添加Docker仓库(这里使用阿里云镜像)wgethttps://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo-O/etc/yum.repos.d/docker-ce.repo#安装指定版本的Dockeryuminstall-ydocker-ce-18.06.1.ce-3.el7```步骤2:配置Docker修改Docker配置文件`/etc/docker/daemon.json`,设置cgroup驱动为systemd(与kubelet保持致)。如果文件不存在则创建。```json{"exec-opts":["native.cgroupdriver=systemd"],"log-driver":"json-file","log-opts":{"max-size":"100m"},"storage-driver":"overlay2","storage-opts":["overlay2.override_kernel_check=true"]}```然后启动Docker并设置开机自启:```bashsystemctldaemon-reloadsystemctlenabledocker--now```步骤3:修改kubelet的配置Kubernetes通过kubelet的参数`--container-runtime`和`--container-runtime-endpoint`来指定容器运行时。由于我们是从containerd切换到Docker,需要修改kubelet的配置,将容器运行时改为Docker。注意:不同安装方式(如kubeadm或二进制)配置方式可能不同。如果使用kubeadm部署的集群,kubelet的配置文件通常在`/var/lib/kubelet/kubeadm-flags.env`。编辑该文件:```bash#备份原文件cp/var/lib/kubelet/kubeadm-flags.env/var/lib/kubelet/kubeadm-flags.env.bak#修改配置sed-i's|--container-runtime=remote--container-runtime-endpoint=unix:///run/containerd/containerd.sock|--container-runtime=docker--runtime-request-timeout=15m|'/var/lib/kubelet/kubeadm-flags.env```如果没有使用kubeadm,而是直接配置的kubelet服务,那么需要编辑kubelet的systemd配置文件(通常是`/etc/systemd/system/kubelet.service.d/10-kubeadm.conf`):在`ExecStart`命令中,将原来的`--container-runtime=remote`和`--container-runtime-endpoint=unix:///run/containerd/containerd.sock`替换为:```--container-runtime=docker\```然后重新加载systemd并重启kubelet。步骤4:重启kubelet```bashsystemctldaemon-reloadsystemctlrestartkubelet```步骤5:验证切换在节点上运行:```bashkubectldescribenode<节点名称>|grep"ContainerRuntime"```应该会显示类似:```ContainerRuntimeVersion:docker://18.6.1```同时,检查节点是否Ready:```bashkubectlgetnodes```注意事项:1.切换过程中,节点上的Pod可能会中断重建,确保应用能够容忍节点重启。2.如果切换后kubelet无法启动,检查日志(`journalctl-xeukubelet`)排查问题。3.由于用户集群原来是containerd,切换成Docker后,之前containerd管理的容器将不可见(但数据仍在,只是Docker无法管理),所以建议在无负载的节点上逐个操作,或者先排空节点。问题:为什么用户需要切换?可能是某些工具依赖Docker。但需要注意,Kubernetes社区已经不再支持Docker作为运行时(1.24版本后),所以长期建议使用containerd。如果用户后续想升级到Kubernetes1.24及以上版本,则必须切换回containerd或其他支持的运行时。生成相关问题:1.如何验证Docker是否已正确配置为Kubernetes的容器运行时?2.切换容器运行时后,如何恢复之前运行的容器?3.如何将Kubernetes的容器运行时从Docker迁移到Containerd?根据用户需求,给出以上步骤后,再生成相关问题。</think> 根据您的需求,我将在 CentOS 7 上将 Kubernetes 容器运行时从 Containerd 切换为 Docker 的操作步骤整理如下: ### 操作步骤(适用于 Kubernetes 1.18 版本) 1. **卸载 Containerd 相关组件**(所有节点) ```bash sudo systemctl stop kubelet sudo systemctl disable kubelet sudo kubeadm reset -f sudo yum remove containerd crictl -y ``` 2. **安装 Docker** ```bash # 安装依赖 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 # 添加阿里云镜像源 sudo wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo # 安装指定版本 Docker(兼容 1.18) sudo yum install -y docker-ce-18.06.1.ce-3.el7 # 配置 Docker sudo mkdir /etc/docker cat <<EOF | sudo tee /etc/docker/daemon.json { "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "registry-mirrors": ["https://registry.docker-cn.com"] } EOF # 启动 Docker sudo systemctl enable docker --now ``` 3. **修改 kubelet 配置**(所有节点) ```bash # 编辑 kubelet 配置文件 sudo vi /etc/systemd/system/kubelet.service.d/10-kubeadm.conf # 修改以下参数: # 将 --container-runtime=remote 替换为: # --container-runtime=docker \ # --runtime-request-timeout=15m ``` 4. **重启 kubelet** ```bash sudo systemctl daemon-reload sudo systemctl restart kubelet ``` 5. **验证切换** ```bash # 检查容器运行时 kubectl describe node | grep "Container Runtime" # 应返回:docker://18.6.1 # 检查节点状态 kubectl get nodes -o wide ``` ### 注意事项 1. **版本兼容性**:Kubernetes 1.24+ 已[移除 Docker 支持](^1),此方案仅适用于 v1.18 版本 2. **集群操作**:建议先排空节点(`kubectl drain <node>`)再操作 3. **数据迁移**:切换运行时不会自动迁移现有容器,需重新部署工作负载 4. **网络配置**:检查 CNI 插件是否与 Docker 兼容(如 Flannel/Calico) 5. **日志差异**:Docker 日志存储在 `/var/lib/docker/containers`,原 Containerd 路径为 `/var/log/containers` ### 故障排查 若节点变为 NotReady: ```bash # 查看 kubelet 日志 journalctl -xeu kubelet # 常见错误解决 sudo rm /etc/containerd/config.toml # 残留配置清理 sudo systemctl restart containerd docker kubelet ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值