0%

Harbor中如何创建tag保留规则

创建Tag保留规则

一个repository可以快速积累大量镜像tag,在给定时间之后或一旦它们被后续镜像构建取代后,可能不需要许多镜像tag。这些多余的tag显然会消耗大量的存储容量。作为Harbor系统管理员,可以定义规则来管理给定repository中要保留多少个tag,或将某些tag保留多长时间。

Tag保留规则如何工作

在repositories上而不是projects上定义tag保留规则(repository属于project内的概念)。在定义保留规则时,这可以提供更大的粒度。顾名思义,当我们为repositories定义保留规则时,也即在定义要保留的tag。我们没有定义规则来显式删除tag,而是当设置规则时,repositories中任何未标识为可保留的标记都将被丢弃。

tag保留规则具有3个按顺序应用的过滤器,如下表所述。

Order Filter Description
First 一个或多个repository 标识要在其上应用规则的一个或多个repository。可以标识具有特定名称或名称片段的repository,或者不具有该名称或名称片段的repository。允许使用通配符(例如* repo,repo *和**)。首先使用repository filter以标记要对其应用保留规则的repository。根据标签标准,将识别出的repository指定用于进一步匹配。在此阶段,对没有指定的repository不采取任何措施。
Second 保留数量 通过指定最大数量的标签或指定最大保留标签的时间来设置要保留的标签。
Third 要保留的标签 标识要应用规则的一个或多个标签。可以标识具有特定名称或名称片段的标签,或者不具有该名称或名称片段的标签。允许使用通配符(例如* tag,tag *和**)。

有关如何应用**通配符的信息,请参见https://github.com/bmatcuk/doublestar#patterns。

Example 1

  • 在一个project中有5个repositories,repositories A到E。
    • repository A具有100个镜像tag,所有这些镜像tag均已在上周有pull操作。
    • repository B到E每个都有6个镜像,上个月都没有pull操作。
  • 将repositories过滤器设置为**,这意味着包括了project中的所有repositories。
  • 设置保留策略,以在每个repositories中保留最近提取的10个映像。
  • 将标签过滤器设置为**,这意味着包括repositories中的所有标签。

在此示例中,规则在repository A中保留了10个最近有pull操作的镜像,并且在repository B至E中的每一个中都保留了所有6个镜像。因此,project中总共保留了34个镜像tag。换句话说,该规则不会将repository A到E中的所有镜像都视为单个池,然后从中选择10个最新镜像。因此,即使repository A中的第11至第100个标签比repository B至E中的任何标签相比都有pull操作,也将保留repository B至E中的所有标签,因为每个repository中的标签少于10个。

Example 2

本示例使用与示例1相同的project和repositories,但设置了保留策略以保留每个repository中最近7天内有pull操作的镜像。

在这种情况下,保留了repository A中的所有镜像,因为它们是最近7天内有pull操作的。repository B到E中的任何镜像都不会保留,因为它们在上周都没有发生pull操作。在此示例中,保留了100个镜像,而示例1中则保留了34个镜像。

Tag保留规则和原生Docker Tag删除问题

警告:由于本机Docker tag删除行为,当前的保留策略实施存在问题。如果有多个tag引用相同的SHA摘要,并且如果这些tag的子集被配置的保留策略标记为要删除,则所有其余tag也将被删除。这违反了保留策略,因此在这种情况下,所有tag都将保留。在以后的更新版本中将解决此问题,以便tag保留策略可以删除tag而不删除摘要和其他共享tag。

例如,我们有以下tag,这些tag根据其推送时间列出,并且它们都引用相同的SHA摘要:

  • harbor-1.8, pushed 8/14/2019 12:00am
  • harbor-release, pushed 8/14/2019 03:00am
  • harbor-nightly, pushed 8/14/2019 06:00am
  • harbor-latest, pushed 8/14/2019 09:00am

如果配置了保留策略,以保留与Harbor- *匹配的两个最新标记,以便删除Harbor-rc和Harbor-latest。但是,由于所有tag都引用相同的SHA摘要,因此此策略还将删除标签Harbor-1.8和Harbor-release,因此将保留所有标签。(时间和删除的tag有点对不上)

在一个Repository上合并规则

每个project最多可以定义15条规则。我们可以将多个规则应用于一个repository或一组repositories。在将多个规则应用于repository 时,它们将使用OR逻辑而不是AND逻辑来应用。这样,就不会在给定的repository 上优先应用规则。规则在后台同时运行,每个规则的结果集在运行结束时合并。

Example 3

本示例使用与示例1和2相同的project和repositories,但是设置了两个规则:

  • 规则1:保留每个repository中最近7天内pull操作的所有镜像。
  • 规则2:每个repository中最多保留10个镜像。

