代理缓存: 对未缓存 Blob 的范围请求被忽略,完整 Blob 返回为 200,导致懒加载 (nydus) 失败
作者: IceCream-jy创建于 2026年9月9日更新于 2026年9月14日
标签kind/requirementarea/proxy-cache
当 Harbor 用作拉伸缓存(代理缓存项目)时,且请求的 Blob **尚未在本地缓存**,带有 `Range` 头的 Blob `GET` 请求将不被执行:Harbor 会丢弃 `Range`,从上游注册服务器拉取整个 Blob,并以纯 `200` 的形式流式传输。这破坏了依赖于有范围的 Blob 获取的图像懒加载解决方案(nydus)。**环境** Harbor v2.15.2(代理缓存项目) nydusd 2.x 客户端 **影响** `nydusd`(nydus 后端)会在按需读取范围内的 Blob 时出现问题。通过 Harbor 代理缓存项目进行冷冲突时,第一个范围内的 Blob 读取会演变为整个 Blob 的传输 — 并且随着后台缓存填充,上游会看到 Blob 被下载了 **两次**。懒加载实际上变成了迫切的全下载,对大型 Blob 的首次 I/O 延迟严重。 **是否有可能做出此更改:** 在带有单个范围 `Range` 头的缓存冲突中,将范围转发给上游注册服务器并转发上游响应: - 上游 `206` → 通过 `Content-Range`、`Content-Length`、`Docker-Content-Digest`、`ETag` 转发 `206` - 上游 `200`(注册服务器根据 OCI 分发规范可选支持范围) → 转发完整的 `200` - 多范围/后缀范围/不可解析 → 回退到当前的全拉取路径
内容来源: goharbor/harbor