K8S为什么要放弃使用Docker作为容器运行时,而使用containerd呢?

1. 说明

Kubernetes(K8s)决定放弃直接使用 Docker 作为容器运行时,并转而使用 containerd,主要是为了简化容器运行时架构,提高性能,增强可扩展性,以及更好地遵循容器行业的标准。
具体原因如下:

K8S CRI
K8S发布CRI(Container Runtime Interface),统一了容器运行时接口,凡是支持CRI的容器运行时,皆可作为K8S的底层容器运行时。

例1:如果你使用Docker作为K8S容器运行时的话,kubelet需要先要通过dockershim去调用Docker,再通过Docker去调用containerd。
在这里插入图片描述
例2:如果你使用containerd作为K8S容器运行时的话,由于containerd内置了CRI插件,kubelet可以直接调用containerd。
在这里插入图片描述
好处:

使用containerd不仅性能提高了(调用链变短了),而且资源占用也会变小(Docker不是一个纯粹的容器运行时,具有

<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
发出的红包

打赏作者

听说唐僧不吃肉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值