对于repository A,规则1保留所有镜像,因为它们都是在上周发生pull操作的。规则2保留最近发生pull操作的10个镜像。因此,由于这两个规则是通过OR关系应用的,所有100个镜像都保留在repository A中。

对于repositories B-E,规则1将保留0个镜像,因为上周未发生pull操作。规则2将保留所有6个镜像,因为6 <10。因此,由于这两个规则以OR关系应用,对于repositories B-E,每个repository将保留所有6个图像。

在此示例中,所有镜像均被保留。

Example 4

本示例使用与先前示例不同的repository。

  • 包含12个tag的repository:

    Production Release Candidate Release
    2.1-your_repo-prod 2.1-your_repo-rc 2.1-your_repo-release
    2.2-your_repo-prod 2.2-your_repo-rc 2.2-your_repo-release
    3.1-your_repo-prod 3.1-your_repo-rc 3.1-your_repo-release
    4.4-your_repo-prod 4.4-your_repo-rc 4.4-your_repo-release
  • 在此repository上定义了3个tag保留规则:

    • 保留以2开头的10个最近发生pull操作的镜像tag。

    • 保留以-prod结尾的10个最近发生pull操作的镜像tag。

    • 保留所有不包含2.1-your_repo-prod的tag。

在此示例中,规则将应用于以下7个tag(与预期不符,官方收到反馈后已修改):

  • 2.1-your_repo-rc
  • 2.1-your_repo-release
  • 2.2-your_repo-prod
  • 2.2-your_repo-rc
  • 2.2-your_repo-release
  • 3.1-your_repo-prod
  • 4.4-your_repo-prod

Tag保留规则如何与项目配额搭配使用

Harbor系统管理员可以设置一个project可以包含的tag数量及其可以使用的存储量的最大值。有关project配额的信息,请参阅配置project配额

如果在project上设置配额,则不能超过该配额。即使设置的保留规则超过配额,配额也将应用于project。换句话说,不能使用保留规则来绕过配额。

配置Tag保留规则实例

  1. 使用至少具有项目管理员特权的帐户登录到Harbor界面。

  2. 转到”project”,选择一个project,然后选择tag保留。

    tag-retention

  3. 单击”添加规则”以添加规则。

  4. 在“repositories”下拉菜单中,选择匹配或排除。

    tag-retention

  5. 在“repositories”文本框中,标识要在其上应用规则的repository。

    可以通过输入以下信息来定义要在哪些repositories上应用规则:

  • repository名称,例如my_repo_1。

  • 以逗号分隔的repository名称列表,例如my_repo_1,my_repo_2,your_repo_3。

  • 带通配符的部分repository名称,例如my _ _ 3或*repo*。

  • **将规则应用于project中的所有repositories。

    如果选择匹配,则规则将应用于标识的repository。如果选择排除,则该规则将应用于project中除已标识的repositories之外的所有repositories。

  1. 在“按镜像或天数计数”下拉菜单中,定义要保留的tag数量或保留的时间。

    tag-retention

Option Description
retain the most recently pushed # images 输入要保留的最大镜像个数,保留最近发生push操作的镜像。不考虑镜像的时间。
retain the most recently pulled # images 输入要保留的最大镜像个数,保留最近发生pull操作的镜像。不考虑镜像的时间。
retain the images pushed within the last # days 输入保留镜像的天数,仅保留在此期间发生push操作的镜像。不考虑镜像数量。
retain the images pulled within the last # days 输入保留镜像的天数,仅保留在此期间发生pull操作的镜像。不考虑镜像数量。
retain always 始终保留此规则标识的镜像。
  1. 在”tag”下拉菜单中,选择匹配或排除。

  2. 在“标签”文本框中,标识要在其上应用规则的tag。

    可以通过输入以下信息来定义要在其上应用规则的tag:

  • tag名称,例如my_tag_1。
  • tag名称的逗号分隔列表,例如my_tag_1,my_tag_2,your_tag_3。
  • 带通配符的部分tag名称,例如my _ _ 3或* tag *。
  • **将规则应用于project中的所有tag。
  1. 单击”添加”以保存规则。

  2. (可选)单击“添加规则”以添加更多规则,每个project最多15条。

  3. (可选)在“计划”下,单击“编辑”,然后选择运行规则的频率。

    tag-retention

    如果选择“自定义”,请输入cron job命令以配置规则。

    注意:如果定义多个规则,则计划将应用于所有规则。不能配置不同的规则在不同的时间运行。

  4. 单击“模拟运行”以测试定义的一个或多个规则。

  5. 单击“立即运行”以立即运行规则。

警告:运行规则后,将无法还原它。强烈建议先执行模拟运行,然后再运行规则。

要修改现有规则,请使用规则旁边的操作下拉菜单来禁用,编辑或删除该规则。

tag-retention