You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CentOS7升级Docker至最新版并解决K8s CoreDNS与Flannel部署问题

问题解答

1. Flannel故障是否由Docker版本不兼容导致?

是,Docker 1.13.1与Kubernetes v1.26.2存在严重版本不兼容,这是引发Flannel及CoreDNS故障的核心原因之一,具体关联点包括:

  • Kubernetes v1.26的官方兼容规范要求容器runtime需满足CRI(容器运行时接口)v1alpha2及以上标准,而Docker 1.13.1内置的containerd版本极低,完全不支持该CRI规范,会导致K8s无法正常与runtime交互,CNI网络插件(如Flannel)无法被正确初始化。
  • 老版本Docker的镜像拉取协议、TLS支持存在局限性,可能导致Flannel Init容器无法拉取所需镜像,触发Init:ImagePullBackOff。
  • 同时运行老版本Docker和独立containerd时,二者可能共享或干扰CNI配置目录(如/opt/cni/bin),导致你手动创建的10-flannel.conflist无法被正确识别,进而CoreDNS因网络未就绪处于ContainerCreating状态。

2. 若因Docker版本问题,是否只能通过卷保存数据后删除重建容器来迁移?

并非只能通过删除重建容器的方式,根据你的场景可选择以下几种更灵活的方案:

方案一:升级Docker到兼容版本(保留现有容器)

Kubernetes v1.26兼容Docker 20.10.x及以上版本,CentOS环境下可按以下步骤操作:

  • 停止Docker服务:systemctl stop docker
  • 备份现有Docker配置文件:cp /etc/docker/daemon.json /etc/docker/daemon.json.bak
  • 卸载旧版本Docker包:yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
  • 安装Docker 20.10.x版本:
    yum install -y yum-utils
    yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
    yum install docker-ce-20.10.24 docker-ce-cli-20.10.24 containerd.io
    
  • 启动Docker服务并设置开机自启:systemctl start docker && systemctl enable docker
  • 恢复配置文件并重启Docker:cp /etc/docker/daemon.json.bak /etc/docker/daemon.json && systemctl restart docker
  • 重启之前的容器:docker start $(docker ps -aq)

    此方案下,现有容器的数据卷(默认存储在/var/lib/docker/volumes)不会丢失,升级后可直接恢复运行。

方案二:迁移现有Docker容器到独立containerd(不再使用Docker)

若你计划完全使用containerd作为K8s及容器的runtime,可按以下步骤迁移:

  • 导出现有Docker容器为镜像:docker save -o my-container.tar <容器镜像名>
  • 导入镜像到containerd:ctr images import my-container.tar
  • 停止并禁用Docker服务:systemctl stop docker && systemctl disable docker
  • 使用containerd重新创建容器(需手动指定卷挂载、网络等参数):
    ctr run --rm -d --mount type=bind,src=/host/path,dst=/container/path <镜像名> <容器名>
    
  • 清理旧Docker相关文件(可选):rm -rf /var/lib/docker

方案三:备份卷数据后重建容器(适合容器数量较少的场景)

  • 备份容器数据卷:cp -r /var/lib/docker/volumes/<卷名> /backup/path/
  • 卸载旧Docker并安装兼容版本或containerd
  • 重新创建容器时,挂载备份的卷目录:
    • Docker:docker run -v /backup/path/<卷名>:/container/path ...
    • containerd:ctr run --mount type=bind,src=/backup/path/<卷名>,dst=/container/path ...

内容的提问来源于stack exchange,提问作者Luis Roset

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:25:08