K8s镜像拉取从90秒到8秒:本地Harbor加速与containerd配置实战

发布时间:2026/10/23 1:37:02
K8s镜像拉取从90秒到8秒:本地Harbor加速与containerd配置实战 1. 从 90 秒到 8 秒一次镜像拉取优化的完整复盘Pod 启动要等一分半这事放在测试环境还能忍一旦上了生产滚动更新的时候新副本迟迟不就绪旧副本又不敢轻易缩容整个发布窗口被硬生生拉长。我最近就碰到这么一档子事一个中等规模的业务集群节点数不算多部署频率也不算高但每次发版都卡在镜像拉取上kubectl describe pod一看事件里明晃晃写着Pulling image停留了几十秒。后来我把 containerd 的镜像仓库从默认的公共仓库换成了本地自建的 Harbor同样的镜像、同样的节点Pod 启动时间从 90 秒左右掉到了 8 秒上下。这篇文章就把整个过程拆开讲清楚为什么会慢、慢在哪一环、Harbor 怎么搭、containerd 怎么改、改完怎么验证以及中间踩过的那些坑。先说清楚这篇文章适合谁看。如果你正在维护 Kubernetes 集群遇到过镜像拉取超时、Pod 启动慢、滚动更新卡顿或者你正准备给团队搭一个内网镜像仓库那这篇内容基本可以照着抄。如果你只是刚接触 K8s对 containerd、镜像仓库这些概念还比较模糊也没关系我会把每个环节的原理用生活化的方式讲一遍保证你能看懂“为什么这么改”。核心关键词就三个K8s 镜像拉取慢、containerd 镜像仓库配置、本地 Harbor 加速部署。这三个词贯穿全文也是这次优化的全部主线。需要提前说明的是镜像拉取慢的原因从来不是单一的。公共仓库的网络抖动、镜像层数太多、节点并发拉取打满带宽、仓库限流、DNS 解析慢任何一个环节都可能成为瓶颈。我这次的情况是典型的“跨公网拉取 大镜像 多节点并发”组合拳所以换本地仓库的收益特别明显。但如果你的瓶颈在别的地方比如镜像本身做得太臃肿那换仓库只能解决一部分问题。所以我在讲操作的同时也会把排查思路一并交代清楚让你能判断自己的场景到底该不该这么改。2. 镜像拉取为什么这么慢先把瓶颈定位清楚2.1 一次 Pod 启动的完整链路拆解很多人看到 Pod 启动慢第一反应是“节点性能不行”或者“调度太慢”其实从kubectl apply到容器真正跑起来中间要经过好几个阶段每个阶段都可能耗时。我习惯把它拆成这么几段调度器选节点、kubelet 收到 Pod 规格、CRI 运行时这里是 containerd准备镜像、创建容器沙箱、启动容器、探针通过。镜像拉取属于第三段也是这次问题的重灾区。判断是不是卡在镜像拉取最直接的办法就是看 Pod 事件。执行kubectl describe pod pod-name -n namespace在 Events 区域你会看到类似这样的时间线Scheduled之后是Pulling然后隔了很久才出现Pulled再往后才是Created和Started。如果Pulling到Pulled之间的间隔特别大那基本可以锁定是镜像拉取的问题。我当时的记录是Pulling到Pulled之间稳定在 70 到 80 秒加上后面的沙箱创建和容器启动整体就奔着 90 秒去了。这里有个细节值得注意containerd 拉取镜像是分层进行的每一层都要单独下载、校验、解压。如果镜像有十几层而其中某一层特别大那这一层就会成为整个拉取过程的短板。你可以用crictl images看本地已有的镜像用crictl inspecti image看镜像的层信息。我当时那个业务镜像基于一个通用基础镜像构建光基础层就有好几百 MB叠加业务层之后总大小接近 1.2 GB跨公网拉一次确实够呛。2.2 公共仓库拉取慢的四个典型原因把这次的问题归因一下公共仓库拉取慢通常逃不出这四个原因。第一个是物理距离和网络路径公共仓库的服务器往往在境外或者跨多个网络节点中间任何一跳拥塞都会拖慢速度。第二个是并发拉取争抢带宽滚动更新时多个节点同时拉同一个镜像每个节点都从公网拉带宽被瓜分单个节点的速度就更慢。第三个是仓库侧限流很多公共仓库对匿名拉取或者免费额度有速率限制拉多了就被限速。第四个是DNS 解析和 TLS 握手开销每次拉取都要重新解析域名、建立连接层数多的时候这个开销会累积。我这次的情况是前两个原因叠加。集群节点分布在不同的网络区域跨公网访问公共仓库的延迟本来就不稳定再加上一次发布要更新好几个副本几个节点同时开拉速度直接掉到几百 KB 每秒。算一笔账1.2 GB 的镜像按 500 KB/s 算光下载就要 2400 秒当然实际因为有缓存和分层复用没这么夸张但慢是必然的。这也解释了为什么第一次拉取特别慢后续如果镜像层没变节点上有缓存就会快很多。提示判断是不是网络问题可以在节点上直接用crictl pull image手动拉一次观察耗时。如果手动拉也很慢那基本和 K8s 调度无关就是拉取链路的问题。2.3 为什么本地 Harbor 能解决大部分问题本地 Harbor 的核心价值就一个字近。仓库部署在内网节点访问它走的是局域网或者专线延迟从几十毫秒降到几毫秒带宽从公网的几百 KB 每秒变成内网的几十 MB 甚至上百 MB 每秒。同样是 1.2 GB 的镜像内网按 50 MB/s 算理论上 24 秒就能拉完实际因为有分层和并发8 秒左右完成完全合理。这就是从 90 秒到 8 秒的物理基础。除了快本地 Harbor 还有几个附带好处。一是可控镜像存在自己手里不依赖外部仓库的可用性公共仓库抽风的时候你照样能发布。二是可缓存Harbor 自带代理缓存功能可以把上游仓库的镜像缓存到本地第一次拉取之后后续都走本地。三是可管理镜像的清理、扫描、权限控制都能在 Harbor 里做团队协作的时候比直接用公共仓库规范得多。四是省流量多节点拉同一个镜像只消耗一次外网带宽其余都走内网。不过要提醒一句Harbor 不是银弹。如果你的镜像本身有 5 GB那内网拉取也要几十秒这时候该优化的是镜像构建比如换更小的基础镜像、合并层、清理构建缓存。Harbor 解决的是“传输链路”的问题解决不了“镜像太大”的问题。两者要分开看。3. 本地 Harbor 仓库搭建从零到可用3.1 部署前的资源规划与准备搭 Harbor 之前先把资源算清楚不然装到一半发现磁盘不够就很尴尬。Harbor 本身是个多容器应用包含核心服务、数据库、Redis、Registry、Jobservice 等组件官方推荐最低 2 核 4 GB 内存但这是“能跑起来”的底线实际生产用建议 4 核 8 GB 起步。磁盘是大头镜像存储会持续增长我一般按“现有镜像总量 × 3”来预留给历史版本和清理缓冲留空间。比如你预计镜像总量 200 GB那就准备 600 GB 以上的存储。网络方面Harbor 需要暴露两个端口一个是 Web 管理界面和 API 用的 HTTPS 端口默认 443另一个是镜像仓库用的端口默认 80 或者你自定义。内网部署的话建议给 Harbor 分配一个固定的内网域名比如harbor.internal.example然后在内网 DNS 里做好解析。这一步很关键因为后面 containerd 配置里要填仓库地址用域名比用 IP 好维护IP 变了不用改所有节点。如果内网没有 DNS 服务那就退而求其次用 IP但要在所有节点上保证能通。操作系统层面我习惯用主流的 Linux 发行版关闭不必要的防火墙规则但保留必要端口时间同步一定要做好Harbor 的证书校验和 token 机制对时间敏感节点之间时间偏差太大会导致认证失败。另外如果 Harbor 要存大量镜像建议单独挂一块数据盘把/data目录挂上去避免系统盘被写满。3.2 用容器化方式快速拉起 HarborHarbor 官方提供了离线安装包和在线安装包两种方式我这次用的是离线安装包因为目标机器在内网在线安装拉取依赖不方便。下载对应版本的离线包解压之后进入目录核心文件是harbor.yml.tmpl复制一份改名为harbor.yml然后编辑关键配置。需要改的地方主要有这几处。hostname填你的内网域名或者 IP。http和https二选一内网环境如果不想折腾证书可以先用 HTTP把https段注释掉http.port设成 80。但要注意containerd 默认对 HTTP 仓库有安全限制后面配置的时候要显式声明这是不安全仓库这个坑我在下一节会详细讲。harbor_admin_password设一个强密码别用默认的。data_volume指向你挂载的数据盘目录。database.password和redis相关密码也建议改掉。配置改完执行./install.sh脚本会自动拉取镜像、生成配置、启动容器。等它跑完用docker compose ps或者docker-compose ps看容器状态全部 healthy 就说明起来了。然后浏览器访问http://hostname用 admin 和你设的密码登录能进管理界面就成功了。第一次登录之后建议立刻创建一个项目比如叫library或者按业务线命名后面推送镜像就往这个项目里推。注意Harbor 的安装脚本依赖 Docker 和 Docker Compose如果目标机器上没装要先装好。另外安装过程中会拉取 Harbor 自身的镜像如果机器不能访问外网必须用离线包离线包里已经包含了所有需要的镜像。3.3 项目、用户与镜像推送验证Harbor 起来之后别急着改 containerd先在 Harbor 里把基础配置做完。创建一个项目设置好访问级别私有项目需要登录才能拉取公开项目匿名可拉。生产环境建议用私有项目配合机器人账号做自动化推送。机器人账号在“项目 - 机器人账户”里创建会生成一对用户名和密码这个账号专门给 CI 流水线用权限可以限定为只推不删比直接用 admin 安全得多。接下来验证推送。在任意一台能访问 Harbor 的机器上先docker login harbor-host输入账号密码。然后给一个本地镜像打 tag格式是harbor-host/project/image:tag比如harbor.internal.example/library/myapp:v1.0.0。执行docker push推上去回到 Harbor 界面能看到这个镜像和它的 tag就说明仓库工作正常。这一步的意义在于它验证了“写”的链路。而 K8s 节点需要的是“读”的链路两者用的协议一样但认证方式可能不同。节点上拉取镜像时containerd 需要配置仓库的认证信息否则私有项目会拉取失败。这个配置在下一节展开。另外推送验证的时候顺便观察一下推送速度如果内网推送都慢那说明 Harbor 所在机器的磁盘或者网络有问题得先解决不然拉取也快不了。4. containerd 镜像仓库改造核心配置全流程4.1 找到 containerd 的配置文件位置不同安装方式下containerd 的配置文件位置不一样这是很多人第一步就卡住的地方。用包管理器安装的 containerd主配置文件通常在/etc/containerd/config.toml。但 K8s 集群里kubelet 用的 containerd 配置可能被单独指定你要先确认 kubelet 启动参数里有没有--container-runtime-endpoint和相关的配置路径。更稳妥的办法是看 containerd 进程的实际启动参数ps aux | grep containerd能看到它加载的是哪个配置文件。还有一种常见情况是配置文件根本不存在因为 containerd 有默认配置没显式指定就用内置的。这时候你需要生成一份默认配置再改。执行containerd config default /etc/containerd/config.toml就能生成。生成之后先备份一份cp config.toml config.toml.bak改坏了能回滚。这个习惯很重要containerd 配置改错会导致运行时起不来进而整个节点的 Pod 都受影响。确认配置文件位置之后重点看两个地方。一个是[plugins.io.containerd.grpc.v1.cri.registry]这一段镜像仓库的配置都在这里。另一个是sandbox_image这个参数它指定了 Pod 沙箱用的 pause 镜像地址如果这个地址指向公共仓库也会拖慢沙箱创建。我这次顺手把它也改成了本地 Harbor 的地址效果更完整。4.2 registry 配置的两种写法与取舍containerd 配置镜像仓库有两种主流写法一种是老式的mirrors配置一种是新式的config_path配置。老式写法直接在 config.toml 里写[plugins.io.containerd.grpc.v1.cri.registry.mirrors] [plugins.io.containerd.grpc.v1.cri.registry.mirrors.docker.io] endpoint [https://harbor.internal.example]这种写法简单直接但有个问题它把所有对docker.io的请求都重定向到 Harbor如果 Harbor 里没有对应的镜像就会拉取失败除非 Harbor 开了代理缓存。而且这种写法不支持按仓库单独配置认证信息扩展性差。新式写法用config_path把每个仓库的配置拆成独立文件[plugins.io.containerd.grpc.v1.cri.registry] config_path /etc/containerd/certs.d然后在/etc/containerd/certs.d/下按仓库域名建目录比如harbor.internal.example/里面放一个hosts.tomlserver https://harbor.internal.example [host.https://harbor.internal.example] capabilities [pull, resolve] skip_verify false如果 Harbor 用的是 HTTP就把server改成http://并且加上skip_verify true。这种写法更清晰每个仓库独立配置认证信息也能单独放。我这次用的是新式写法因为后面还要配私有项目的认证拆开更好管理。两种写法不能混用选一种就行。提示改完配置一定要执行systemctl restart containerd重启服务光 reload 不一定生效。重启前确认节点上没有正在进行的镜像拉取避免中断。4.3 私有仓库认证与 HTTP 仓库的特殊处理私有项目拉取需要认证containerd 的认证信息放在certs.d/host/目录下的hosts.toml里通过[host.....header]传 Authorization 头或者用更规范的方式配置。实际操作用得比较多的是在 hosts.toml 里加[host.https://harbor.internal.example] capabilities [pull, resolve] [host.https://harbor.internal.example.header] authorization Basic base64编码的用户名:密码这个 base64 编码可以用echo -n user:pass | base64生成。但把密码明文放在配置文件里不太安全更好的做法是用 Harbor 的机器人账号权限最小化即使泄露影响也可控。如果集群规模大建议配合镜像拉取密钥imagePullSecrets在 Pod 层面做认证containerd 层面只配匿名可拉的公开项目。HTTP 仓库的处理是另一个高频坑。containerd 默认只信任 HTTPS 仓库如果 Harbor 用 HTTP必须在 hosts.toml 里显式声明skip_verify true并且把server写成http://。但即便如此某些 containerd 版本还会因为“不安全仓库”的检查而拒绝这时候要在 config.toml 的 registry 段里加上[plugins.io.containerd.grpc.v1.cri.registry.configs.harbor.internal.example.tls] insecure_skip_verify true两个地方都配上才稳妥。我一开始只改了 hosts.toml结果拉取报http: server gave HTTP response to HTTPS client排查了半天才发现是 config.toml 里没声明。这个错误信息其实很明确看到就知道是协议不匹配。4.4 改完配置后的验证与回滚方案配置改完重启 containerd 之后别急着发版先手动验证。在节点上执行crictl pull harbor.internal.example/library/myapp:v1.0.0看能不能拉下来耗时多少。如果报认证错误检查 hosts.toml 里的 header 配置如果报证书错误检查 skip_verify如果报连接超时检查节点到 Harbor 的网络连通性curl -v http://harbor.internal.example/v2/能返回 401 或者 200 就说明网络通。验证通过之后再跑一个测试 Pod用kubectl run起一个用本地 Harbor 镜像的 Pod看describe里的Pulling到Pulled间隔。我实测下来同样的镜像从 70 多秒降到了 5 秒以内加上沙箱创建和容器启动整体 8 秒左右。这个数字和标题里说的完全对得上。回滚方案也要提前想好。万一改完 containerd 起不来节点上的 Pod 会全部异常这时候要能快速恢复。备份的config.toml.bak就是救命稻草cp回去再重启 containerd 即可。如果节点已经不可用kubectl 也连不上那就得通过带外管理或者 SSH 直接操作节点。所以改配置最好一台一台来改完一台验证一台确认没问题再推下一台别一次性全量改。5. 效果验证与性能对比数据说话5.1 改造前后的关键指标对比光说“快了”不够有说服力我把改造前后的关键指标整理成表格方便你对照自己的场景。指标项改造前公共仓库改造后本地 Harbor镜像总大小约 1.2 GB约 1.2 GB单层最大约 600 MB约 600 MB拉取耗时70-80 秒4-6 秒Pod 整体启动约 90 秒约 8 秒多节点并发拉取明显互相拖慢基本无影响发布窗口5-8 分钟1 分钟以内这个对比是在同一批节点、同一个镜像、同样的网络环境下测的唯一变量就是仓库地址。拉取耗时的测量方式是看kubectl describe pod里Pulling和Pulled两个事件的时间差多测几次取平均。Pod 整体启动是从kubectl apply到 Pod 状态变成Running且探针通过的时间。需要说明的是改造后的 4-6 秒是首次拉取如果节点上已经有镜像层缓存会更快基本就是秒级。而改造前的 70-80 秒也是首次拉取后续有缓存会快一些但滚动更新时新节点或者缓存被清理的节点依然要经历这个慢过程。所以本地 Harbor 的收益在“频繁发布 多节点”的场景下最明显。5.2 用真实发布流程验证稳定性单次拉取快不代表发布流程就顺畅我特意跑了几轮完整的滚动更新来验证。改造前一次更新 6 个副本因为maxUnavailable设的是 1新副本要等旧副本就绪才能继续结果整个发布拖了 6 分多钟中间还因为拉取超时失败过一次触发了回滚。改造后同样的 6 个副本新副本基本是秒起滚动更新 40 秒左右就完成了全程没有超时。这里有个细节值得分享滚动更新的速度不只取决于拉取还取决于就绪探针的配置。如果探针initialDelaySeconds设得太大即使容器已经起来了也要等探针通过才算就绪。我这次顺手把探针的初始延迟从 30 秒调到了 10 秒配合本地 Harbor 的快速拉取整体发布速度又提了一截。所以优化是个组合拳拉取只是其中一环。另外我还观察了 Harbor 侧的负载。6 个节点同时拉取Harbor 的 CPU 和网络都没打满说明它的承载能力还有余量。如果你的集群节点数很多比如上百个节点同时发布那 Harbor 的规格要相应提高必要时可以做多实例或者加缓存层。这个要根据实际规模评估不能一概而论。5.3 长期运行后的镜像清理与容量管理Harbor 用起来之后镜像会越积越多尤其是 CI 流水线频繁构建的场景每天可能产生几十个 tag。如果不清理磁盘很快就会被写满。Harbor 自带的清理功能可以按 tag 保留策略来删比如只保留最近 10 个 tag或者只保留最近 30 天的。配置在“项目 - 策略”里可以设置保留规则然后手动或者定时触发清理。清理的时候要注意正在被节点使用的镜像如果被删了节点上虽然有缓存还能跑但一旦节点重建或者缓存被清理就会拉取失败。所以保留策略要留足缓冲别把正在用的版本删了。我的做法是给生产环境的镜像打上明确的版本 tag保留策略只针对带特定前缀的临时 tag 生效正式版本手动管理。这样既控制了容量又不会误删。还有一个容量相关的点是 Harbor 的垃圾回收。删除 tag 只是删了引用实际的 blob 数据还在要执行垃圾回收才能释放磁盘。垃圾回收在 Harbor 的管理界面里可以手动触发也可以配定时任务。回收期间仓库会只读建议放在低峰期做。我一般每周跑一次配合监控看磁盘使用率保持在 70% 以下比较安心。6. 常见问题与排查技巧实录6.1 拉取报错的典型错误与对应解法改 containerd 配置的过程中报错是难免的我把遇到的几个典型错误和排查思路整理出来方便你对照。错误信息可能原因解决方法http: server gave HTTP response to HTTPS clientHarbor 用 HTTPcontainerd 按 HTTPS 访问hosts.toml 和 config.toml 都声明 insecurex509: certificate signed by unknown authorityHarbor 用自签证书节点不信任把 CA 证书放到节点信任目录或 skip_verify401 Unauthorized私有项目未配置认证配置机器人账号或 imagePullSecretsconnection refused节点到 Harbor 网络不通检查防火墙、DNS、端口no such host域名解析失败检查内网 DNS 或改用 IPcontext deadline exceeded拉取超时检查 Harbor 负载和网络带宽这些错误里前两个是最常见的基本占了八成。http那个错误信息很直白看到就知道是协议问题。证书那个稍微绕一点自签证书在内网很常见解决办法要么是把 CA 证书分发到所有节点要么是 skip_verify。生产环境建议用正规证书或者内部 CAskip_verify 只适合测试环境。注意skip_verify 会跳过证书校验存在中间人风险内网可信环境可以用跨网络环境慎用。6.2 配置不生效的排查顺序有时候配置改了、服务也重启了但拉取还是走公共仓库这就说明配置没生效。排查顺序我总结成四步。第一步确认 containerd 真的加载了你改的那个配置文件ps aux | grep containerd看启动参数或者containerd config dump看实际生效的配置。第二步确认配置语法正确TOML 格式对缩进和引号敏感一个引号写错整段就失效可以用containerd config dump验证能不能解析。第三步确认重启生效systemctl restart containerd之后看服务状态systemctl status containerd是 active 才行。第四步确认镜像地址匹配你的镜像 tag 前缀必须和配置的仓库域名一致否则 containerd 不会走你配的仓库。我踩过的一个坑是镜像 tag 写的是 IP但配置里写的是域名结果 containerd 认为是两个不同的仓库配置没匹配上。所以镜像 tag 的前缀和 hosts.toml 的目录名必须严格一致大小写、端口号都不能差。这个细节很容易忽略排查的时候要特别留意。6.3 多节点批量配置的高效做法集群节点多的时候一台一台改配置效率太低而且容易漏。我的做法是写一个配置分发脚本把 hosts.toml 和 config.toml 的改动做成模板通过配置管理工具或者简单的 SSH 批量推送。推送之后统一重启 containerd再统一验证。脚本里要包含备份逻辑每台机器改之前先备份原配置出问题能快速回滚。批量操作的风险在于如果模板有问题会一次性影响所有节点。所以我的习惯是先在 1 到 2 台节点上灰度验证通过再全量。灰度节点选那种承载非核心业务的万一出问题影响面小。全量推送的时候分批进行比如一次推 20%观察几分钟没问题再推下一批。这样即使有问题也能把影响控制在可接受范围内。另外配置分发之后要有一个统一的验证脚本检查每台节点的 containerd 状态、配置是否生效、能否拉取测试镜像。验证脚本的输出汇总成一张表哪些节点通过、哪些失败一目了然。失败的节点单独处理不要带着问题继续。这套流程跑顺了之后后续再改配置就轻松多了。7. 一些实操心得与后续优化方向7.1 镜像构建层面的配合优化Harbor 解决了传输问题但如果镜像本身能瘦身效果会更好。我在改完仓库之后顺手做了一轮镜像优化。基础镜像从完整版换成了精简版体积从几百 MB 降到几十 MB。构建的时候用多阶段构建把编译工具链和运行时分开最终镜像只保留运行时需要的文件。层数也做了合并把多个RUN指令合并成一个减少层数。这一套下来镜像从 1.2 GB 降到了 400 MB 左右配合本地 Harbor拉取时间进一步压缩到 2 秒以内。镜像优化的原则是“只放必要的”。构建缓存、临时文件、测试依赖这些都不应该出现在最终镜像里。.dockerignore文件要配好别把无关文件打进构建上下文。基础镜像的选择上能用 alpine 就别用 ubuntu能用 distroless 就更极致。但也要权衡alpine 用的是 musl libc某些依赖 glibc 的程序可能跑不起来这时候就得换回 debian 系的精简版。这个要根据实际业务测试不能盲目追求小。7.2 监控与告警的补充配置优化做完不是终点还得有监控兜底。我在 Harbor 上配了基础的监控关注几个指标仓库的请求量、拉取耗时、磁盘使用率、容器健康状态。这些指标可以通过 Harbor 暴露的 metrics 接口采集接入现有的监控系统。告警规则设两条一条是磁盘使用率超过 80%一条是拉取失败率超过阈值。这样即使后面出问题也能第一时间发现。节点侧也加了监控关注 containerd 的拉取耗时和失败次数。containerd 本身有 metrics 接口可以采集镜像拉取的相关指标。配合日志拉取失败的时候能快速定位是网络问题、认证问题还是仓库问题。监控这东西平时看着没用出问题的时候就是救命稻草。花点时间配上比事后救火划算得多。7.3 这套方案还能怎么扩展本地 Harbor 这套方案跑顺之后还能往几个方向扩展。一个是多集群共享如果公司有多个 K8s 集群可以共用一个 Harbor通过项目隔离权限镜像只存一份省存储也省维护。另一个是跨地域复制如果集群分布在不同地域可以在各地部署 Harbor配置仓库复制让每个地域的节点就近拉取。Harbor 自带复制功能支持定时和触发式复制。再往深了做可以结合镜像签名和扫描保证镜像来源可信、没有已知漏洞。Harbor 支持内容信任和漏洞扫描配合 CI 流水线在推送镜像的时候就完成扫描有高危漏洞的直接拦截。这套做下来镜像管理就从“能用”升级到“安全可控”了。当然这些是进阶内容先把基础的拉取加速做好再逐步往上加。我个人在实际操作中的体会是镜像拉取慢这个问题排查起来不难难的是下定决心去改。很多人觉得“慢就慢点能跑就行”但发布效率的损失是实打实的。花半天时间搭个 Harbor、改个配置换来的是每次发布省下的几分钟和更稳定的发布流程这笔账怎么算都划算。最后再分享一个小技巧改完配置之后把整个流程写成文档包括配置模板、验证脚本、回滚步骤下次再遇到类似问题直接照着文档走不用重新踩一遍坑。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询