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 ...
- Docker:
内容的提问来源于stack exchange,提问作者Luis Roset
相关产品推荐
相关产品推荐

