containerd镜像加速器配置全攻略:从老版本到新版本的平滑迁移

张开发
2026/4/16 12:48:25 15 分钟阅读

分享文章

containerd镜像加速器配置全攻略:从老版本到新版本的平滑迁移
1. 为什么需要containerd镜像加速器第一次用containerd拉取镜像时我盯着屏幕上的进度条整整等了20分钟。那种煎熬让我深刻理解了一个道理没有镜像加速器的containerd就像没有高速公路的物流系统每个字节都要绕地球半圈才能到达你的机器。镜像加速器本质上是个本地缓存代理。当你的容器运行时需要拉取镜像时它会先检查加速器节点是否有缓存。有就直接从本地或邻近节点获取没有才会去原始仓库拉取。实测下来使用国内优质加速器能让镜像下载速度提升5-10倍特别是对于docker.io、gcr.io这些海外仓库效果更明显。这里有个常见的误区要提醒很多人以为配置了Docker的加速器就能自动作用于containerd。实际上containerd作为更底层的运行时需要单独配置。我见过不少团队在Kubernetes集群里折腾半天最后发现是containerd没配加速器导致部署卡顿。2. 老版本1.5之前配置详解2.1 配置文件定位与修改老版本的配置集中在单个config.toml文件里这个设计有利有弊。好处是所有配置一目了然缺点是每次修改都要重启服务。我建议操作前先备份原配置cp /etc/containerd/config.toml /etc/containerd/config.toml.bak用vim或nano编辑配置文件时关键是要找到正确的配置段。很多新手会卡在这个环节这里分享个快速定位的技巧grep -n registry.mirrors /etc/containerd/config.toml找到类似这样的段落[plugins.io.containerd.grpc.v1.cri.registry.mirrors] [plugins.io.containerd.grpc.v1.cri.registry.mirrors.docker.io] endpoint [https://registry-1.docker.io]2.2 多加速器配置实战我推荐同时配置多个加速器地址作为fallback。这是我在生产环境总结的经验[plugins.io.containerd.grpc.v1.cri.registry.mirrors.docker.io] endpoint [ https://你的加速器地址1, https://你的加速器地址2, https://registry-1.docker.io # 官方源作为兜底 ]配置完成后必须执行systemctl restart containerd使配置生效。这里有个坑要注意如果containerd启动失败很可能是TOML格式有问题建议用containerd config dump /etc/containerd/config.toml生成新配置再修改。3. 新版本1.5配置方案3.1 目录结构解析新版本采用了更灵活的目录结构设计每个registry可以有自己的配置目录。第一次看到这个改动时我很困惑但用久了发现这其实是个进步。新的/etc/containerd/certs.d目录结构是这样的/etc/containerd/certs.d/ └── docker.io └── hosts.toml └── gcr.io └── hosts.toml这种结构的好处显而易见不同registry配置完全隔离添加/删除加速器不用修改主配置可以针对不同registry设置不同策略3.2 hosts.toml配置详解hosts.toml的配置语法比老版本更强大。这是我常用的一个生产级配置server https://docker.io [host.https://加速器地址1] capabilities [pull, resolve] [host.https://加速器地址1.header] Authorization [Basic base64认证信息] [host.https://加速器地址2] capabilities [pull, resolve] skip_verify true # 对于自签名证书有用特别注意server字段必须与目录名匹配。比如docker.io目录下的hosts.toml就必须设置serverhttps://docker.io这是很多新手容易忽略的点。4. 平滑迁移实践指南4.1 双版本共存方案在迁移过渡期我建议采用这样的策略保持老配置不变新增新版本配置通过--hosts-dir参数测试新配置确认无误后再移除旧配置测试命令示例ctr images pull docker.io/library/nginx:alpine \ --hosts-dir/etc/containerd/certs.d4.2 常见问题排查迁移过程中我遇到最多的三个问题证书错误表现为x509报错sudo mkdir -p /etc/docker/certs.d/加速器域名 sudo cp 证书文件 /etc/docker/certs.d/加速器域名/ca.crt权限问题特别是SELinux环境下chcon -R -t container_config_t /etc/containerd/certs.d缓存冲突有时需要清理旧缓存ctr images ls -q | xargs -r ctr images rm5. 性能测试与优化5.1 基准测试方法我习惯用time命令配合不同镜像测试加速效果time ctr images pull docker.io/library/redis:6.2 \ --hosts-dir/etc/containerd/certs.d建议测试三个场景完全无缓存首次拉取加速器有缓存的热拉取官方源直连拉取5.2 高级优化技巧对于大型集群还可以考虑这些优化区域路由根据不同节点地理位置配置不同的加速器# 华北节点 endpoint [https://cn-north-1.mirror.aliyuncs.com] # 华南节点 endpoint [https://cn-south-1.mirror.aliyuncs.com]预加载镜像在低峰期预先拉取常用镜像for img in nginx redis mysql; do ctr images pull docker.io/library/$img:latest done私有缓存搭建本地registry作为二级缓存[host.http://内部registry:5000] capabilities [pull, resolve] override_path true6. 生产环境最佳实践在帮多个企业实施containerd加速方案后我总结了这些经验版本检查脚本在所有节点运行containerd --version | cut -d -f 3配置验证工具检查配置有效性containerd config verify灰度发布策略先对10%节点应用新配置监控指标重点关注这些metriccontainerd_image_pull_duration_secondscontainerd_image_pull_failures_total灾备方案保留直连官方源的fallback配置[host.https://registry-1.docker.io] capabilities [pull, resolve]最后提醒一个容易忽视的细节当使用Kubernetes时kubelet有自己独立的镜像拉取超时设置默认1分钟如果镜像较大可能需要调整--image-pull-progress-deadline参数。

更多文章