ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

用RustFS给Harbor当S3存储后端

用RustFS给Harbor当S3存储后端 不少团队的 Kubernetes 边上跑着 Harbor 存镜像另有一套对象存储存 AI 训练数据两套存储栈各管各的Harbor 用本地盘或 NFS 挂/data对象存储单独养。结果一边磁盘报警一边对象存储利用率才三成。其实 Harbor 的 registry 存储原生支持 S3 兼容驱动只要把后端指到现有对象存储镜像 blob 就直接落进去容量、冗余、备份都跟着对象存储走。下面用一份能直接抄的harbor.yml把 Harbor 的存储后端切到自建 S3 端点并说清专用账号、签名版本和验证这几道关。为什么让 Harbor 用对象存储后端Harbor 的storage_service可以选filesystem默认挂本地盘或s3兼容 S3 的对象存储。切到 S3 之后容量跟着对象存储走。不用再给 Harbor 节点单独扩盘纠删码池多大镜像仓就能用多大。一套存储栈服务多个系统。Harbor 镜像、CI 产物、AI 训练数据湖如果落在同一个集群运维、备份、监控都只做一遍。多实例共享后端。Harbor 的 registry 组件本身无状态多个实例指向同一个 bucket 就能共享镜像层扩副本不用搬数据。这不是把对象存储当网盘硬塞而是 registry 官方存储驱动的能力配置入口就在harbor.yml的storage_service段。先把桶和专用身份建好别用管理员账号直接给 Harbor 用建一个只管镜像桶的专用 IAM 用户更干净。以 RustFS 为例rc 客户端rcaliassetrustfs http://rustfs:9000$RUSTFS_ACCESS_KEY$RUSTFS_SECRET_KEYrc mb rustfs/harbor-registry rc admin useraddrustfs harbor_s3ChangeMe-Strong-Secretcatharbor-policy.jsonEOF { Version: 2012-10-17, Statement: [ { Effect: Allow, Action: [s3:ListBucket, s3:GetBucketLocation], Resource: [arn:aws:s3:::harbor-registry] }, { Effect: Allow, Action: [s3:GetObject, s3:PutObject, s3:DeleteObject, s3:ListMultipartUploadParts], Resource: [arn:aws:s3:::harbor-registry/*] } ] } EOFrc admin policy create rustfs harbor-policy harbor-policy.json rc admin policy attach rustfs harbor-policy harbor_s3内置的readwrite策略虽然省事但它对所有桶开放读写和权限收在镜像桶里矛盾所以这里用自定义策略。镜像层上传走 multiparts3:ListMultipartUploadParts别漏。服务端 1.0.0 已于 2026 年 9 月 16 日 GArc 启动的服务必须显式设置RUSTFS_ACCESS_KEY/RUSTFS_SECRET_KEY默认口令已废弃。harbor.yml 的 s3 段怎么写关键在storage_service从filesystem换成s3storage_service:s3:region:us-east-1# 驱动要求非空占位即可regionendpoint:http://rustfs:9000# S3 端点注意不是 endpointforcepathstyle:true# distribution 3 用 regionendpoint 必须配bucket:harbor-registryaccesskey:harbor_s3secretkey:harbor_s3 的 secretencrypt:false# 加密可交给存储侧 SSE避免双层加密secure:false# 内网 http走 TLS 再改 truev4auth:true# AWS SigV4 签名chunksize:16777216# 分块上传大小字节默认 10 MB三个容易踩的点都以 distribution 官方存储驱动文档为准参数名是v4auth不是网上老教程里的v4signature。较新的 registry 版本里 S3 兼容端点必须走 SigV4 签名这一项配漏或写错Harbor 启动后推镜像会报签名不匹配。distribution 3 起regionendpoint必须和forcepathstyle: true搭配使用官方文档原话是强制路径式访问是必要的。对应较新的 Harbor 版本要把这一行带上老版本 registry 没有这个字段不用加。chunksize的单位是字节默认 10 MBS3 API 要求分块至少 5 MB。镜像层普遍是大文件网络好可以调大。改完配置执行./prepare重新生成 Compose 文件然后docker compose up -d生效。部署与验证cd/path/to/harbor ./preparedockercompose downdockercompose up-ddockerlogin harbor.example.comdockertag nginx:latest harbor.example.com/library/nginx:testdockerpush harbor.example.com/library/nginx:test rclsrustfs/harbor-registry注意第 2 步docker push的目标是 Harbor 本身harbor.yml里的hostname存储端点只接收 Harbor 后端写下来的 blob两者别混。推成功且rc ls能在桶里看到docker/registry/...键说明链路通了。Harbor 控制台的镜像列表、标签、复制策略都不用改只是底层存储换了地方。边界与代价存量数据不迁移。从filesystem切到s3只影响新写入的 blob本地盘上的历史镜像不会自动搬过去要么走 Harbor 的复制规则同步一次要么接受旧镜像留在原地。GC 不会自动跑。镜像删了底层 layer blob 不会立刻释放需要在 Harbor 里触发垃圾回收或配定时任务才真正腾出空间。分片碎片会自己长出来。registry 组件内部有个清理未使用分片的任务默认每 168 小时跑一轮它是 registry 进程的固有行为不重启就关不掉。推镜像中断、并发 part 被掐断残留都堆在 upload 目录。想备份 Harbor 数据卷把这一轮的间隔调大、或者卡在两轮中间下手别在清理跑到一半时抓文件。桶里只有镜像层Harbor 自己的库还得单独备份。对象存储那一侧存的是 registry 的 manifest 和 layer blob而项目、仓库、artifact、tag、权限、复制任务、扫描结果这些元数据在 Harbor 内置的 PostgreSQL 里Compose 部署就是 database 那个容器harbor.yml、证书和私钥也在安装目录。官方对备份范围的限制写得很明确只支持 Harbor 内部数据库外部数据库不在支持范围内Redis 的卷也不进备份恢复之后已登录用户的会话会丢。恢复顺序是数据库先、镜像数据后两边对不上会出现页面上能看到标签但 pull 不到层的状态。redirect 模式想清楚再开。开启后 registry 会把对象存储的预签名 URL 直接返回给 docker 客户端流量绕过 Harborregistry 压力小很多代价是客户端必须能直接访问存储端点内网环境通常把redirect.disable设为true让流量走注册表。网络与加密。secure: false假设 Harbor 与存储在同一可信网络跨网段给存储端点挂 TLS 反向代理再把secure改true。落盘加密交给存储侧的 SSE 即可不必在 registry 层重复加密。镜像仓并入对象存储栈之后容量规划和备份节奏都归到存储这一层Harbor 节点自己只剩元数据和 UI。RustFS 1.0.0 已于 2026 年 9 月 16 日 GA源码和 issue 在 github.com/rustfs/rustfsHarbor 的配置参考在 goharbor.ioregistry s3 驱动的参数细节在 distribution 文档。
返回列表