ARTICLE DETAIL

资讯详情

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

Harbor 复制策略(Replication Policy)创建指南:UI 实操与源码级原理解析

Harbor 复制策略(Replication Policy)创建指南:UI 实操与源码级原理解析 Harbor 复制策略Replication Policy创建指南UI 实操与源码级原理解析【免费下载链接】harborAn open source trusted cloud native registry project that stores, signs, and scans content.项目地址: https://gitcode.com/GitHub_Trending/ha/harborHarbor 的复制Replication机制允许将制品镜像、Chart 等从源 Registry 自动或手动同步到一个或多个目标 Registry是构建多集群、跨机房镜像分发体系的核心能力。本文以官方测试用例 7-01-Proj-replication-rules-add.md 为骨架完整讲解如何在 Harbor UI 中创建复制策略含全局与项目级两种入口的完整步骤并结合仓库源码剖析策略模型、触发机制与执行流程的底层实现帮助你既会点按钮也理解背后发生了什么。一、前置条件准备两个 Harbor 实例复制必然涉及源与目标两个 Registry。根据测试用例的要求本场景至少需要两台 Harbor 实例处于运行且可访问的状态源实例存放待复制的制品镜像仓库由本策略的Projects选择器圈定范围目标实例作为复制目的地在创建策略时通过目标注册表Endpoint指定若尚未配置需在创建策略过程中现场新建。说明复制策略中的源或目标二者其一必须是当前 Harbor 实例自身。这一约束在源码层的策略校验中强制保证详见第三节因此使用两台实例分别扮演源与目标是最典型的拓扑。二、创建复制策略的完整步骤UI 实操测试用例 7-01 给出了标准操作路径共 8 个步骤并在两个入口重复执行验证全局入口Administration → Replications与项目入口Projects → Project_Name → Replication。步骤 1以管理员身份登录使用admin 账号登录 Harbor UI。复制策略的创建属于系统级敏感操作API 层在CreateReplicationPolicy处理函数中通过r.RequireSystemAccess(ctx, rbac.ActionCreate, rbac.ResourceReplicationPolicy)进行 RBAC 权限校验见 replication.go因此需要系统管理员权限。步骤 2进入复制页面并新建规则导航到Administration → Replications点击新建规则New Replication Rule打开创建表单填写名称Name与描述Description。名称是策略的唯一标识在策略校验Validate()中Name为空会直接返回BadRequestCode错误empty name见 model.go。步骤 3选择源项目Projects点击Projects字段右侧的图标在弹出的选择器中选择要复制的源项目。选择项目本质上是在为策略生成一个基于名称的过滤器。源码中复制过滤器类型FilterTypeName name见 policy.go其值即项目/仓库名称匹配模式从旧版本升级而来的策略还会自动将旧式repository过滤器合并进name过滤器以保持兼容见 model.go 的parseFilters逻辑。步骤 4添加仓库与标签过滤器Filters为策略添加过滤规则决定哪些制品会被纳入复制范围。Harbor 支持四类过滤器类型定义见 policy.go过滤器类型取值说明name字符串仓库名称匹配模式如library/**支持通配符*/**tag字符串标签匹配模式如v1.*label字符串数组按制品标签过滤值为多个标签名的数组resourceimage或artifact按制品类型过滤镜像或广义制品其中name与resource过滤器不允许携带decoration修饰符tag过滤器可携带decoration取值只能是matches匹配默认或excludes排除。这些约束均由Filter.Validate()强制校验见 policy.go非法组合会返回 400 错误。兼容性提示旧版本策略中kind repository / tag / label的过滤器格式会被自动转换为新的type格式旧的标签过滤器kind label在新版本中会被直接丢弃见 model.go从旧版本升级时请注意核对。步骤 5选择目标注册表Endpoint为策略指定复制目的地。若列表中已有可用端点则直接选用否则点击新建配置提供者ProviderHarbor 内置了丰富的适配器支持的类型常量定义在 registry.go包括harbor、docker-hub、docker-registry、aws-ecr、azure-acr、ali-acr、google-gcr、quay、gitlab、jfrog-artifactory、dtr、tencent-tcr、github-ghcr、volcengine-cr、helm-hub、artifact-hub等端点地址URL目标 Registry 的访问地址访问凭证CredentialCredentialTypeBasic用户名/密码或CredentialTypeOAuthOAuth Token定义见 registry.go验证远程证书 / 是否使用不安全连接对应模型中的Insecure与CACertificate字段见 registry.go。步骤 6选择触发条件Trigger复制策略支持三种触发类型常量定义于 policy.go触发类型常量值行为立即Immediateevent_based源端发生推拉、打标签等事件时自动触发复制手动Manualmanual仅在 UI 或 API 上手动点击复制时执行定时Scheduledscheduled按 Cron 表达式周期性执行若选择Immediate事件驱动触发表单会出现Delete remote images when locally deleted复刻删除操作选项对应策略字段ReplicateDeletion勾选当源端删除制品或标签时事件处理器会同步删除目标端对应制品。事件处理器在 init.go 中订阅了TopicPushArtifact、TopicDeleteArtifact、TopicCreateTag、TopicDeleteTag四类事件并转发给 replication Handler不勾选删除操作不会扩散到目标端。在 API 层面该字段同时兼容旧字段名deletion已标记 Deprecated见 swagger.yaml。步骤 7勾选/取消 Replicate existing images immediately该选项决定策略保存后是否立即对现有制品执行一次复制。勾选时策略创建后会立刻触发一次执行将当前符合过滤条件的存量制品同步到目标端取消时策略仅就位等待后续触发条件事件/定时/手动驱动。步骤 8保存规则点击保存。策略将被持久化到数据库replication_policy表ORM 模型见 model.go字段包括name、description、src_registry_id、dest_registry_id、dest_namespace、override、enabled、triggerJSON 字符串、filtersJSON 字符串、replicate_deletion、speed_kb、copy_by_chunk、single_active_replication等。预期结果保存成功后规则出现在复制策略列表中即创建成功。若创建的是定时触发策略控制器还会同步向调度器注册一个 Cron 任务详见第四节。项目级入口Projects → Project_Name → Replication重复步骤 1-8但入口改为项目内的Replication页签。两者创建的是同一种策略对象区别仅在于全局入口创建的策略可覆盖任意项目范围通过步骤 3 的项目选择器指定源项目项目级入口相当于将源项目预绑定为当前项目适合在项目维度管理该项目的复制规则权限模型上归属为项目资源。三、策略数据模型与校验规则源码解析策略的完整字段Harbor 复制策略的核心数据结构定义在 model.goPolicy ├── ID / Name / Description / Creator # 基础信息 ├── SrcRegistry / DestRegistry # 源 / 目标注册表二者一空一非空 ├── DestNamespace # 目标命名空间可空 ├── DestNamespaceReplaceCount # 目标命名空间替换的路径组件数-1 为 legacy 模式 ├── Filters # 过滤器数组name/tag/label/resource ├── Trigger # 触发配置类型 Cron 设置 ├── ReplicateDeletion # 是否复刻删除操作 ├── Override # 是否覆盖目标端同名资源 ├── Enabled # 策略是否启用 ├── Speed # 每个任务的速率限制KB/s ├── CopyByChunk # 是否启用分块复制 └── SingleActiveReplication # 是否只允许单个活动执行其中DestNamespaceReplaceCount表示用目标命名空间替换源路径中的多少个路径组件默认-1表示旧版行为整库复制到目标命名空间下的场景。该字段在 API Handler 中被设计为可选缺失时置为-1见 replication.go。Override对应 UI 中覆盖目标同名资源选项决定目标端已存在同名制品时是覆盖还是跳过Enabled控制策略启停——被禁用的策略在Start()时会被直接拒绝the policy N is disabled见 execution.go。保存前的校验逻辑Policy.Validate()model.go在创建/更新时执行核心规则如下名称必填Name为空返回 400源/目标互斥SrcRegistry与DestRegistry必须一个为空、一个非空二者同时为空或同时非空均报错——这从模型层面保证了复制方向明确push型或pull型过滤器校验逐项调用Filter.Validate()非法类型、非字符串取值、非法的 decoration 组合均被拒绝目标命名空间校验非空时必须匹配仓库命名规则lib.RepositoryNameRe触发校验manual/event_based无需额外参数scheduled必须提供非空且合法的 Cron 字符串Cron 的第 1 字段秒必须为 0第 2 字段分钟不允许为*防止误配造成过度频繁的复制任务。四、三种触发机制在源码中的落地手动触发Manual手动触发不依赖任何后台调度由用户在 UI 点击复制或调用 APIPOST /replication/executions请求体仅需policy_id见 swagger.yaml发起。API 最终调用控制器Start(ctx, policy, nil, task.ExecutionTriggerManual)创建一次执行记录并后台运行复制流程。事件驱动触发Immediate / event_based事件驱动通过 Harbor 事件总线实现。复制事件处理器订阅了四类制品事件init.goTopicPushArtifact推送制品TopicDeleteArtifact删除制品TopicCreateTag创建标签TopicDeleteTag删除标签事件到达后处理器找出所有启用且触发类型为event_based的策略匹配其过滤器并触发执行。这也解释了 UI 中Delete remote images when locally deleted选项为何仅在Immediate触发模式下出现删除事件只有在该模式下才会被订阅消费并联动到目标端。定时触发Scheduled定时触发依赖 Harbor 调度器scheduler。在CreatePolicy中若策略IsScheduledTrigger()为真启用且触发类型为scheduled见 model.go控制器会将policy_id与操作者harbor-jobservice封装进回调参数调用scheduler.Schedule(ctx, job.ReplicationVendorType, id, , cron, REPLICATION_CALLBACK, params, ...)注册周期任务到点后调度器触发注册于init()中的REPLICATION_CALLBACK回调函数policy.go解析policy_id并调用Ctl.Start(ctx, policy, nil, task.ExecutionTriggerSchedule)真正执行复制。更新策略时控制器会先UnScheduleByVendor删除旧调度再按新 Cron 重建见 policy.go删除策略时则会级联清理执行记录、调度任务与策略本身policy.go。关于 SingleActiveReplication较新版本支持SingleActiveReplication单活动复制选项用于避免同一策略的多条执行并行冲突。注意 API Handler 中明确拒绝事件驱动触发 单活动复制的组合replication.go因为事件驱动的实时性诉求与该开关的串行语义冲突。开启后Start()会先统计该策略是否已有运行中的执行记录若有则新执行直接标记为错误Execution skipped: active replication still in progress见 execution.go。五、策略保存后的执行流程无论哪种触发方式最终都汇聚到Start()execution.go其关键环节包括启用状态检查策略被禁用则拒绝执行创建执行记录写入replication_execution相关表记录触发方式与操作者见 model.go 的Execution模型后台异步执行在 goroutine 中获取 worker 令牌重建 ORM 上下文后调用flowCtl.Start并通过recover兜底 panic、retry等待执行记录落库保证异常时执行被标记为错误分发复制流程flow 控制器controller.go根据资源是否带Deleted标记分流——复制流程CopyFlow拉取源端资源清单按过滤器筛选后传输到目标端删除流程DeletionFlow当触发来源是删除事件时将删除操作同步到目标端其内部任务操作类型标记为deletion/tag deletion见 deletion.go。执行结果通过执行Execution—任务Task两级模型呈现一次执行包含多个任务Task模型含源资源、目标资源、操作类型、JobID 等字段见 model.goUI 的 Replications 页面可查看执行状态、失败原因与日志。六、通过 REST API 创建策略进阶除 UI 外复制策略全生命周期均暴露为 Harbor v2.0 REST APIOpenAPI 定义见 swagger.yaml。创建策略的请求体结构为{ name: daily-sync, description: sync library to remote, src_registry: { id: 1 }, dest_registry: { id: 2 }, dest_namespace: backup, dest_namespace_replace_count: -1, filters: [ { type: name, value: library/** }, { type: tag, value: v1.*, decoration: matches } ], trigger: { type: scheduled, trigger_settings: { cron: 0 0 2 * * * } }, replicate_deletion: true, override: true, enabled: true, speed: 1024, copy_by_chunk: false, single_active_replication: false }字段与 UI 表单的对应关系、可选性、默认值如dest_namespace_replace_count缺省为-1、speed负值归零等均已在 replication.go 中体现。定时触发时注意 Cron 需满足秒字段为 0、分字段非*的约束。创建成功返回201及新策略 ID随后可通过GET /replication/policies列表查询、PUT /replication/policies/{id}更新、POST /replication/executions手动触发、GET /replication/executions/{id}/tasks查看任务明细。七、验证与排错建议按测试用例 7-01 的预期保存后策略应出现在规则列表中。进一步验证建议查看执行记录在Administration → Replications的执行Executions标签页观察手动/定时/事件触发的执行状态与统计总数、成功、失败、进行中字段见 swagger.yaml核对目标端登录目标 Harbor 实例确认制品已按dest_namespace与过滤器规则出现在对应项目中检查失败任务展开执行查看失败任务的状态信息StatusMessage与复制日志常见问题包括凭证错误、目标端无同名项目、证书校验失败、Cron 表达式不合法保存阶段即被Validate()拦截等验证删除联动若勾选了ReplicateDeletion且触发模式为 Immediate在源端删除制品后到目标端确认制品是否被同步删除。相关资源测试用例原文7-01-Proj-replication-rules-add.md复制测试用例全集tests/testcases/Group7-Replication策略控制器实现policy.go执行控制器实现execution.go策略数据模型model.go过滤/触发类型定义policy.goRegistry 与凭证模型registry.go复制策略 ORM 持久化模型model.goAPI Handlerreplication.goOpenAPI 定义swagger.yaml复制事件订阅init.go【免费下载链接】harborAn open source trusted cloud native registry project that stores, signs, and scans content.项目地址: https://gitcode.com/GitHub_Trending/ha/harbor创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表