使用 Red Hat Quay


Red Hat Quay 3.8

使用 Red Hat Quay

Red Hat OpenShift Documentation Team

摘要

了解如何使用 Red Hat Quay

前言

Red Hat Quay 容器镜像 registry 允许您将容器镜像存储在中央位置。作为 Red Hat Quay registry 的普通用户,您可以创建存储库来组织镜像,并选择性地向您控制的存储库添加读取(pull)和写入(推送)访问权限。具有管理特权的用户可以执行更广泛的任务,如添加用户和控制默认设置等。

本指南假定您部署了 Red Hat Quay,并已准备好开始设置并使用它。

第 1 章 Red Hat Quay 中的用户和机构

在开始创建存储库以在 Red Hat Quay 中保存容器镜像前,您应该考虑如何组织这些存储库。Red Hat Quay 实例中的每个存储库必须与一个机构或用户关联。

1.1. Red Hat Quay 租期模型

Quay tenancy model

  • 组织 在通用命名空间中共享存储库的方式,这些存储库不属于单个用户,而是在共享设置(如公司)中的很多用户共享。
  • 团队 提供了一种方式,供组织委派权限(包括全局存储库和特定存储库),以设置或用户组。
  • 用户可以通过 Red Hat Quay Web UI 或客户端(如 podman login)登录到 registry。每个用户会自动获得一个用户命名空间,如 quay-server.example.com/user/<username>
  • 超级用户 通过用户界面中的 Super User Admin Panel 以及无法通过普通用户可见或访问的 Super User API 调用来增强访问权限和特权。
  • 机器人帐户 为非人用户(如管道工具)提供存储库自动化访问,与 OpenShift 服务帐户的性质相似。可以通过像任何其他用户或团队一样添加该帐户,将权限授予到存储库中的机器帐户。

1.2. 创建用户帐户

为您的 Red Hat Quay 实例创建新用户:

  1. 以超级用户(默认为quay)登录 Red Hat Quay。
  2. 从主页右上角选择您的帐户名称,然后选择 Super User Admin Panel。
  3. 从左列中选择 Users 图标。
  4. 选择创建用户按钮。
  5. 输入新用户的 Username 和 Email 地址,然后选择 Create User 按钮。
  6. 返回到 Users 页面,选择新 Username 右侧的 Options 图标。此时会出现一个下拉菜单,如下图所示:

    Select Options drop-down to change user passwords

  7. 从菜单中选择"更改密码"。
  8. 添加新密码并进行验证,然后选择"更改用户密码"按钮。

新用户现在可以使用该用户名和密码通过 web ui 或某些容器客户端登录。

1.3. 创建机构帐户

任何用户都可以创建自己的组织来共享容器镜像的存储库。要创建新机构,请执行以下操作:

  1. 以任何用户身份登录时,从主页右上角选择加号(+),然后选择 New Organization。
  2. 输入机构的名称。名称必须是字母数字、所有小写以及 2 到 255 个字符的长度
  3. 选择 Create Organization。新组织显示,您可以开始添加存储库、团队、机器人帐户和其他功能(来自左列中的图标)。下图显示了选择有 settings 选项卡的新机构页面示例。

    Create new repos and teams from an Organization page

第 2 章 创建软件仓库

存储库提供了一个中央位置,用于存储一组相关的容器镜像。在 Red Hat Quay 中创建存储库有两种方法:通过 push (来自 dockerpodman)并通过 Red Hat Quay UI 创建存储库。无论您使用 Quay.io 还是您自己的 Red Hat Quay 实例,它们基本上都相同。

2.1. 通过 UI 创建镜像存储库

要在 Red Hat Quay UI 中创建存储库,请执行以下操作:通过 Web UI 登录用户帐户。点击主页上标题右上角的 + 图标(或其他与用户相关的页面),然后选择 New Repository,如下图所示:

+ Create a new repository for a user.

  1. 在出现的 Create New Repository 页面中

    • 将新存储库名称添加到用户名
    • 单击 Repository Description,再键入存储库的描述
    • 在 Repository Visibility 中,选择您想要存储库是公开的还是私有的
    • 单击创建存储库按钮。

新存储库已创建,开始为空。您可以使用 docker pull 命令从该存储库拉取镜像(减去镜像名称)出现在屏幕上。

要在 Red Hat Quay UI 中创建存储库,请执行以下操作:

  1. 以具有组织的 Admin 或 Write 权限的用户身份登录。
  2. 从 Repositories 视图,从 Users 和 Organizations 下的右列中选择组织名称。此时会出现机构页面,类似于图 2.x 所示的页面:
  3. 在页面的右上角,单击 +Create New Repository。
  4. 在出现的 Create New Repository 页面中:

    • 将新存储库名称添加到机构名称
    • 单击 Repository Description,再键入存储库的描述
    • 在 Repository Visibility 中,选择您想要存储库是公开的还是私有的
    • 单击创建存储库按钮。

新存储库已创建,开始为空。您可以使用 docker pull 命令从该存储库拉取镜像(减去镜像名称)出现在屏幕上。

2.2. 通过 docker 或 podman 创建镜像存储库

假设您有正确的凭证,将镜像推送到 Red Hat Quay 实例中尚不存在的存储库,因为它将创建该存储库,因为它将镜像推送到该存储库。dockerpodman 命令可用于这些示例。

  1. 标记镜像:使用本地系统上 dockerpodman 提供的镜像,使用新存储库名称和镜像名称标记该镜像。以下是将镜像推送到 Quay.io 或您自己的 Red Hat Quay 设置的示例(如 reg.example.com)。例如,将 namespace 替换为您的 Red Hat Quay 用户名或机构,将 repo_name 替换为您要创建的仓库的名称:

    # sudo podman tag myubi-minimal quay.io/namespace/repo_name
    # sudo podman tag myubi-standard reg.example.com/namespace/repo_name
    Copy to Clipboard Toggle word wrap
  2. 推送到适当的 registry。例如:

    # sudo podman push quay.io/namespace/repo_name
    # sudo podman push reg.example.com/namespace/repo_name
    Copy to Clipboard Toggle word wrap
注意

要创建应用程序存储库,请按照创建容器镜像存储库相同的步骤进行操作。

第 3 章 管理对软件仓库的访问

作为 Red Hat Quay 用户,您可以创建自己的存储库,并使其可以被 Red Hat Quay 实例上的其他用户访问。另外,您可以创建机构来根据团队访问存储库。在用户和组织存储库中,您可以通过创建与机器机器帐户关联的凭证来访问这些存储库。机器人帐户使得各种容器客户端(如 docker 或 podman)更易于访问您的仓库,而无需客户端具有 Red Hat Quay 用户帐户。

3.1. 允许访问用户软件仓库

在用户命名空间中创建存储库时,您可以向用户帐户或机器人帐户添加对该存储库的访问权限。

3.1.1. 允许用户访问用户存储库

要允许访问与用户帐户关联的存储库,请执行以下操作:

  1. 登录到您的 Red Hat Quay 用户帐户。
  2. 在要共享访问权限的用户命名空间中选择一个仓库。
  3. 从左列中选择 Settings 图标。
  4. 键入您要为其授予存储库访问权限的用户名称。用户名应如您输入的形式出现,如下图所示:

    Grant user access to a user repository

  5. 在权限框中,选择以下内容之一:

    • read - 允许用户查看存储库并从中拉取。
    • write - 允许用户查看存储库,以及从镜像拉取(pull)镜像或将镜像推送到存储库。
    • admin - 允许存储库的所有管理设置以及所有读写权限。
  6. 选择添加权限按钮。用户现在具有分配的权限。

要删除存储库用户权限,请选择用户条目右侧的 Options 图标,然后选择 Delete Permission。

3.2. 允许机器访问用户存储库

机器人帐户用于自动访问 Red Hat Quay registry 中的存储库。它们类似于 OpenShift 服务帐户。设置机器机器帐户时,您可以:

  • 生成与机器机器帐户关联的凭证
  • 识别机器可将镜像推送到或拉取镜像的存储库和镜像
  • 复制并粘贴生成的凭证,以用于不同的容器客户端(如 Docker、podman、Kubernetes、Mesos 等)以访问每个定义的存储库

请记住,每个机器人帐户都仅限于单个用户命名空间或组织。例如,机器人可以为用户提供 jsmith 访问的所有存储库的访问权限,但不能访问任何不属于用户存储库列表中的任何存储库。

您可以通过设置机器人帐户来访问您的存储库的步骤。

  1. 选择 Robot 图标:从 Repositories 视图中,选择左列中的 Robot 图标。
  2. 创建 Robot 帐户:选择 Create Robot Account 按钮。
  3. 设置 Robot 名:输入名称和描述,然后选择 Create robot account 按钮。机器人名称成为您的用户名组合,加上您设置的机器人名称(例如,jsmith+myrobot)
  4. 为机器人帐户添加权限:从机器机器帐户的 Add permissions 屏幕,定义您要访问机器的存储库,如下所示:

    • 在机器人可以访问的每个存储库旁边放置一个复选标记
    • 对于每个仓库,选择以下项之一并点击 Add permissions:

      • None - Robot 对存储库没有权限
      • read - Robot can view and pull from the repository
      • write - Robot can read (pull)从写入(推送)到存储库
      • admin - 从存储库拉取和推送到存储库的完全访问权限,以及执行与存储库关联的管理任务的功能
    • 选择添加权限按钮以应用设置
  5. 获取通过 robot: Back 在 Robot Accounts 页面上访问存储库的凭证,选择 Robot account name 以查看该机器的凭据信息。
  6. 获取令牌:选择 Robot Token,如下图所示,查看为机器机器生成的令牌。如果要重置令牌,请选择 Regenerate Token。

    注意

    务必要清楚,重新生成令牌会导致这个机器的所有之前令牌都无效。

    Select Options drop-down to change user passwords

  7. 获取凭证:当您满足生成的令牌后,以以下方式获取生成的凭证:

    • Kubernetes Secret:选择这会以 Kubernetes pull secret yaml 文件的形式下载凭证。
    • rkt Configuration:选择此选项以 json 文件的形式为 rkt 容器运行时下载凭证。
    • docker Login:选择此项来复制包含凭据的完整 docker 登录 命令行。
    • docker Configuration:选择这会下载一个要用作 Docker config.json 文件的文件,以将凭据永久存储在客户端系统中。
    • Mesos Credentials:选择要下载一个 tarball,该 tarball 提供了 Mesos 配置文件的 uris 字段标识的凭证。

3.3. 允许访问机构存储库

创建了机构后,您可以将一组存储库直接与该机构相关联。要添加对该机构中存储库的访问权限,您可以添加团队(具有相同权限的用户集)和单独的用户。基本上,组织与用户的作用相同,可以创建存储库和机器人帐户,但组织旨在通过用户组(团队或单独团队或单独)设置共享存储库。

深入了解机构的其他事项:

  • 您不能在另一个机构中有一个机构。要培养一个机构,您可以使用团队。
  • 机构不能直接包含用户。您必须首先添加一个团队,然后为每个团队添加一个或多个用户。
  • 团队可以在机构中设置,就像使用仓库和关联的镜像的成员或具有管理机构具有特殊权限的管理员一样

3.3.1. 将团队添加到机构中

当您为您的机构创建团队时,您可以选择团队名称,选择哪些存储库可供团队使用,并决定对团队的访问权限级别。

  1. 在 Organization 视图中,从左列中选择 Teams 和 Membership 图标。您将看到一个所有者团队,其中包含创建该组织的用户的 Admin 权限。
  2. 选择 Create New Team。系统会提示您输入要与机构关联的新团队名称。键入团队名称,它必须以小写字母开头,其组名称作为小写字母和数字的任意组合(不允许使用大写或特殊字符)。
  3. 选择创建团队按钮。此时会出现 Add permissions 窗口,显示机构中的存储库列表。
  4. 检查您希望团队能够访问的每个存储库。并为每项选择以下权限之一:

    • Read - 团队成员可以查看和拉取镜像
    • write - 团队成员可以查看、拉取和推送镜像
    • admin - 团队成员具有完全的读/写权限,以及执行与存储库相关的管理任务的能力
  5. 选择 Add permissions,为团队保存存储库权限。

3.3.2. 设置团队角色

添加团队后,您可以在组织内设置该团队的角色。从机构的 Teams 和 Membership 屏幕中,选择 TEAM ROLE 下拉菜单,如下图所示:

Set the role that a team has within an organization

对于所选团队,请选择以下角色之一:

  • member - 继承为团队设置的所有权限
  • 创建者 - 所有成员权限,以及创建新存储库的功能
  • admin - 完全对组织的管理访问权限,包括创建团队、添加成员和设置权限的能力。

3.3.3. 将用户添加到团队

作为具有管理员权限的用户,您可以在团队中添加用户和机器机器。当您添加用户时,它会向该用户发送电子邮件。用户保持待处理状态,直到该用户接受邀请。

要将用户或机器机器添加到团队,请从机构屏幕开始并执行以下操作:

  1. 选择您要添加用户或机器的团队。
  2. 在 Team Members 框中,输入以下内容之一:

    • 来自 Red Hat Quay registry 帐户的用户名
    • registry 中用户帐户的电子邮件地址
    • 机器人帐户的名称。名称必须采用 orgname+robotname 的形式
  3. 如果是机器人帐户,它会立即添加到团队中。对于用户帐户,邀请加入将发送给用户。在用户接受邀请之前,用户会一直处于 INVITED TO JOIN 状态。

接下来,用户接受加入团队的电子邮件邀请。用户下次登录到 Red Hat Quay 实例时,用户从 INVITED TO JOIN 列表移到该组织的 MEMBERS 列表。

第 4 章 使用标签

标签提供了一种标识镜像版本的方法,并提供以不同方式命名相同镜像的方法。除了镜像的版本外,镜像标签还可以标识其用途(如 devel、test 或 prod)或者它是最新的版本(latest)。

在镜像存储库的 Tags 选项卡中,您可以查看、修改、添加、移动、删除和查看标签历史记录。您还可以获取命令行,使用不同的命令下载(基于其名称和标签)特定镜像(基于其名称和标签)。

4.1. 查看和修改标签

可以在存储库页面的标签面板中查看和修改存储库标签,单击 标签 选项卡即可找到。 View and modify tags from your repository

4.1.1. 将新标签添加到标记的镜像

通过单击标签旁边的齿轮图标并选择 Add New Tag,可向标记添加新标签。Red Hat Quay 将确认为镜像添加新标签。

4.1.2. 移动标签

将标签移到其他镜像是通过执行与添加新标签相同的操作,但放弃现有的标签名称来实现。Red Hat Quay 将确认您想要移动标签,而不是添加。

4.1.3. 删除标签

单击标签的 gear 图标并选择 Delete Tag 来删除特定的标签及其所有镜像。这将删除标签以及其唯一的任何镜像。在没有标签引用它们前,不会删除镜像,或通过父子关系间接引用镜像。

4.1.4. 查看标签历史记录并恢复时间

4.1.4.1. 查看标签历史记录

要查看标签的镜像历史记录,请单击 Actions 菜单下的 View Tags History 菜单项。显示的页面将显示过去和指向该镜像的标签所指向的每个镜像。

4.1.4.2. 返回一段时间

要将标签恢复到以前的镜像,找到覆盖您所需镜像的历史记录行,然后点 Restore 链接。

4.1.5. 通过标签或摘要获取镜像

Tags 选项卡中,您可以查看从准备好使用这些镜像的客户端中拉取镜像的不同方法。

  1. 选择特定的存储库/镜像
  2. 选择左列中的标签
  3. 选择特定镜像/标签组合的 Fetch Tag 图标
  4. 当显示 Fetch Tag 弹出窗口中时,选择映像格式框,以查看一个下拉菜单,显示可用于拉取镜像的不同方法。选择提供将特定容器镜像拉取到本地系统的完整命令行:

Get commands for fetching images in different ways

您可以选择通过标签名称或使用 docker 命令来拉取镜像的常规镜像。选择您想要的拉取类型,然后选择 Copy Command。完整的命令行复制到您的剪贴板中。这两个命令显示按标签和摘要的 docker pull

docker pull quay.io/cnegus/whatever:latest
docker pull quay.io/cnegus/whatever@sha256:e02231a6aa8ba7f5da3859a359f99d77e371cb47e643ce78e101958782581fb9
Copy to Clipboard Toggle word wrap

将命令粘贴到有 docker 命令和服务可用的系统上的命令行 shell 中,然后按 Enter 键。此时,容器镜像已准备好在本地系统上运行。

在 RHEL 和 Fedora 系统中,您可以使用 podman 替换 docker 来拉取并运行所选镜像。

4.2. 标签过期

可以使用名为 标签到期的功能,在所选日期和时间上将镜像设置为过期。有关标签过期情况,如下所示:

  • 当标签过期时,标签会从存储库中删除。如果它是特定镜像的最后一个标签,则镜像被设置为删除。
  • 过期时间以按标签为基础设置,而不是为整个仓库进行设置。
  • 当标签过期或被删除时,它不会立即从 registry 中删除。Time Machine (用户设置中)的值定义了删除标签何时实际删除并垃圾回收。默认情况下,该值为 14 天。在此之前,标签可以重新指向过期或删除的镜像。
  • Red Hat Quay 超级用户没有与从用户存储库中删除过期的镜像相关的特殊特权。超级用户没有中央机制来收集用户存储库的信息和操作。它最多是每个仓库的所有者,用于管理过期时间并最终删除其镜像。

可使用不同方式设置标签过期:

  • 在创建镜像时,通过在 Dockerfile 中设置 quay.expires-after= LABEL。这会将一个时间设置为在构建镜像时过期。
  • 通过在 EXPIRES 列中选择存储库标签的过期日期,然后选择要过期的特定日期和时间。

下图显示了当标签过期时更改标签到期的 Options 条目和 EXPIRES 字段。将鼠标悬停在 EXPIRES 字段上,以查看当前设置的过期日期和时间。

Change tag expiration under the Options icon or from the EXPIRES column

4.2.1. 从 Dockerfile 设置标签过期

通过 Dockerfile LABEL 命令添加类似 quay.expires-after=20h 的标签,会导致标签在指定的时间后自动过期。时间值可以类似 1h, 2d, 3w,分别代表小时、天和星期(自镜像构建的时间)。

4.2.2. 从仓库中设置标签过期

在 Repository Tag 页面中,有一个名为 EXPIRES 的 UI 列,指示标签何时过期。用户可以通过点击将过期的时间或者点击右侧的 Settings 按钮(gear 图标)并选择 Change Expiration 来设置。

出现提示时选择日期和时间,然后选择" 更改到期 "。达到过期时间时,标签将设置为从存储库中删除。

4.3. 安全扫描

点击标签页旁边的漏洞或可修复计数,您可以跳到该标签的安全扫描信息。您会发现,您的镜像容易受到哪些 CVE 的影响,以及可能可用的补救选项。

请记住,镜像扫描仅列出了 Clair 镜像扫描程序发现的漏洞。每个用户对未发现的漏洞执行的操作完全由该用户组成。Red Hat Quay 超级用户不作这些发现的漏洞。

第 5 章 查看和导出日志

为 Red Hat Quay 中的所有存储库和命名空间(用户和组织)收集活动日志。访问日志文件的方法有多种,包括:

  • 通过 Web UI 查看日志
  • 导出日志以便可以在外部保存。
  • 通过 API 访问日志条目

要访问日志,您必须具有所选存储库或命名空间的 Admin 权限。

注意

通过 API 一次可以获得最多 100 个日志结果。要收集更多结果,您必须使用本章中描述的日志导出功能。

5.1. 查看日志

要从 web UI 查看仓库或命名空间的日志条目,请执行以下操作:

  1. 选择具有 Admin 权限的存储库或命名空间(organization 或 user)。
  2. 从左列中选择 Usage Logs 图标。此时会出现 Usage Logs 屏幕,如下图所示:

    View usage logs

  3. 在 Usage Logs 页面中,您可以:

    • 通过向 From 和 框添加日期来设置用于查看日志条目的日期范围。默认情况下会显示最近一个日志条目的一周。
    • 在 Filter Logs 框中键入字符串,以显示容器给定字符串的日志条目。
    • 将箭头切换为任何日志条目的左侧,以查看与该日志条目关联的更多文本。

5.2. 导出存储库日志

为了能够获取大量日志文件并将它们保存到 Red Hat Quay 数据库外,您可以使用 Export Logs 功能。以下是您应该了解的有关使用导出日志的一些事项:

  • 您可以为要从仓库收集的日志选择一系列日期。
  • 您可以通过电子邮件附件或定向到回调 URL 来请求日志发送到您的。
  • 您需要对存储库或命名空间的 Admin 权限才能导出日志
  • 一次可导出最多 30 天日志数据
  • 导出日志只收集之前生成的日志数据。它不会流传输日志记录数据。
  • 必须为此功能配置 Red Hat Quay 实例(本地存储不起作用)。
  • 收集并可用日志后,您应立即复制这些数据(如果您想要保存)。默认情况下,数据会在一小时内过期。

使用导出日志功能:

  1. 选择具有 Admin 权限的存储库。
  2. 从左列中选择 Usage Logs 图标。此时会出现 Usage Logs 屏幕。
  3. 选择您要收集的日志条目的 From 和 to date 范围。
  4. 选择导出日志按钮。此时会出现一个出口 Usage Logs 弹出,如下所示

    Enter email or callback URL to receive exported logs

  5. 输入您要接收导出的日志的电子邮件地址或回调 URL。对于回调 URL,您可以使用指向 Webhook.site 等位置的 URL。
  6. 选择 Start Logs Export。这会导致 Red Hat Quay 开始收集所选日志条目。根据要收集的日志数据量,这在一分钟到一小时的任何位置可能需要一些时间才能完成。
  7. 当日志导出完成后,您将:

    • 收到一封电子邮件,提醒您提供您导出的日志条目。
    • 请参阅来自 webhook URL 的日志导出请求成功状态。可以选择下载日志的链接。

请记住,URL 指向 Red Hat Quay 外部存储中的某个位置,并被设置为每小时过期。因此,如果您打算保留,请在该过期时间前复制导出的日志。

第 6 章 使用构建 worker 自动构建 Dockerfile

Red Hat Quay 支持使用 OpenShift 或 Kubernetes 上的一组 worker 节点构建 Dockerfile。构建触发器(如 GitHub Webhook)可以配置为在提交新代码时自动构建存储库的新版本。本文档将指导您使用 Red Hat Quay 安装启用构建,并设置一个或多个 OpenShift/K8s 集群来接受 Red Hat Quay 的构建。使用 Red Hat Quay 3.4 时,底层的构建管理器已完全重写为 Red Hat Quay 从 Python 2 迁移到 Python 3 的一部分。现在,构建程序节点会动态创建为 Kubernetes 作业,与在 Red Hat Quay 3.3 及更早版本中持续运行的构建器节点。这大大简化了 Red Hat Quay 管理构建的方式,并提供与 quay.io 相同的机制,以便每天处理数千容器镜像构建。目前,在 Red Hat Quay 3.3 下运行静态("企业"构建器)的用户需要迁移到基于 Kubernetes 的构建机制。

6.1. 架构概述

Red Hat Quay Build 系统设计为可伸缩性(因为它用于托管 quay.io 上的所有构建)。Red Hat Quay 的 Build Manager 组件提供了一个编配层,用于跟踪构建请求并确保 Build Executor (OpenShift/K8s 集群)将针对每个请求执行。每个构建都由一个 Kubernetes 作业处理,它启动一个小型虚拟机来完全隔离并包含镜像构建过程。这样可确保容器构建不会影响彼此或底层构建系统。可以配置多个可执行文件,以确保即使在出现基础架构故障时也执行构建。如果 Red Hat Quay 检测到某个 Executor 很难,Red Hat Quay 会自动将构建发送到其他 Executor。

注意

Red Hat Quay 的上游版本提供了如何根据 Executor 配置 AWS/EC2 的说明。Red Hat Quay 客户不支持此配置。

6.1.1. 构建管理器

构建管理器负责调度构建的生命周期。需要更新构建队列、构建阶段和运行作业状态的操作由构建管理器处理。

6.1.2. 构建 worker 的 control plane

构建作业在不同的 worker 节点上运行,并调度到单独的 control plane (执行器)。目前,Red Hat Quay 支持在 AWS 和 Kubernetes 上运行作业。使用 quay.io/quay/quay-builder 执行构建。在 AWS 上,构建会根据 EC2 实例调度。在 k8s 上,构建被调度为作业资源。

6.1.3. 编配器

编排器用于存储当前运行的构建作业的状态,并将构建管理器的事件发布到使用。例如:过期事件。目前,支持的编配器后端是 Redis。

6.2. OpenShift 要求

Kubernetes 和 OpenShift 4.5 及更高版本上支持 Red Hat Quay 构建。需要裸机(非虚拟化)worker 节点,因为构建 pod 需要具备运行 kvm 虚拟化的功能。每个构建在临时虚拟机中进行,以确保构建运行时完全隔离和安全性。另外,您的 OpenShift 集群应该允许与 Red Hat Quay 构建关联的 ServiceAccount 运行,以便与所需的 SecurityContextConstraint 一起运行,以支持特权容器。

6.3. 编配器要求

Red Hat Quay 构建需要访问 Redis 实例来跟踪构建状态信息。可以使用相同的 Redis 实例已与您的 Red Hat Quay 安装一起部署。所有构建队列都在 Red Hat Quay 数据库中管理,因此不需要高度可用的 Redis 实例。

6.4. 使用 OpenShift 设置 Red Hat Quay Builder

6.4.1. OpenShift TLS 组件

tls 组件允许您控制 TLS 配置。

注意

当 TLS 组件由 Operator 管理时,Red Hat Quay 3.7 不支持构建器。

如果将 tls 设置为 非受管,则提供自己的 ssl.certssl.key 文件。在本例中,如果希望集群支持构建器,您必须将 Quay 路由和构建器路由名称添加到证书中的 SAN 列表中,或使用通配符。要添加构建器路由,请使用以下格式:

[quayregistry-cr-name]-quay-builder-[ocp-namespace].[ocp-domain-name]
Copy to Clipboard Toggle word wrap

6.4.2. Prepare OpenShift for Red Hat Quay Builds

在 OpenShift 集群中接受 Red Hat Quay 构建前,需要一些操作。

  1. 创建一个将运行构建的项目(如 'builder')

    $ oc new-project builder
    Copy to Clipboard Toggle word wrap
  2. 在此项目中创建一个 ServiceAccount,它将用于运行构建。确保有足够的权限来创建 作业和 Pod。复制 ServiceAccount的令牌,以便稍后使用。

    $ oc create sa -n builder quay-builder
    $ oc policy add-role-to-user -n builder edit system:serviceaccount:builder:quay-builder
    $ oc sa get-token -n builder quay-builder
    Copy to Clipboard Toggle word wrap
  3. 识别 OpenShift 集群 API 服务器的 URL。这可以通过 OpenShift 控制台找到。
  4. 识别调度构建作业时使用的 worker 节点标签。因为构建 pod 需要在裸机 worker 节点上运行,因此通常使用特定标签来标识这些 pod。检查您的集群管理员,以确定应使用哪个节点标签。
  5. 如果集群使用自签名证书,获取 kube apiserver 的 CA 来添加到 Red Hat Quay 的额外证书中。

    1. 获取包含 CA 的 secret 名称:

      $ oc get sa openshift-apiserver-sa --namespace=openshift-apiserver -o json | jq '.secrets[] | select(.name | contains("openshift-apiserver-sa-token"))'.name
      Copy to Clipboard Toggle word wrap
    2. 从 Openshift 控制台中的 secret 获取 ca.crt 键值。该值应该以"-----BEGIN CERTIFICATE-----"开头。
    3. 使用 ConfigTool 在 Red Hat Quay 中导入 CA。确保此文件的名称匹配 K8S_API_TLS_CA
  6. ServiceAccount 创建所需的安全上下文/角色绑定:
apiVersion: security.openshift.io/v1
kind: SecurityContextConstraints
metadata:
  name: quay-builder
priority: null
readOnlyRootFilesystem: false
requiredDropCapabilities: null
runAsUser:
  type: RunAsAny
seLinuxContext:
  type: RunAsAny
seccompProfiles:
- '*'
supplementalGroups:
  type: RunAsAny
volumes:
- '*'
allowHostDirVolumePlugin: true
allowHostIPC: true
allowHostNetwork: true
allowHostPID: true
allowHostPorts: true
allowPrivilegeEscalation: true
allowPrivilegedContainer: true
allowedCapabilities:
- '*'
allowedUnsafeSysctls:
- '*'
defaultAddCapabilities: null
fsGroup:
  type: RunAsAny
---
apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: quay-builder-scc
  namespace: builder
rules:
- apiGroups:
  - security.openshift.io
  resourceNames:
  - quay-builder
  resources:
  - securitycontextconstraints
  verbs:
  - use
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: quay-builder-scc
  namespace: builder
subjects:
- kind: ServiceAccount
  name: quay-builder
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: quay-builder-scc
Copy to Clipboard Toggle word wrap
  1. 确保已在 Red Hat Quay 配置中启用了 Builds。
FEATURE_BUILD_SUPPORT: True
Copy to Clipboard Toggle word wrap
  1. 将以下内容添加到 Red Hat Quay 配置捆绑包中,使用特定于安装的值替换每个值。
注意

目前,只能通过 Red Hat Quay Config Tool 启用构建功能。必须在 config.yaml 文件中手动进行 Build Manager 和 Executors 的实际配置。

BUILD_MANAGER:
- ephemeral
- ALLOWED_WORKER_COUNT: 1
  ORCHESTRATOR_PREFIX: buildman/production/
  ORCHESTRATOR:
    REDIS_HOST: quay-redis-host
    REDIS_PASSWORD: quay-redis-password
    REDIS_SSL: true
    REDIS_SKIP_KEYSPACE_EVENT_SETUP: false
  EXECUTORS:
  - EXECUTOR: kubernetes
    BUILDER_NAMESPACE: builder
    K8S_API_SERVER: api.openshift.somehost.org:6443
    K8S_API_TLS_CA: /conf/stack/extra_ca_certs/build_cluster.crt
    VOLUME_SIZE: 8G
    KUBERNETES_DISTRIBUTION: openshift
    CONTAINER_MEMORY_LIMITS: 5120Mi
    CONTAINER_CPU_LIMITS: 1000m
    CONTAINER_MEMORY_REQUEST: 3968Mi
    CONTAINER_CPU_REQUEST: 500m
    NODE_SELECTOR_LABEL_KEY: beta.kubernetes.io/instance-type
    NODE_SELECTOR_LABEL_VALUE: n1-standard-4
    CONTAINER_RUNTIME: podman
    SERVICE_ACCOUNT_NAME: *****
    SERVICE_ACCOUNT_TOKEN: *****
    QUAY_USERNAME: quay-username
    QUAY_PASSWORD: quay-password
    WORKER_IMAGE: <registry>/quay-quay-builder
    WORKER_TAG: some_tag
    BUILDER_VM_CONTAINER_IMAGE: <registry>/quay-quay-builder-qemu-rhcos:v3.4.0
    SETUP_TIME: 180
    MINIMUM_RETRY_THRESHOLD: 0
    SSH_AUTHORIZED_KEYS:
    - ssh-rsa 12345 someuser@email.com
    - ssh-rsa 67890 someuser2@email.com
Copy to Clipboard Toggle word wrap

每个配置字段都如下所述。

ALLOWED_WORKER_COUNT
定义每个 Red Hat Quay Pod 的 Build Worker 数。通常这是 '1'。
ORCHESTRATOR_PREFIX
定义要添加到所有 Redis 密钥的唯一前缀(使用等同于将 Orchestrator 值与其他 Redis 密钥隔离)。
REDIS_HOST
Redis 服务的主机名。
REDIS_PASSWORD
在 Redis 服务中进行身份验证的密码。
REDIS_SSL
定义您的 Redis 连接是否使用 SSL。
REDIS_SKIP_KEYSPACE_EVENT_SETUP
默认情况下,Red Hat Quay 不会在运行时设置关键事件所需的关键空间事件。为此,请将 REDIS_SKIP_KEYSPACE_EVENT_SETUP 设置为 false
EXECUTOR
启动此类型的执行者定义。有效值为 'kubernetes' 和 'ec2'
BUILDER_NAMESPACE
Red Hat Quay 构建要放置的 Kubernetes 命名空间
K8S_API_SERVER
构建所需的 OpenShift 集群的 API 服务器主机名
K8S_API_TLS_CA
构建集群的 CA 证书的 Quay 容器中的文件路径,以便在发出 API 调用时信任它。
KUBERNETES_DISTRIBUTION
指明正在使用的 Kubernetes 类型。有效值为 'openshift' 和 'k8s'。
CONTAINER_*
定义每个构建 Pod 的资源请求和限值。
NODE_SELECTOR_*
定义节点选择器标签名称/值对,其中应调度构建 Pod。
CONTAINER_RUNTIME
指定构建器是否应该运行 dockerpodman。使用红帽 quay-builder 镜像的客户应将其设置为 podman
SERVICE_ACCOUNT_NAME/SERVICE_ACCOUNT_TOKEN
定义将由构建 Pod 使用的服务帐户名称/令牌。
QUAY_USERNAME/QUAY_PASSWORD
定义拉取 WORKER_IMAGE 字段中指定的 Red Hat Quay 构建 worker 镜像所需的 registry 凭证。客户应提供一个 Red Hat Service Account 凭证,如 https://access.redhat.com/RegistryAuthentication 文章中的针对 registry.redhat.io 的"创建 Registry 服务账户"部分。
WORKER_IMAGE
Red Hat Quay 构建器镜像的镜像引用。registry.redhat.io/quay/quay-builder
WORKER_TAG
所需构建器镜像的标签。最新版本为 v3.4.0。
BUILDER_VM_CONTAINER_IMAGE
对包含运行每个 Red Hat Quay 构建所需的内部虚拟机(registry.redhat.io/quay/quay-builder-qemu-rhcos:v3.4.0)所需的容器镜像的完整引用。
SETUP_TIME
指定构建在构建管理器尚未注册到自身(默认为 500 秒)时超时的秒数。尝试超时的构建三次重启。如果构建在三次尝试失败后没有注册,则认为失败。
MINIMUM_RETRY_THRESHOLD
此设置与多个 Executors 一起使用;它指示在选择其他可执行文件之前尝试启动构建的次数。设置为 0 意味着构建作业需要有多少个限制。此值应有意保持 small (三个或更少),以确保在基础架构发生故障时迅速发生故障转移。您必须为此设置指定一个值。例如,Kubernetes 被设置为第一个 executor 和 EC2 作为第二个 executor。如果我们希望最终试图运行的作业总在 EC2 上而不是在 Kubernetes 上运行时,应该将 Kubernetes executor 的 MINIMUM_RETRY_THRESHOLD 设置为 1,EC2 的 MINIMUM_RETRY_THRESHOLD 设置为 0 (如果没有设置,默认为 0)。在本例中,kubernetes 的 MINIMUM_RETRY_THRESHOLD > retries_remaining (1)将评估为 False,因此回退到配置的第二个执行过程
SSH_AUTHORIZED_KEYS
ignition 配置中到 bootstrap 的 ssh 密钥列表。这允许其他密钥用于 ssh 到 EC2 实例或 QEMU 虚拟机

6.5. OpenShift 路由限制

注意

只有在在带有受管 路由 组件的 OpenShift 上使用 Quay Operator 时,才适用本节。

由于 OpenShift 路由 的一个限制只能为单一端口提供流量,因此设置构建需要额外的步骤。确保您的 kubectloc CLI 工具被配置为与安装 Quay Operator 的集群一起工作,并且您的 QuayRegistry 存在(您的 QuayRegistry 不一定与运行构建器的裸机集群相同)。

  • 按照以下步骤,确保 OpenShift 集群上启用了 HTTP/2 入口。
  • Quay Operator 将创建一个 Route,它将 gRPC 流量定向到在现有 Quay pod 内运行的构建管理器服务器。如果要使用自定义主机名(如 builder.registry.example.com)的自定义主机名,请确保创建一个带有 DNS 供应商的 CNAME 记录,指向所创建的 Routestatus.ingress[0].host

    $ kubectl get -n <namespace> route <quayregistry-name>-quay-builder -o jsonpath={.status.ingress[0].host}
    Copy to Clipboard Toggle word wrap
  • 通过 OpenShift UI 或 CLI,使用构建集群 CA 证书(密钥 extra_ca_cert_build_cluster.cert)更新 QuayRegistryspec.configBundleSecret 引用的 Secret, 使用上面的构建程序配置(取决于您的构建 executor))中引用的正确的值以及 BUILDMAN_HOSTNAME 字段更新 config.yaml 条目:

    BUILDMAN_HOSTNAME: <build-manager-hostname>
    BUILD_MANAGER:
    - ephemeral
    - ALLOWED_WORKER_COUNT: 1
      ORCHESTRATOR_PREFIX: buildman/production/
      JOB_REGISTRATION_TIMEOUT: 600
      ORCHESTRATOR:
        REDIS_HOST: quay-redis-host
        REDIS_PASSWORD: quay-redis-password
        REDIS_SSL: true
        REDIS_SKIP_KEYSPACE_EVENT_SETUP: false
      EXECUTORS:
      - EXECUTOR: kubernetes
        BUILDER_NAMESPACE: builder
        ...
    Copy to Clipboard Toggle word wrap

额外的配置字段如下所述:

BUILDMAN_HOSTNAME
外部可访问的服务器主机名,构建作业用来与构建管理器通信。默认为与 SERVER_HOSTNAME 相同。对于 OpenShift Route,如果使用自定义主机名,则 status.ingress[0].host 或 CNAME 条目。BUILDMAN_HOSTNAME 需要包含 端口号,如 Openshift Route 的 某些主机:443,因为用于与构建管理器通信的 gRPC 客户端如果省略,则任何端口都不会推断出来。

6.6. 构建故障排除

由构建管理器启动的构建器实例是临时的。这意味着,它们会在超时/故障时关闭 Red Hat Quay},或者由 control plane (EC2/K8s)收集的垃圾回收。这意味着,为了获取构建器日志,构建 运行时 需要这样做。

6.6.1. DEBUG 配置标志

可以设置 DEBUG 标志,以防止在 completion/failure 后清理构建器实例。要做到这一点,在所需的 executor 配置中,将 DEBUG 设置为 true。例如:

  EXECUTORS:
    - EXECUTOR: ec2
      DEBUG: true
      ...
    - EXECUTOR: kubernetes
      DEBUG: true
      ...
Copy to Clipboard Toggle word wrap

当设置为 true 时,DEBUG 将阻止构建节点在 quay-builder 服务完成后关闭,并阻止构建管理器清理实例(终止 EC2 实例或删除 k8s 作业)。这将允许调试构建器节点问题,不应 在生产环境中设置。生命周期服务仍然存在。例如,实例在约 2 小时(EC2 实例将终止)后,K8s 作业也将影响 ALLOWED_WORKER_COUNT,因为未终止的实例/作业仍然会计算运行的工作总数。这意味着,如果达到 ALLOWED_WORKER_COUNT,则需要手动删除现有的构建器工作程序,才能调度新构建。

使用以下步骤:

  1. 客户机虚拟机将其 SSH 端口(22)转发到其主机(容器集)端口 2222。将构建器 Pod 的端口 2222 转发到 localhost 上的端口。例如

    $ kubectl port-forward <builder pod> 9999:2222
    Copy to Clipboard Toggle word wrap
  2. 使用从 SSH_AUTHORIZED_KEYS 设置的密钥,通过 SSH 连接到容器内运行的虚拟机:

    $ ssh -i /path/to/ssh/key/set/in/ssh_authorized_keys -p 9999 core@localhost
    Copy to Clipboard Toggle word wrap
  3. 获取 quay-builder 服务日志:

    $ systemctl status quay-builder
    $ journalctl -f -u quay-builder
    Copy to Clipboard Toggle word wrap
    • 在单一 SSH 命令中也可以完成第 2-3 步:

      $ ssh -i /path/to/ssh/key/set/in/ssh_authorized_keys -p 9999 core@localhost ‘systemctl status quay-builder’
      $ ssh -i /path/to/ssh/key/set/in/ssh_authorized_keys -p 9999 core@localhost ‘journalctl -f -u quay-builder’
      Copy to Clipboard Toggle word wrap

6.7. 设置 GitHub 构建(可选)

如果您的组织计划通过推送到 GitHub (或 GitHub Enterprise)进行构建,继续在 GitHub 中创建 OAuth 应用程序

第 7 章 构建 Dockerfile

Red Hat Quay 支持在我们的构建 fleet 上构建 Dockerfile,并将生成的镜像推送到存储库。

7.1. 查看和管理构建

可以通过单击 Repository View 中的 Builds 选项卡来查看和管理存储库构建。

7.2. 手动启动构建

要手动启动存储库构建,请单击任何存储库页面上标题右侧的 + 图标,然后选择 New Dockerfile Build。已上传的 Dockerfile.tar.gz 或要用来构建的 HTTP URL。

注意

在手动启动构建时,您将无法指定 Docker 构建上下文。

7.3. 构建触发器

存储库构建也可由事件(如推送到 SCM (GitHub、BitBucket 或 GitLab)的事件自动触发,或通过 调用 Webhook 来自动触发存储库构建。

7.3.1. 创建新构建触发器

要设置构建触发器,请单击 Builds 视图 页面上的 Create Build Trigger 按钮,并按照对话框的说明进行操作。您需要授予 Red Hat Quay 访问权限,以便能设置触发器,并且您的帐户 需要在 SCM 存储库 上具有 admin 访问权限

7.3.2. 手动触发构建触发器

要手动触发构建触发器,可单击构建触发器旁边的图标,然后选择 Run Now

7.3.3. 构建上下文

使用 Docker 构建镜像时,系统将指定一个目录来成为构建上下文。这适用于手动构建和构建触发器,因为 Red Hat Quay 执行的构建与在您自己的机器上运行 docker build 不同。

Red Hat Quay 构建上下文始终从构建设置中的指定 子目录,并在没有指定构建源时回退到构建源的根目录。触发构建时,Red Hat Quay 构建 worker 会将 git 存储库克隆到 worker 机器,并在执行构建前输入构建上下文。

对于基于 tar 归档的构建,构建工作程序提取存档并进入构建上下文。例如:

example
├── .git
├── Dockerfile
├── file
└── subdir
    └── Dockerfile
Copy to Clipboard Toggle word wrap

试想一下,上面的示例是 GitHub 存储库的目录结构,名为"example"。如果构建触发器设置中没有指定子目录,或者手动启动构建时,构建将在示例目录中操作。

如果将 subdir 指定为构建触发器设置中的子目录,则只有其中的 Dockerfile 才对构建可见。这意味着您无法使用 Dockerfile 中的 ADD 命令来添加 文件,因为它不在构建上下文之外。

与 Docker Hub 不同,Dockerfile 是 Red Hat Quay 上构建上下文的一部分。因此,它一定不会出现在 .dockerignore 文件中。

第 8 章 设置自定义 Git Trigger

Custom Git Trigger 是一个通用方法,可供任何 git 服务器充当构建触发器。它仅依赖于 SSH 密钥和 Webhook 端点,其他所有内容都留给用户实现。

8.1. 创建触发器

创建自定义 Git Trigger 类似于使用几个细微差别创建任何其他触发器:

  • Red Hat Quay 无法自动检测要用于触发器的适当机器机器帐户。这必须在创建过程中手动完成。
  • 在创建触发器后还有额外的步骤,必须使用触发器。这些步骤的详情如下。

8.2. 触发器创建后设置

创建触发器后,可以使用触发器 前需要 2 个额外的步骤

  • 提供创建触发器时生成的 SSH 公钥 的读取访问权限。
  • 设置 POST 到 Red Hat Quay 端点的 webhook,以触发构建。

此处和 URL 都可通过从触发器列表中的 gear 中选择 View Credentials 来使用。 View and modify tags from your repository

8.2.1. SSH 公钥访问

根据 Git 服务器设置,可以通过多种方式安装 Red Hat Quay 为自定义 git 触发器生成的 SSH 公钥。例如,Git 文档 描述了一个小型服务器设置,其中只需将密钥添加到 $HOME/.ssh/authorize_keys,即可为构建器提供克隆存储库的访问。对于任何不受官方支持的 git 存储库管理软件,通常有一个位置来输入密钥,通常被标记为 Deploy Keys

8.2.2. Webhook

要自动触发构建,必须使用以下格式将 JSON 有效负载 POST 到 webhook URL:

{
  "commit": "1c002dd",                                   // required
  "ref": "refs/heads/master",                            // required
  "default_branch": "master",                            // required
  "commit_info": {                                       // optional
    "url": "gitsoftware.com/repository/commits/1234567", // required
    "message": "initial commit",                         // required
    "date": "timestamp",                                 // required
    "author": {                                          // optional
      "username": "user",                                // required
      "avatar_url": "gravatar.com/user.png",             // required
      "url": "gitsoftware.com/users/user"                // required
    },
    "committer": {                                       // optional
      "username": "user",                                // required
      "avatar_url": "gravatar.com/user.png",             // required
      "url": "gitsoftware.com/users/user"                // required
    }
  }
}
Copy to Clipboard Toggle word wrap
注意

此请求需要包含 application/jsonContent-Type 标头才有效。

再次,可以根据服务器设置以各种方式完成此操作,但对于大多数情况下,可以使用 post-receive git hook 来完成。

第 9 章 跳过源控制触发构建

要指定 Red Hat Quay build 系统应忽略提交,请在提交消息的任意位置添加文本 [skip build][build skip]

第 10 章 设置 GitHub 构建触发器标签

Red Hat Quay 支持使用 GitHub 或 GitHub Enterprise 作为构建镜像的触发器。如果您还没有这样做,请继续并在 Red Hat Quay 中启用构建支持

10.1. 了解构建触发器的标签命名

在 Red Hat Quay 3.3 之前,从构建触发器创建的镜像如何被命名。由构建触发器构建的镜像的名称如下:

  • 调用触发器的分支或标签
  • 具有使用默认分支的镜像的 latest 标签

从 Red Hat Quay 3.3 及更新的版本起,您在设置镜像标签方面具有更大的灵活性。您可以做的第一件事是输入自定义标签,以将任何字符串指定为每个构建的镜像的标签。但是,作为替代方案,您可以使用以下标签模板使用每个提交中的信息标记镜像:

  • ${commit_info.short_sha}: 提交的短 SHA
  • ${commit_info.date} :提交的时间戳
  • ${commit_info.author}: 提交的作者
  • ${commit_info.committer} :提交的提交者
  • ${parsed_ref.branch}: 分支名称

以下流程描述了如何为构建触发器设置标记。

10.2. 为构建触发器设置标签名称

按照以下步骤为构建触发器配置自定义标签:

  1. 在存储库视图中,从左侧导航中选择 Builds 图标。
  2. 选择 Create Build Trigger 菜单,再选择您想要的存储库推送的类型(GitHub、Bitbucket、GitLab 或 Custom Git 存储库推送)。在本例中,选择了 GitHub Repository Push,如下图所示。

    Choose the type of build trigger to use

  3. 当显示 Setup Build Trigger 页面时,选择您要在其中设置触发器的存储库和命名空间。
  4. 在 Configure Trigger 下,选择 Trigger for all branches and tagsTrigger only on branches and tags matching a regular expression。然后选择 Continue。Configure Tagging 部分会出现,如下图所示:

    Set tagging with your own tags or using tag templates

  5. 向下滚动到 Configure Tagging,然后从以下选项中选择:

    • 带有分支或标签名称 : Check this box 的标签清单,以使用提交发生在镜像上使用的标签的分支或标签的名称。这会被默认启用。
    • 在默认分支上添加 latest 标签 :如果此框位于存储库的默认分支上,则使用该镜像的 latest 标签。这会被默认启用。
    • 添加自定义标记模板 :在 Enter a tag 模板 框中输入自定义标签或模板。您可以在此处输入多个标签模板,如本节前面所述。它们包括使用简短的 SHA、时间戳、作者名称、提交者和分支名称作为标签的方法。
  6. 选择 Continue。系统会提示您输入 Docker 构建的目录构建上下文。构建上下文目录标识含有 Dockerfile 的目录的位置,以及触发构建时所需的其他文件。如果 Dockerfile 位于 git 存储库的根目录,则请输入 "/"。
  7. 选择 Continue。系统将提示您添加可选的 Robot Account。如果要在构建过程中拉取私有基础镜像,请执行以下操作。机器人帐户需要访问构建。
  8. 选择 Continue 以完成构建触发器的设置。

如果要返回到存储库的 Repository Builds 页面,则您设置的构建触发器将在 Build Triggers 标题下列出。

See the tagging options you set from the repository view

第 11 章 在 GitHub 中创建 OAuth 应用程序

您可以授权 registry 访问 GitHub 帐户及其存储库,方法是将它注册为 GitHub OAuth 应用程序。

11.1. 创建新 GitHub 应用程序

  1. 登录 GitHub (企业)
  2. 访问您组织设置下的 Applications 页面。
  3. Register New Application。此时会显示 Register a new OAuth 应用程序 配置屏幕: Register a new OAuth application
  4. 设置主页 URL:输入 Quay Enterprise URL 作为 Homepage URL

    注意

    如果使用公共 GitHub,则输入的主页 URL 必须可以被您的用户访问。它仍然是内部 URL。

  5. 设置授权回调 URL:输入 https://{$RED_HAT_QUAY_URL}/oauth2/github/callback 作为授权回调 URL。
  6. 点 Register application 按钮保存您的设置。此时会显示新应用程序概述:
  7. 记录为新应用显示的客户端 ID 和客户端 Secret。

第 12 章 仓库通知

Quay 支持将 通知 添加到仓库生命周期中发生的各种事件的存储库中。要添加通知,可在查看存储库时单击 Settings 选项卡,然后选择 Create Notification在发生此事件时,选择您要接收通知的项目:

Create repository notifications

选择事件后,通过添加如何通知该事件来进一步配置该事件。

注意

添加通知需要 存储库 admin 权限

以下是存储库事件的示例。

12.1. 仓库事件

12.1.1. 存储库 Push

向存储库成功推送一个或多个镜像:

{
  "name": "repository",
  "repository": "dgangaia/test",
  "namespace": "dgangaia",
  "docker_url": "quay.io/dgangaia/test",
  "homepage": "https://quay.io/repository/dgangaia/repository",
  "updated_tags": [
    "latest"
  ]
}
Copy to Clipboard Toggle word wrap

12.1.2. Dockerfile 构建队列

下面是在构建系统中排队 Dockerfile 构建的示例响应。根据可选属性的使用,响应可能会不同。

{
  "build_id": "296ec063-5f86-4706-a469-f0a400bf9df2",
  "trigger_kind": "github",                                                       //Optional
  "name": "test",
  "repository": "dgangaia/test",
  "namespace": "dgangaia",
  "docker_url": "quay.io/dgangaia/test",
  "trigger_id": "38b6e180-9521-4ff7-9844-acf371340b9e",                           //Optional
  "docker_tags": [
    "master",
    "latest"
  ],
  "repo": "test",
  "trigger_metadata": {
    "default_branch": "master",
    "commit": "b7f7d2b948aacbe844ee465122a85a9368b2b735",
    "ref": "refs/heads/master",
    "git_url": "git@github.com:dgangaia/test.git",
    "commit_info": {                                                             //Optional
      "url": "https://github.com/dgangaia/test/commit/b7f7d2b948aacbe844ee465122a85a9368b2b735",
      "date": "2019-03-06T12:48:24+11:00",
      "message": "adding 5",
      "author": {                                                                //Optional
        "username": "dgangaia",
        "url": "https://github.com/dgangaia",                                    //Optional
        "avatar_url": "https://avatars1.githubusercontent.com/u/43594254?v=4"    //Optional
      },
      "committer": {
        "username": "web-flow",
        "url": "https://github.com/web-flow",
        "avatar_url": "https://avatars3.githubusercontent.com/u/19864447?v=4"
      }
    }
  },
  "is_manual": false,
  "manual_user": null,
  "homepage": "https://quay.io/repository/dgangaia/test/build/296ec063-5f86-4706-a469-f0a400bf9df2"
}
Copy to Clipboard Toggle word wrap

12.1.3. Dockerfile 构建已启动

下面是构建系统启动的 Dockerfile 构建示例。根据某些属性,响应可能会因一些属性而异。

{
  "build_id": "a8cc247a-a662-4fee-8dcb-7d7e822b71ba",
  "trigger_kind": "github",                                                     //Optional
  "name": "test",
  "repository": "dgangaia/test",
  "namespace": "dgangaia",
  "docker_url": "quay.io/dgangaia/test",
  "trigger_id": "38b6e180-9521-4ff7-9844-acf371340b9e",                         //Optional
  "docker_tags": [
    "master",
    "latest"
  ],
  "build_name": "50bc599",
  "trigger_metadata": {                                                         //Optional
    "commit": "50bc5996d4587fd4b2d8edc4af652d4cec293c42",
    "ref": "refs/heads/master",
    "default_branch": "master",
    "git_url": "git@github.com:dgangaia/test.git",
    "commit_info": {                                                            //Optional
      "url": "https://github.com/dgangaia/test/commit/50bc5996d4587fd4b2d8edc4af652d4cec293c42",
      "date": "2019-03-06T14:10:14+11:00",
      "message": "test build",
      "committer": {                                                            //Optional
        "username": "web-flow",
        "url": "https://github.com/web-flow",                                   //Optional
        "avatar_url": "https://avatars3.githubusercontent.com/u/19864447?v=4"   //Optional
      },
      "author": {                                                               //Optional
        "username": "dgangaia",
        "url": "https://github.com/dgangaia",                                   //Optional
        "avatar_url": "https://avatars1.githubusercontent.com/u/43594254?v=4"   //Optional
      }
    }
  },
  "homepage": "https://quay.io/repository/dgangaia/test/build/a8cc247a-a662-4fee-8dcb-7d7e822b71ba"
}
Copy to Clipboard Toggle word wrap

12.1.4. Dockerfile 构建成功完成

以下是构建系统已成功完成的 Dockerfile 构建的示例响应:

注意

此事件会同时 发生,带有一个构建镜像的 Repository Push 事件。

{
  "build_id": "296ec063-5f86-4706-a469-f0a400bf9df2",
  "trigger_kind": "github",                                                       //Optional
  "name": "test",
  "repository": "dgangaia/test",
  "namespace": "dgangaia",
  "docker_url": "quay.io/dgangaia/test",
  "trigger_id": "38b6e180-9521-4ff7-9844-acf371340b9e",                           //Optional
  "docker_tags": [
    "master",
    "latest"
  ],
  "build_name": "b7f7d2b",
  "image_id": "sha256:0339f178f26ae24930e9ad32751d6839015109eabdf1c25b3b0f2abf8934f6cb",
  "trigger_metadata": {
    "commit": "b7f7d2b948aacbe844ee465122a85a9368b2b735",
    "ref": "refs/heads/master",
    "default_branch": "master",
    "git_url": "git@github.com:dgangaia/test.git",
    "commit_info": {                                                              //Optional
      "url": "https://github.com/dgangaia/test/commit/b7f7d2b948aacbe844ee465122a85a9368b2b735",
      "date": "2019-03-06T12:48:24+11:00",
      "message": "adding 5",
      "committer": {                                                              //Optional
        "username": "web-flow",
        "url": "https://github.com/web-flow",                                     //Optional
        "avatar_url": "https://avatars3.githubusercontent.com/u/19864447?v=4"                                                        //Optional
      },
      "author": {                                                                 //Optional
        "username": "dgangaia",
        "url": "https://github.com/dgangaia",                                     //Optional
        "avatar_url": "https://avatars1.githubusercontent.com/u/43594254?v=4"     //Optional
      }
    }
  },
  "homepage": "https://quay.io/repository/dgangaia/test/build/296ec063-5f86-4706-a469-f0a400bf9df2",
  "manifest_digests": [
    "quay.io/dgangaia/test@sha256:2a7af5265344cc3704d5d47c4604b1efcbd227a7a6a6ff73d6e4e08a27fd7d99",
    "quay.io/dgangaia/test@sha256:569e7db1a867069835e8e97d50c96eccafde65f08ea3e0d5debaf16e2545d9d1"
  ]
}
Copy to Clipboard Toggle word wrap

12.1.5. Dockerfile 构建失败

Dockerfile 构建失败

{
  "build_id": "5346a21d-3434-4764-85be-5be1296f293c",
  "trigger_kind": "github",                                                       //Optional
  "name": "test",
  "repository": "dgangaia/test",
  "docker_url": "quay.io/dgangaia/test",
  "error_message": "Could not find or parse Dockerfile: unknown instruction: GIT",
  "namespace": "dgangaia",
  "trigger_id": "38b6e180-9521-4ff7-9844-acf371340b9e",                           //Optional
  "docker_tags": [
    "master",
    "latest"
  ],
  "build_name": "6ae9a86",
  "trigger_metadata": {                                                           //Optional
    "commit": "6ae9a86930fc73dd07b02e4c5bf63ee60be180ad",
    "ref": "refs/heads/master",
    "default_branch": "master",
    "git_url": "git@github.com:dgangaia/test.git",
    "commit_info": {                                                              //Optional
      "url": "https://github.com/dgangaia/test/commit/6ae9a86930fc73dd07b02e4c5bf63ee60be180ad",
      "date": "2019-03-06T14:18:16+11:00",
      "message": "failed build test",
      "committer": {                                                              //Optional
        "username": "web-flow",
        "url": "https://github.com/web-flow",                                     //Optional
        "avatar_url": "https://avatars3.githubusercontent.com/u/19864447?v=4"     //Optional
      },
      "author": {                                                                 //Optional
        "username": "dgangaia",
        "url": "https://github.com/dgangaia",                                     //Optional
        "avatar_url": "https://avatars1.githubusercontent.com/u/43594254?v=4"     //Optional
      }
    }
  },
  "homepage": "https://quay.io/repository/dgangaia/test/build/5346a21d-3434-4764-85be-5be1296f293c"
}
Copy to Clipboard Toggle word wrap

12.1.6. Dockerfile 构建取消

已取消 Dockerfile 构建

{
  "build_id": "cbd534c5-f1c0-4816-b4e3-55446b851e70",
  "trigger_kind": "github",
  "name": "test",
  "repository": "dgangaia/test",
  "namespace": "dgangaia",
  "docker_url": "quay.io/dgangaia/test",
  "trigger_id": "38b6e180-9521-4ff7-9844-acf371340b9e",
  "docker_tags": [
    "master",
    "latest"
  ],
  "build_name": "cbce83c",
  "trigger_metadata": {
    "commit": "cbce83c04bfb59734fc42a83aab738704ba7ec41",
    "ref": "refs/heads/master",
    "default_branch": "master",
    "git_url": "git@github.com:dgangaia/test.git",
    "commit_info": {
      "url": "https://github.com/dgangaia/test/commit/cbce83c04bfb59734fc42a83aab738704ba7ec41",
      "date": "2019-03-06T14:27:53+11:00",
      "message": "testing cancel build",
      "committer": {
        "username": "web-flow",
        "url": "https://github.com/web-flow",
        "avatar_url": "https://avatars3.githubusercontent.com/u/19864447?v=4"
      },
      "author": {
        "username": "dgangaia",
        "url": "https://github.com/dgangaia",
        "avatar_url": "https://avatars1.githubusercontent.com/u/43594254?v=4"
      }
    }
  },
  "homepage": "https://quay.io/repository/dgangaia/test/build/cbd534c5-f1c0-4816-b4e3-55446b851e70"
}
Copy to Clipboard Toggle word wrap

12.1.7. 安全漏洞已弃用

在存储库中检测到一个漏洞

{
  "repository": "dgangaia/repository",
  "namespace": "dgangaia",
  "name": "repository",
  "docker_url": "quay.io/dgangaia/repository",
  "homepage": "https://quay.io/repository/dgangaia/repository",

  "tags": ["latest", "othertag"],

  "vulnerability": {
    "id": "CVE-1234-5678",
    "description": "This is a bad vulnerability",
    "link": "http://url/to/vuln/info",
    "priority": "Critical",
    "has_fix": true
  }
}
Copy to Clipboard Toggle word wrap

12.2. 通知操作

12.2.1. Quay 通知

通知将添加到 Quay.io 通知区域中。可以通过单击任何 Quay.io 页面右上角的 bell 图标找到通知区域。

Quay.io 通知可以设置为作为一个整体发送给 用户团队 或组织

12.2.2. 电子邮件

电子邮件将发送到指定地址,描述发生的事件。

注意

所有电子邮件地址都必须 逐个存储库 验证

12.2.3. Webhook POST

将对带有事件数据数据的指定 URL 发出 HTTP POST 调用(请参阅以上用于每个事件的数据格式)。

当 URL 为 HTTPS 时,调用将设置自 Quay.io 的 SSL 客户端证书。此证书的验证将证明其源自 Quay.io 的调用。在 2xx 范围内带有状态代码的响应被视为成功。具有任何其他状态代码的响应将被视为失败,并导致 Webhook 通知重试。

12.2.4. Flowdock 通知

向 Flowdock 发言。

12.2.5. HipChat 通知

将消息发送到 HipChat。

12.2.6. Slack 通知

将消息发送到 Slack。

第 13 章 OCI 支持和 Red Hat Quay

Red Hat Quay 等容器注册表最初设计为支持 Docker 镜像格式的容器镜像。为促进 Docker 以外的其他运行时的使用,创建的开放容器项目(OCI)以提供围绕容器运行时和镜像格式的标准化。大多数容器 registry 支持 OCI 标准化,因为它基于 Docker 镜像清单 V2、Schema 2 格式。

除了容器镜像外,还出现了各种工件,它不仅支持单个应用程序,而 Kubernetes 平台作为一个整体的支持。这些范围包括 Open Policy Agent (OPA)策略,用于安全和管理到 Helm chart 和 Operator,以帮助在应用程序部署中。

Red Hat Quay 是一个私有容器 registry,它不仅存储了容器镜像,它支持整个工具生态系统,以帮助管理容器。在默认情况下,Red Hat Quay 3.6 中对基于 OCI 的工件的支持已从 Helm 中扩展,以包含 cosign 和 ztsd 压缩方案。因此,F EATURE_HELM_OCI_SUPPORT 已被弃用。

当使用 OpenShift Operator 部署 Red Hat Quay 3.6 时,在 FEATURE_GENERAL_OCI_SUPPORT 配置下默认启用对 Helm 和 OCI 工件的支持。如果您需要明确启用该功能,例如,如果之前已被禁用,或者已从默认没有启用的版本升级,请参阅 Explicit 启用 OCI 和 Helm 支持

13.1. Helm 和 OCI 的先决条件

  • 可信证书: 在 Helm 客户端和 Quay 间通信通过 HTTPS 和 Helm 3.5 的沟通,它只支持通过 HTTPS 与可信证书通信的 registry。另外,操作系统必须信任 registry 公开的证书。在以后的 Helm 发行版本中支持将允许以不安全方式与远程 registry 进行通信。请记住,请确保您的操作系统已配置为信任 Quay 使用的证书,例如:

    $ sudo cp rootCA.pem   /etc/pki/ca-trust/source/anchors/
    $ sudo update-ca-trust extract
    Copy to Clipboard Toggle word wrap
  • 正式发布: 在 Helm 3.8 中,现在正式发布对 chart 的 OCI registry 支持。
  • 安装 Helm 客户端:Helm 发行 页面中下载您的所需版本。解包它,并将 helm 二进制文件移到所需的目的地:

    $ tar -zxvf helm-v3.8.2-linux-amd64.tar.gz
    $ mv linux-amd64/helm /usr/local/bin/helm
    Copy to Clipboard Toggle word wrap
  • 在 Quay 中创建机构: 使用 Quay registry UI 创建用于存储 Helm chart 的新机构。例如,创建一个名为 helm 的机构。

13.2. 带有 Red Hat Quay 的 Helm chart

Helm,作为云原生计算基金会(CNCF)的研究项目,它已成为 Kubernetes 的事实软件包管理器,因为它简化了应用程序被打包和部署的方式。Helm 使用名为 Charts 的打包格式,其中包含代表应用程序的 Kubernetes 资源。可以对仓库中的常规发行和使用提供图表。Helm 仓库是一个 HTTP 服务器,提供 index.yaml 元数据文件,以及可选的一组打包 chart。从 Helm 版本 3 开始,支持将 OCI registry 中的 chart 作为传统仓库的替代方案发布。

13.2.1. 在 Red Hat Quay 中使用 Helm chart

使用以下示例,从红帽实践(CoP)存储库社区下载和推送 etherpad chart。

流程

  1. 添加 chart 存储库:

    $ helm repo add redhat-cop https://redhat-cop.github.io/helm-charts
    Copy to Clipboard Toggle word wrap
  2. 从 chart 仓库本地更新可用 chart 的信息:

    $ helm repo update
    Copy to Clipboard Toggle word wrap
  3. 从存储库下载 chart:

    $ helm pull redhat-cop/etherpad --version=0.0.4 --untar
    Copy to Clipboard Toggle word wrap
  4. 将图表打包成 chart 归档:

    $ helm package ./etherpad
    Copy to Clipboard Toggle word wrap

    输出示例

    Successfully packaged chart and saved it to: /home/user/linux-amd64/etherpad-0.0.4.tgz
    Copy to Clipboard Toggle word wrap
  5. 使用 helm registry 登录 Quay 存储库:

    $ helm registry login quay370.apps.quayperf370.perfscale.devcluster.openshift.com
    Copy to Clipboard Toggle word wrap
  6. 使用 helm push 命令将 chart 推送到 Quay 存储库:

    $ helm push etherpad-0.0.4.tgz oci://quay370.apps.quayperf370.perfscale.devcluster.openshift.com
    Copy to Clipboard Toggle word wrap

    输出示例:

    Pushed: quay370.apps.quayperf370.perfscale.devcluster.openshift.com/etherpad:0.0.4
    Digest: sha256:a6667ff2a0e2bd7aa4813db9ac854b5124ff1c458d170b70c2d2375325f2451b
    Copy to Clipboard Toggle word wrap
  7. 通过删除本地副本来确保推送可以正常工作,然后从存储库拉取 chart:

    $ rm -rf etherpad-0.0.4.tgz
    Copy to Clipboard Toggle word wrap
    $ helm pull oci://quay370.apps.quayperf370.perfscale.devcluster.openshift.com/etherpad --version 0.0.4
    Copy to Clipboard Toggle word wrap

    输出示例:

    Pulled: quay370.apps.quayperf370.perfscale.devcluster.openshift.com/etherpad:0.0.4
    Digest: sha256:4f627399685880daf30cf77b6026dc129034d68c7676c7e07020b70cf7130902
    Copy to Clipboard Toggle word wrap

13.3. OCI 和 Helm 配置字段

现在,FEATURE _GENERAL_OCI_SUPPORT 属性支持 Helm 的支持。如果您需要明确启用该功能,例如,如果之前已被禁用,或者已从默认没有启用的版本升级,则需要在 Quay 配置中添加两个属性来启用 OCI 工件:

FEATURE_GENERAL_OCI_SUPPORT: true
FEATURE_HELM_OCI_SUPPORT: true
Copy to Clipboard Toggle word wrap
Expand
表 13.1. OCI 和 Helm 配置字段
字段类型Description

FEATURE_GENERAL_OCI_SUPPORT

布尔值

启用对 OCI 工件的支持

默认: True

FEATURE_HELM_OCI_SUPPORT

布尔值

启用对 Helm 工件的支持

默认: True

重要

从 Red Hat Quay 3.6 开始,FEAT URE_HELM_OCI_SUPPORT 已被弃用,并将在以后的 Red Hat Quay 版本中删除。在 Red Hat Quay 3.6 中,Helm 工件会被默认支持,包含在 FEATURE_GENERAL_OCI_SUPPORT 属性下。用户不再需要更新其 config.yaml 文件才能启用支持。

13.4. 使用 Red Hat Quay 进行 OCI 支持

Cosign 是一个可用于签名和验证容器镜像的工具。它使用 ECDSA-P256 签名算法和红帽简单签署有效负载格式来创建存储在 PKIX 文件中的公钥。私钥存储为加密的 PEM 文件。

Cosign 当前支持以下项:

  • 硬件和 KMS 签名
  • 自带的 PKI
  • OIDC PKI
  • 内置二进制透明和时间戳服务

13.5. 使用带有 quay 的 cosign

如果您有 Go 1.16+,您可以使用以下命令直接安装 cosign:

$ go install github.com/sigstore/cosign/cmd/cosign@v1.0.0
go: downloading github.com/sigstore/cosign v1.0.0
go: downloading github.com/peterbourgon/ff/v3 v3.1.0
...
Copy to Clipboard Toggle word wrap

接下来,生成密钥对:

$ cosign generate-key-pair
Enter password for private key:
Enter again:
Private key written to cosign.key
Public key written to cosign.pub
Copy to Clipboard Toggle word wrap

使用以下命令为密钥对签名:

$ cosign sign -key cosign.key quay-server.example.com/user1/busybox:test
Enter password for private key:
Pushing signature to: quay-server.example.com/user1/busybox:sha256-ff13b8f6f289b92ec2913fa57c5dd0a874c3a7f8f149aabee50e3d01546473e3.sig
Copy to Clipboard Toggle word wrap

有些用户可能会遇到以下错误:

error: signing quay-server.example.com/user1/busybox:test: getting remote image: GET https://quay-server.example.com/v2/user1/busybox/manifests/test: UNAUTHORIZED: access to the requested resource is not authorized; map[]
Copy to Clipboard Toggle word wrap

因为 cosign 依赖于 ~/.docker/config.json 进行授权,您可能需要执行以下命令:

$ podman login --authfile ~/.docker/config.json quay-server.example.com
Username:
Password:
Login Succeeded!
Copy to Clipboard Toggle word wrap

您可以使用以下命令查看更新的授权配置:

$ cat ~/.docker/config.json
{
	"auths": {
		"quay-server.example.com": {
			"auth": "cXVheWFkbWluOnBhc3N3b3Jk"
		}
	}
Copy to Clipboard Toggle word wrap

13.6. 在 Quay 中添加其他 OCI 介质类型

Helm、cosign 和 ztsd 压缩方案工件默认内置在 Red Hat Quay 3.6 中。对于默认不支持的任何其他 OCI 介质类型,您可以使用以下格式将它们添加到 ALLOWED_OCI_ARTIFACT_TYPES 配置中:

ALLOWED_OCI_ARTIFACT_TYPES:
  <oci config type 1>:
  - <oci layer type 1>
  - <oci layer type 2>

  <oci config type 2>:
  - <oci layer type 3>
  - <oci layer type 4>
...
Copy to Clipboard Toggle word wrap

例如,您可以通过在 config.yaml 中添加以下内容来添加 Singularity (SIF)支持:

...
ALLOWED_OCI_ARTIFACT_TYPES:
  application/vnd.oci.image.config.v1+json:
  - application/vnd.dev.cosign.simplesigning.v1+json
  application/vnd.cncf.helm.config.v1+json:
  - application/tar+gzip
  application/vnd.sylabs.sif.config.v1+json:
  - application/vnd.sylabs.sif.layer.v1+tar
...
Copy to Clipboard Toggle word wrap
注意

在添加未默认配置的 OCI 介质类型时,用户还需要手动添加对 cosign 和 Helm 的支持。默认情况下支持 ztsd 压缩方案,因此用户不需要将该 OCI 介质类型添加到其 config.yaml 中以启用支持。

13.7. 在 Quay 中禁用 OCI 工件

如果要禁用 OCI 工件支持,可以在 config.yaml 中将 FEATURE_GENERAL_OCI_SUPPORT 设置为 False

...
FEATURE_GENERAL_OCI_SUPPORT = False
...
Copy to Clipboard Toggle word wrap

第 14 章 Red Hat Quay 配额管理和强制

使用 Red Hat Quay 3.7 时,用户可以通过建立配置的存储配额限制来报告存储消耗并包含 registry 增长。现在,内部 Quay 用户已具备以下功能来管理其环境的容量限制:

  • 配额报告: 借助此功能,超级用户可以跟踪所有组织的存储消耗。另外,用户可以跟踪其分配机构的存储消耗。
  • 配额管理: 借助此功能,超级用户可以为 Red Hat Quay 用户定义软和硬检查。软检查告知用户是否机构的存储消耗达到其配置的阈值。硬检查可防止用户在存储消耗达到配置的限制时推送到 registry。

这些功能一起允许 Quay 注册表的服务所有者定义服务级别协议并支持健康的资源预算。

14.1. 配额管理架构

RepositorySize 数据库表包含组织中 Red Hat Quay 存储库的存储消耗(以字节为单位)。组织的所有存储库大小均定义了 Red Hat Quay 组织的当前存储大小。初始化镜像推送后,会验证用户的组织存储来检查是否超过配置的配额限值。如果镜像推送超过定义的配额限制,则会出现软或硬检查:

  • 对于软检查,将通知用户。
  • 对于硬检查,推送将停止。

如果在配置的配额限制内消耗存储,则允许推送继续进行。

镜像清单删除遵循类似的流,通过关联镜像标签和清单之间的链接会被删除。另外,在镜像清单被删除后,存储库大小会被重新计算并在 RepositorySize 表中更新。

14.2. 配额管理限制

配额管理有助于组织维护资源消耗。配额管理的一个限制是计算在推送上的资源消耗会导致计算成为推送关键路径的一部分。如果没有这种情况,使用数据可能会偏移。

最大存储配额大小取决于所选数据库:

Expand
表 14.1. worker 数环境变量
变量Description

Postgres

8388608 TB

MySQL

8388608 TB

SQL Server

16777216 TB

14.3. 配额管理配置

现在,FEATURE _QUOTA_MANAGEMENT 属性支持配额管理,并默认关闭。要启用配额管理,将 config.yaml 中的 feature 标志设置为 true

FEATURE_QUOTA_MANAGEMENT: true
Copy to Clipboard Toggle word wrap
注意

在 Red Hat Quay 3.7 中,需要超级用户权限才能创建、更新和删除配额。虽然可以为用户和机构设置配额,但您无法使用 Red Hat Quay UI 重新配置 用户配额,而您必须使用 API。

14.3.1. 默认配额

要指定应用于每个机构和用户的系统范围默认存储配额,请使用 DEFAULT_SYSTEM_REJECT_QUOTA_BYTES 配置标志。

Expand
表 14.2. 默认配额配置
字段类型Description

DEFAULT_SYSTEM_REJECT_QUOTA_BYTES

字符串

适用于所有机构和用户的配额大小。

默认情况下,不会设置限制。

如果您为机构或用户配置特定的配额,然后删除该配额,那么如果已设置了配额,则应用系统范围的默认配额。同样,如果您为机构或用户配置了特定的配额,然后修改系统范围的默认配额,更新的系统范围默认设置将覆盖任何特定的设置。

14.4. 使用 Red Hat Quay API 建立配额

首次创建机构时,它不会应用配额。使用 /api/v1/organization/{organization}/quota 端点:

示例命令

$ curl -k -X GET -H "Authorization: Bearer <token>" -H 'Content-Type: application/json'  https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg/quota  | jq
Copy to Clipboard Toggle word wrap

输出示例

[]
Copy to Clipboard Toggle word wrap

14.4.1. 设置配额

要为机构设置配额,将数据 POST 到 /api/v1/organization/{orgname}/quota endpoint: .Sample 命令

$ curl -k -X POST -H "Authorization: Bearer <token>" -H 'Content-Type: application/json' -d '{"limit_bytes": 10485760}'  https://example-registry-quay-quay-enterprise.apps.docs.quayteam.org/api/v1/organization/testorg/quota | jq
Copy to Clipboard Toggle word wrap

输出示例

"Created"
Copy to Clipboard Toggle word wrap

14.4.2. 查看配额

要查看应用的配额,请参阅 /api/v1/organization/{orgname}/quota 端点中的 GET 数据:

示例命令

$ curl -k -X GET -H "Authorization: Bearer <token>" -H 'Content-Type: application/json'  https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg/quota  | jq
Copy to Clipboard Toggle word wrap

输出示例

[
  {
    "id": 1,
    "limit_bytes": 10485760,
    "default_config": false,
    "limits": [],
    "default_config_exists": false
  }
]
Copy to Clipboard Toggle word wrap

14.4.3. 修改配额

要更改现有配额,在这个实例中从 10 MB 改为 100 MB,PUT 数据进入 /api/v1/organization/{orgname}/quota/{quota_id} 端点:

示例命令

$ curl -k -X PUT -H "Authorization: Bearer <token>" -H 'Content-Type: application/json' -d '{"limit_bytes": 104857600}'  https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg/quota/1 | jq
Copy to Clipboard Toggle word wrap

输出示例

{
  "id": 1,
  "limit_bytes": 104857600,
  "default_config": false,
  "limits": [],
  "default_config_exists": false
}
Copy to Clipboard Toggle word wrap

14.4.4. 推送镜像

要查看消耗的存储,将各种镜像推送到该组织。

14.4.4.1. 推送 ubuntu:18.04

从命令行将 ubuntu:18.04 推送到机构:

示例命令

$ podman pull ubuntu:18.04

$ podman tag docker.io/library/ubuntu:18.04 example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/ubuntu:18.04

$ podman push --tls-verify=false example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/ubuntu:18.04
Copy to Clipboard Toggle word wrap

14.4.4.2. 使用 API 查看配额用量

要查看消耗的存储,针对 /api/v1/repository 端点使用 GET 数据:

示例命令

$ curl -k -X GET -H "Authorization: Bearer <token>" -H 'Content-Type: application/json' 'https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/repository?last_modified=true&namespace=testorg&popularity=true&public=true&quota=true' | jq
Copy to Clipboard Toggle word wrap

输出示例

{
  "repositories": [
    {
      "namespace": "testorg",
      "name": "ubuntu",
      "description": null,
      "is_public": false,
      "kind": "image",
      "state": "NORMAL",
      "quota_report": {
        "quota_bytes": 27959066,
        "configured_quota": 104857600
      },
      "last_modified": 1651225630,
      "popularity": 0,
      "is_starred": false
    }
  ]
}
Copy to Clipboard Toggle word wrap

14.4.4.3. 推送另一个镜像
  1. 拉取、标记和推送第二个镜像,如 nginx

    示例命令

    $ podman pull nginx
    
    $ podman tag docker.io/library/nginx example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/nginx
    
    $ podman push --tls-verify=false example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/nginx
    Copy to Clipboard Toggle word wrap

  2. 要查看机构中存储库的配额报告,请使用 /api/v1/repository 端点:

    示例命令

    $ curl -k -X GET -H "Authorization: Bearer <token>" -H 'Content-Type: application/json' 'https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/repository?last_modified=true&namespace=testorg&popularity=true&public=true&quota=true'
    Copy to Clipboard Toggle word wrap

    输出示例

    {
      "repositories": [
        {
          "namespace": "testorg",
          "name": "ubuntu",
          "description": null,
          "is_public": false,
          "kind": "image",
          "state": "NORMAL",
          "quota_report": {
            "quota_bytes": 27959066,
            "configured_quota": 104857600
          },
          "last_modified": 1651225630,
          "popularity": 0,
          "is_starred": false
        },
        {
          "namespace": "testorg",
          "name": "nginx",
          "description": null,
          "is_public": false,
          "kind": "image",
          "state": "NORMAL",
          "quota_report": {
            "quota_bytes": 59231659,
            "configured_quota": 104857600
          },
          "last_modified": 1651229507,
          "popularity": 0,
          "is_starred": false
        }
      ]
    }
    Copy to Clipboard Toggle word wrap

  3. 要在机构详情中查看配额信息,请使用 /api/v1/organization/{orgname} 端点:

    示例命令

    $ curl -k -X GET -H "Authorization: Bearer <token>" -H 'Content-Type: application/json' 'https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg' | jq
    Copy to Clipboard Toggle word wrap

    输出示例

    {
      "name": "testorg",
      ...
      "quotas": [
        {
          "id": 1,
          "limit_bytes": 104857600,
          "limits": []
        }
      ],
      "quota_report": {
        "quota_bytes": 87190725,
        "configured_quota": 104857600
      }
    }
    Copy to Clipboard Toggle word wrap

14.4.5. 使用配额限制拒绝推送

如果镜像推送超过定义的配额限制,则会出现软或硬检查:

  • 对于软检查或警告 请通知用户。
  • 对于硬检查 或拒绝,推送将被终止。
14.4.5.1. 设置 reject 和 warning 限制

要设置 rejectwarning 限制,将 POST 数据添加到 /api/v1/organization/{orgname}/quota/{quota_id}/limit 端点:

reject limit 命令示例

$ curl -k -X POST -H "Authorization: Bearer <token>" -H 'Content-Type: application/json' -d '{"type":"Reject","threshold_percent":80}'  https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg/quota/1/limit
Copy to Clipboard Toggle word wrap

警告限制命令示例

$ curl -k -X POST -H "Authorization: Bearer <token>" -H 'Content-Type: application/json' -d '{"type":"Warning","threshold_percent":50}'  https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg/quota/1/limit
Copy to Clipboard Toggle word wrap

14.4.5.2. 查看拒绝和警告限制

要查看 rejectwarning 限制,请使用 /api/v1/organization/{orgname}/quota 端点:

查看配额限制

$  curl -k -X GET -H "Authorization: Bearer <token>" -H 'Content-Type: application/json'  https://example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/api/v1/organization/testorg/quota | jq
Copy to Clipboard Toggle word wrap

配额限制输出示例

[
  {
    "id": 1,
    "limit_bytes": 104857600,
    "default_config": false,
    "limits": [
      {
        "id": 2,
        "type": "Warning",
        "limit_percent": 50
      },
      {
        "id": 1,
        "type": "Reject",
        "limit_percent": 80
      }
    ],
    "default_config_exists": false
  }
]
Copy to Clipboard Toggle word wrap

14.4.5.3. 超过 reject 限制时推送镜像

在本例中,拒绝限制(80%)已设置为低于当前存储库大小(~83%),因此下一个推送应自动被拒绝。

使用命令行将示例镜像推送到机构:

镜像推送示例

$ podman pull ubuntu:20.04

$ podman tag docker.io/library/ubuntu:20.04 example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/ubuntu:20.04

$ podman push --tls-verify=false example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org/testorg/ubuntu:20.04
Copy to Clipboard Toggle word wrap

配额超过时的输出示例

Getting image source signatures
Copying blob d4dfaa212623 [--------------------------------------] 8.0b / 3.5KiB
Copying blob cba97cc5811c [--------------------------------------] 8.0b / 15.0KiB
Copying blob 0c78fac124da [--------------------------------------] 8.0b / 71.8MiB
WARN[0002] failed, retrying in 1s ... (1/3). Error: Error writing blob: Error initiating layer upload to /v2/testorg/ubuntu/blobs/uploads/ in example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org: denied: Quota has been exceeded on namespace
Getting image source signatures
Copying blob d4dfaa212623 [--------------------------------------] 8.0b / 3.5KiB
Copying blob cba97cc5811c [--------------------------------------] 8.0b / 15.0KiB
Copying blob 0c78fac124da [--------------------------------------] 8.0b / 71.8MiB
WARN[0005] failed, retrying in 1s ... (2/3). Error: Error writing blob: Error initiating layer upload to /v2/testorg/ubuntu/blobs/uploads/ in example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org: denied: Quota has been exceeded on namespace
Getting image source signatures
Copying blob d4dfaa212623 [--------------------------------------] 8.0b / 3.5KiB
Copying blob cba97cc5811c [--------------------------------------] 8.0b / 15.0KiB
Copying blob 0c78fac124da [--------------------------------------] 8.0b / 71.8MiB
WARN[0009] failed, retrying in 1s ... (3/3). Error: Error writing blob: Error initiating layer upload to /v2/testorg/ubuntu/blobs/uploads/ in example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org: denied: Quota has been exceeded on namespace
Getting image source signatures
Copying blob d4dfaa212623 [--------------------------------------] 8.0b / 3.5KiB
Copying blob cba97cc5811c [--------------------------------------] 8.0b / 15.0KiB
Copying blob 0c78fac124da [--------------------------------------] 8.0b / 71.8MiB
Error: Error writing blob: Error initiating layer upload to /v2/testorg/ubuntu/blobs/uploads/ in example-registry-quay-quay-enterprise.apps.docs.gcp.quaydev.org: denied: Quota has been exceeded on namespace
Copy to Clipboard Toggle word wrap

14.4.5.4. 超过限制的通知

超过限制时,会出现通知:

配额通知

Quota notifications

随着容器开发日益普及,客户越来越多依赖 Docker 或 Google Cloud Platform 等上游 registry 中的容器镜像来启动和运行。现在,registry 对用户可以从这些 registry 中拉取的次数具有速率限制和节流。

使用此功能,Red Hat Quay 将充当代理缓存,以绕过上游 registry 中的拉取(pull)限制。添加缓存功能也会加快拉取性能,因为镜像是从缓存中拉取的,而不是上游的依赖关系。只有在上游镜像摘要与缓存的镜像不同时,缓存的镜像才会更新,从而减少速率限制和潜在节流。

在 Red Hat Quay 缓存代理中,提供了以下功能:

  • 特定的组织可以定义为上游 registry 的缓存。
  • 配置作为特定上游 registry 的缓存的 Quay 组织。此存储库可以通过 Quay UI 定义,并提供以下配置:

    • 私有存储库的上游 registry 凭证或提高速率限制。
    • 到期计时器以避免超过缓存机构大小。
  • 通过配置应用程序全局配置/关闭。
  • 整个上游 registry 缓存或只是一个命名空间,例如,所有 docker.io 或仅 docker.io/library
  • 所有缓存拉取的日志记录。
  • Clair 的缓存镜像扫描功能。

15.1. 代理缓存架构

下图显示了代理缓存功能的预期设计流和架构。

Proxy cache overview

当用户从 Red Hat Quay 上的上游存储库中拉取(如 postgres:14 )时,存储库会检查是否存在镜像。如果镜像不存在,则会启动新的拉取。拉取(pull)后,镜像层被保存到并行用户的缓存和服务器。下图描述了此情境的架构概述:

Pulled image overview

如果缓存中的镜像存在,用户可以依赖 Quay 的缓存与上游源保持最新状态,以便自动拉取缓存中的更新镜像。当上游 registry 中会覆盖原始镜像的标签时,会出现这种情况。下图显示了当上游镜像和镜像的缓存版本不同时所发生情况的架构概述:

Updating opposing layers overview

如果上游镜像和缓存的版本相同,则不会拉取任何层,缓存的镜像会被传递给用户。

在某些情况下,用户会在上游 registry 停机时启动拉取。如果出现这种情况发生于配置的陈旧期限,则发送存储在缓存中的镜像。如果在配置的过时期后拉取(pull)发生,则错误会传播到用户。以下镜像描述了在配置的过时期限后拉取发生时的架构概述:

Staleness pull overview

Quay 管理员可以利用组织的可配置大小限制来限制缓存大小,以便后端存储消耗保持可预测。这可以通过根据使用镜像的频率从缓存丢弃镜像来实现。下图描述了此情境的架构概述:

15.2. 代理缓存限制

使用 Red Hat Quay 的代理缓存有以下限制:

  • 代理缓存必须具有大于或等于缓存的大小限制,或等于缓存的镜像。例如,如果您的代理缓存组织最大大小为 500 MB,并且用户想要拉取的镜像为 700 MB,则镜像将被缓存并在配置的限制之外。
  • 缓存的镜像必须具有与 Quay 存储库上镜像相同的属性。

15.3. 使用 Red Hat Quay 代理远程 registry

以下流程描述了如何使用 Red Hat Quay 代理远程 registry。此流程设置为代理 quay.io,用户可使用 podman 从 quay.io 上的任何命名空间拉取任何公共镜像。

前提条件

  • config.yaml 中的 FEATURE_PROXY_CACHE 设置为 true
  • 分配 Member 团队角色。如需有关团队角色的更多信息,请参阅 Red Hat Quay 中的用户和组织

流程

  1. 在 UI 上的 Quay 机构中,例如 cache-quayio,单击左侧窗格的 Organization Settings
  2. 可选:点 Add Storage Quota 为您的机构配置配额管理。有关配额管理的更多信息,请参阅配额管理

    注意

    在某些情况下,使用 Podman 拉取镜像可能会在 pull: 无法访问配额限制时返回以下错误: unable to pull image: Error parsing image configuration: Error fetching blob: invalid status code from registry 403 (Forbidden)。错误 403 isaccurate 发生,因为 Podman 会在 命名空间 上隐藏正确的 API 错误:Quota has been exceeded。这个问题会在以后的 Podman 更新中解决。

  3. Remote Registry 中,输入要缓存的远程 registry 的名称,如 quay.io,然后单击 Save

    注意

    通过将命名空间添加到 远程 Registry 中(如 quay.io/<namespace >),您的机构中的用户只能从该命名空间中代理。

  4. 可选:添加 Remote Registry UsernameRemote Registry Password

    注意

    如果您没有设置 Remote Registry UsernameRemote Registry Password,则无法添加它而无需删除代理缓存并创建新的 registry。

  5. 可选:在 到期 字段中设置一个时间。

    注意
    • 代理组织中缓存镜像的默认标签 Expiration 字段被设置为 86400 秒。在代理机构中,每次拉取标签时,标签过期会被刷新到 UI 的 Expiration 字段中设置的值。此功能与 Quay 的默认 单个标签过期 功能不同。在代理机构中,可以覆盖单个标签功能。发生这种情况时,会根据代理机构的 过期 字段重置单个标签的过期时间。
    • 已过期的镜像会在分配的时间后消失,但仍存储在 Quay 中。镜像被完全删除或收集的时间取决于您组织的 Time Machine 设置。垃圾回收的默认时间为 14 天,除非另有指定。
  6. Save
  7. 在 CLI 中,从 registry 中拉取公共镜像,如 quay.io,作为代理缓存:

    $ podman pull <registry_url>/<organization_name>/<quayio_namespace>/<image_name>
    Copy to Clipboard Toggle word wrap
    重要

    如果您的组织已设置为从远程 registry 中的单个命名空间拉取,则需要从 URL 中省略远程 registry 命名空间。例如: podman pull <registry_url>/<organization_name>/<image_name>

15.3.1. 在代理机构中利用存储配额限制

在 Red Hat Quay 3.8 中,代理缓存功能已增强了为带标签镜像的自动运行功能。只有在代理的命名空间配置了配额限制时,才会自动检查镜像标签。目前,如果镜像大小大于某个机构的配额,则会从上传中跳过镜像,直到管理员创建必要的空间。现在,当镜像超过分配的空间时,自动检查增强标记了最早使用的标签删除。因此,新镜像标签会存储,而使用最少的镜像标签被标记为删除。

重要
  • 作为 auto-pruning 功能的一部分,标记为删除的标签最终由垃圾收集器(gc) worker 进程垃圾回收。因此,在此期间不会完全强制配额大小限制。
  • 目前,计算命名空间配额大小不会考虑清单子的大小。这是一个已知问题,将在以后的 Red Hat Quay 版本中解决。
15.3.1.1. 在代理机构中测试存储配额限制功能

使用以下步骤测试启用了代理缓存和存储配额限制的组织的自动运行功能。

前提条件

  • 您的机构配置为充当代理机构。以下示例来自 quay.io 的代理:
  • config.yaml 文件中将 FEATURE_PROXY_CACHE 设置为 true
  • config.yaml 文件中,FEATURE _QUOTA_MANAGEMENT 被设置为 true
  • 您的组织配置了配额限制,如 150 MB

流程

  1. 将镜像从代理机构拉取(pull),例如:

    $ podman pull quay-server.example.com/proxytest/projectquay/quay:3.7.9
    Copy to Clipboard Toggle word wrap
  2. 根据存储库中的空间,您可能需要从代理机构中拉取其他镜像,例如:

    $ podman pull quay-server.example.com/proxytest/projectquay/quay:3.6.2
    Copy to Clipboard Toggle word wrap
  3. 在 Red Hat Quay registry UI 中,点您的存储库的名称。

    • 点导航窗格中的标签,并确保 quay:3.7.9quay:3.6.2 已标记。
  4. 拉取将导致您的仓库超过分配的配额的最后一个镜像,例如:

    $ podman pull quay-server.example.com/proxytest/projectquay/quay:3.5.1
    Copy to Clipboard Toggle word wrap
  5. 刷新 Red Hat Quay registry 的 Tags 页面。您推送的第一个镜像(如 quay:3.7.9 )应该可以自动使用。Tags 页面现在应当显示 quay:3.6.2quay:3.5.1

第 16 章 Red Hat Quay 构建功能增强

在 Red Hat Quay 3.7 之前,Quay 在由 pod 启动的虚拟机中运行 podman 命令。在虚拟平台上运行时,需要启用嵌套虚拟化,它们不适用于 Red Hat Enterprise Linux 或 OpenShift Container Platform。因此,构建必须在裸机集群中运行,这是效率低下的资源使用。

在 Red Hat Quay 3.7 中,通过添加额外的构建选项(不包含虚拟机层)来删除运行构建所需的裸机约束。因此,构建可以在虚拟化平台上运行。也可使用后向兼容性来运行以前的构建配置。

16.1. Red Hat Quay 增强的构建架构

前面的镜像显示了增强的构建功能的预期设计流和架构:

Enhanced Quay builds architecture

在这个版本中,构建管理器首先会创建作业对象。然后,作业对象 使用 quay-builder-image 创建容器集。quay-builder-image 将包含 quay-builder 二进制文件Podman 服务。创建的 pod 作为 非特权 来运行。然后,quay-builder 二进制文件 在通信状态并从 Build Manager 检索构建信息时构建镜像。

16.2. Red Hat Quay 构建限制

在非特权上下文中在 Red Hat Quay 中运行构建可能会导致一些在上一构建策略下运行的命令失败。尝试更改构建策略可能会导致与构建相关的性能问题和可靠性。

直接在容器内运行构建与使用虚拟机没有相同的隔离。更改构建环境也可能导致之前工作的构建失败。

本节中的步骤解释了如何使用 OpenShift Container Platform 创建 Red Hat Quay 虚拟构建程序环境。

16.3.1. OpenShift Container Platform TLS 组件

tls 组件允许您控制 TLS 配置。

注意

当 TLS 组件由 Operator 管理时,Red Hat Quay 3.8 不支持构建程序。

如果将 tls 设置为 非受管,则提供自己的 ssl.certssl.key 文件。在本实例中,如果您希望集群支持构建器,您必须将 Quay 路由和构建器路由名称添加到证书中的 SAN 列表中,或者使用通配符。

要添加构建器路由,请使用以下格式:

[quayregistry-cr-name]-quay-builder-[ocp-namespace].[ocp-domain-name]:443
Copy to Clipboard Toggle word wrap

构建器需要 SSL/TLS 证书。有关 SSL/TLS 证书的更多信息,请参阅 将 TLS 证书添加到 Red Hat Quay 容器

如果使用 Amazon Web Service (AWS) S3 存储,您必须在 AWS 控制台中修改存储桶,然后才能运行构建程序。如需所需参数,请参见以下部分中"修改 AWS S3 存储桶"。

使用以下步骤为 Red Hat Quay 虚拟构建器准备 OpenShift Container Platform。

注意
  • 此流程假设您已置备集群并运行 Quay Operator。
  • 此流程是在 OpenShift Container Platform 中设置虚拟命名空间。

流程

  1. 使用集群管理员帐户登录 Red Hat Quay 集群。
  2. 运行以下命令,创建一个运行虚拟构建器(如 virtual-builders )的新项目:

    $ oc new-project virtual-builders
    Copy to Clipboard Toggle word wrap
  3. 输入以下命令在项目中创建一个 ServiceAccount

    $ oc create sa -n virtual-builders quay-builder
    Copy to Clipboard Toggle word wrap
  4. 为创建的服务帐户提供编辑权限,以便它能够运行构建:

    $ oc adm policy -n virtual-builders add-role-to-user edit system:serviceaccount:virtual-builders:quay-builder
    Copy to Clipboard Toggle word wrap
  5. 输入以下命令授予 Quay builder anyuid scc 权限:

    $ oc adm policy -n virtual-builders add-scc-to-user anyuid -z quay-builder
    Copy to Clipboard Toggle word wrap
    注意

    此操作需要集群管理员特权。这是必要的,因为构建器必须以 Podman 用户身份运行,才能进行无特权构建或无根构建工作。

  6. 获取 Quay builder 服务帐户的令牌。

    1. 如果使用 OpenShift Container Platform 4.10 或更早的版本,请输入以下命令:

      oc sa get-token -n virtual-builders quay-builder
      Copy to Clipboard Toggle word wrap
    2. 如果使用 OpenShift Container Platform 4.11 或更高版本,请输入以下命令:

      $ oc create token quay-builder -n virtual-builders
      Copy to Clipboard Toggle word wrap

      输出示例

      eyJhbGciOiJSUzI1NiIsImtpZCI6IldfQUJkaDVmb3ltTHZ0dGZMYjhIWnYxZTQzN2dJVEJxcDJscldSdEUtYWsifQ...
      Copy to Clipboard Toggle word wrap

  7. 输入以下命令确定构建程序路由:

    $ oc get route -n quay-enterprise
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                                  HOST/PORT                                                                    PATH   SERVICES                              PORT   TERMINATION     WILDCARD
    ...
    example-registry-quay-builder         example-registry-quay-builder-quay-enterprise.apps.docs.quayteam.org                example-registry-quay-app             grpc   edge/Redirect   None
    ...
    Copy to Clipboard Toggle word wrap

  8. 输入以下命令使用 .crt 扩展生成自签名 SSL/TlS 证书:

    $ oc extract cm/kube-root-ca.crt -n openshift-apiserver
    Copy to Clipboard Toggle word wrap

    输出示例

    ca.crt
    Copy to Clipboard Toggle word wrap

  9. 输入以下命令将 ca.crt 文件重命名为 extra_ca_cert_build_cluster.crt

    $ mv ca.crt extra_ca_cert_build_cluster.crt
    Copy to Clipboard Toggle word wrap
  10. 控制台中找到配置捆绑包的 secret,然后选择 ActionsEdit Secret 并添加适当的构建程序配置:

    FEATURE_USER_INITIALIZE: true
    BROWSER_API_CALLS_XHR_ONLY: false
    SUPER_USERS:
    - <superusername>
    FEATURE_USER_CREATION: false
    FEATURE_QUOTA_MANAGEMENT: true
    FEATURE_BUILD_SUPPORT: True
    BUILDMAN_HOSTNAME: <sample_build_route> 
    1
    
    BUILD_MANAGER:
      - ephemeral
      - ALLOWED_WORKER_COUNT: 1
        ORCHESTRATOR_PREFIX: buildman/production/
        JOB_REGISTRATION_TIMEOUT: 3600 
    2
    
        ORCHESTRATOR:
          REDIS_HOST: <sample_redis_hostname> 
    3
    
          REDIS_PASSWORD: ""
          REDIS_SSL: false
          REDIS_SKIP_KEYSPACE_EVENT_SETUP: false
        EXECUTORS:
          - EXECUTOR: kubernetesPodman
            NAME: openshift
            BUILDER_NAMESPACE: <sample_builder_namespace> 
    4
    
            SETUP_TIME: 180
            MINIMUM_RETRY_THRESHOLD: 0
            BUILDER_CONTAINER_IMAGE: <sample_builder_container_image> 
    5
    
            # Kubernetes resource options
            K8S_API_SERVER: <sample_k8s_api_server> 
    6
    
            K8S_API_TLS_CA: <sample_crt_file> 
    7
    
            VOLUME_SIZE: 8G
            KUBERNETES_DISTRIBUTION: openshift
            CONTAINER_MEMORY_LIMITS: 300m 
    8
    
            CONTAINER_CPU_LIMITS: 1G 
    9
    
            CONTAINER_MEMORY_REQUEST: 300m 
    10
    
            CONTAINER_CPU_REQUEST: 1G 
    11
    
            NODE_SELECTOR_LABEL_KEY: ""
            NODE_SELECTOR_LABEL_VALUE: ""
            SERVICE_ACCOUNT_NAME: <sample_service_account_name>
            SERVICE_ACCOUNT_TOKEN: <sample_account_token> 
    12
    Copy to Clipboard Toggle word wrap
    1
    构建路由通过运行 oc get route -n 使用 OpenShift Operator 的命名空间的名称来获取。路由末尾必须提供端口,它应使用以下格式:[ quayregistry-cr-name]-quay-builder-[ocp-namespace].[ocp-domain-name]:443
    2
    如果 JOB_REGISTRATION_TIMEOUT 参数设置得太低,您可能会收到以下错误: 无法将 作业注册到构建管理器:rpc error: code = Unauthenticated desc = Invalid build token: Signature has expired.建议将此参数至少设置为 240。
    3
    如果您的 Redis 主机有密码或 SSL/TLS 证书,您必须相应地更新。
    4
    设置为与虚拟构建器命名空间的名称匹配,如 virtual-builders
    5
    对于早期访问,BUILDER_CONTAINER_IMAGE 目前 quay.io/projectquay/quay-builder:3.7.0-rc.2。请注意,在早期访问窗口中可能会有所变化。如果出现这种情况,则会提示客户。
    6
    K8S_API_SERVER 通过运行 oc cluster-info 获取。
    7
    您必须手动创建并添加自定义 CA 证书,如 K8S_API_TLS_CA: /conf/stack/extra_ca_certs/build_cluster.crt
    8
    如果未指定,则默认为 5120Mi
    9
    对于虚拟构建,您必须确保集群中有足够的资源。如果未指定,则默认为 1000m
    10
    如果未指定,则默认为 3968Mi
    11
    如果未指定,则默认为 500m
    12
    在运行 oc create sa 时获取。

    配置示例

    FEATURE_USER_INITIALIZE: true
    BROWSER_API_CALLS_XHR_ONLY: false
    SUPER_USERS:
    - quayadmin
    FEATURE_USER_CREATION: false
    FEATURE_QUOTA_MANAGEMENT: true
    FEATURE_BUILD_SUPPORT: True
    BUILDMAN_HOSTNAME: example-registry-quay-builder-quay-enterprise.apps.docs.quayteam.org:443
    BUILD_MANAGER:
      - ephemeral
      - ALLOWED_WORKER_COUNT: 1
        ORCHESTRATOR_PREFIX: buildman/production/
        JOB_REGISTRATION_TIMEOUT: 3600
        ORCHESTRATOR:
          REDIS_HOST: example-registry-quay-redis
          REDIS_PASSWORD: ""
          REDIS_SSL: false
          REDIS_SKIP_KEYSPACE_EVENT_SETUP: false
        EXECUTORS:
          - EXECUTOR: kubernetesPodman
            NAME: openshift
            BUILDER_NAMESPACE: virtual-builders
            SETUP_TIME: 180
            MINIMUM_RETRY_THRESHOLD: 0
            BUILDER_CONTAINER_IMAGE: quay.io/projectquay/quay-builder:3.7.0-rc.2
            # Kubernetes resource options
            K8S_API_SERVER: api.docs.quayteam.org:6443
            K8S_API_TLS_CA: /conf/stack/extra_ca_certs/build_cluster.crt
            VOLUME_SIZE: 8G
            KUBERNETES_DISTRIBUTION: openshift
            CONTAINER_MEMORY_LIMITS: 1G
            CONTAINER_CPU_LIMITS: 1080m
            CONTAINER_MEMORY_REQUEST: 1G
            CONTAINER_CPU_REQUEST: 580m
            NODE_SELECTOR_LABEL_KEY: ""
            NODE_SELECTOR_LABEL_VALUE: ""
            SERVICE_ACCOUNT_NAME: quay-builder
            SERVICE_ACCOUNT_TOKEN: "eyJhbGciOiJSUzI1NiIsImtpZCI6IldfQUJkaDVmb3ltTHZ0dGZMYjhIWnYxZTQzN2dJVEJxcDJscldSdEUtYWsifQ"
    Copy to Clipboard Toggle word wrap

16.3.2.2. 手动添加 SSL/TLS 证书

由于配置工具的已知问题,您必须手动添加自定义 SSL/TLS 证书才能正确运行构建器。使用以下步骤手动添加自定义 SSL/TLS 证书。

有关创建 SSL/TLS 证书的更多信息,请参阅 将 TLS 证书添加到 Red Hat Quay 容器

16.3.2.2.1. 创建和签名证书

使用以下步骤创建并签署 SSL/TLS 证书。

流程

  • 创建证书颁发机构并签署证书。如需更多信息 ,请参阅创建证书颁发机构并签署证书

    openssl.cnf

    [req]
    req_extensions = v3_req
    distinguished_name = req_distinguished_name
    [req_distinguished_name]
    [ v3_req ]
    basicConstraints = CA:FALSE
    keyUsage = nonRepudiation, digitalSignature, keyEncipherment
    subjectAltName = @alt_names
    [alt_names]
    DNS.1 = example-registry-quay-quay-enterprise.apps.docs.quayteam.org 
    1
    
    DNS.2 = example-registry-quay-builder-quay-enterprise.apps.docs.quayteam.org 
    2
    Copy to Clipboard Toggle word wrap

    1
    必须包含 Red Hat Quay registry 的 URL 的 alt_name
    2
    BUILDMAN_HOSTNAMEalt_name

    示例命令

    $ openssl genrsa -out rootCA.key 2048
    $ openssl req -x509 -new -nodes -key rootCA.key -sha256 -days 1024 -out rootCA.pem
    $ openssl genrsa -out ssl.key 2048
    $ openssl req -new -key ssl.key -out ssl.csr
    $ openssl x509 -req -in ssl.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out ssl.cert -days 356 -extensions v3_req -extfile openssl.cnf
    Copy to Clipboard Toggle word wrap

16.3.2.2.2. 将 TLS 设置为非受管

使用以下步骤将 king:tls 设置为 unmanaged。

流程

  1. 在 Red Hat Quay Registry YAML 中,将 kind: tls 设置为 managed: false

      - kind: tls
        managed: false
    Copy to Clipboard Toggle word wrap
  2. Events 页面中,更改会被阻止,直到您设置适当的 config.yaml 文件。例如:

        - lastTransitionTime: '2022-03-28T12:56:49Z'
          lastUpdateTime: '2022-03-28T12:56:49Z'
          message: >-
            required component `tls` marked as unmanaged, but `configBundleSecret`
            is missing necessary fields
          reason: ConfigInvalid
          status: 'True'
    Copy to Clipboard Toggle word wrap
16.3.2.2.3. 创建临时 secret

使用以下步骤为 CA 证书创建临时 secret。

流程

  1. 在默认命名空间中创建一个 secret,用于 CA 证书:

    $ oc create secret generic -n quay-enterprise temp-crt --from-file extra_ca_cert_build_cluster.crt
    Copy to Clipboard Toggle word wrap
  2. 在默认命名空间中为 ssl.keyssl.cert 文件创建一个 secret:

    $ oc create secret generic -n quay-enterprise quay-config-ssl --from-file ssl.cert --from-file ssl.key
    Copy to Clipboard Toggle word wrap
16.3.2.2.4. 将 secret 数据复制到配置 YAML 中

使用以下步骤将 secret 数据复制到 config.yaml 文件中。

流程

  1. 在控制台 UI 中的 WorkloadsSecrets 中找到新 secret。
  2. 对于每个 secret,找到 YAML 视图:

    kind: Secret
    apiVersion: v1
    metadata:
      name: temp-crt
      namespace: quay-enterprise
      uid: a4818adb-8e21-443a-a8db-f334ace9f6d0
      resourceVersion: '9087855'
      creationTimestamp: '2022-03-28T13:05:30Z'
    ...
    data:
      extra_ca_cert_build_cluster.crt: >-
        LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURNakNDQWhxZ0F3SUJBZ0l....
    type: Opaque
    Copy to Clipboard Toggle word wrap
    kind: Secret
    apiVersion: v1
    metadata:
      name: quay-config-ssl
      namespace: quay-enterprise
      uid: 4f5ae352-17d8-4e2d-89a2-143a3280783c
      resourceVersion: '9090567'
      creationTimestamp: '2022-03-28T13:10:34Z'
    ...
    data:
      ssl.cert: >-
        LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVaakNDQTA2Z0F3SUJBZ0lVT...
      ssl.key: >-
        LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBc...
    type: Opaque
    Copy to Clipboard Toggle word wrap
  3. 在 UI 中找到 Red Hat Quay registry 配置捆绑包的 secret,或运行以下命令来通过命令行,如下所示:

    $ oc get quayregistries.quay.redhat.com -o jsonpath="{.items[0].spec.configBundleSecret}{'\n'}"  -n quay-enterprise
    Copy to Clipboard Toggle word wrap
  4. 在 OpenShift Container Platform 控制台中,为配置捆绑包 secret 选择 YAML 选项卡,并从您创建的两个 secret 中添加数据:

    kind: Secret
    apiVersion: v1
    metadata:
      name: init-config-bundle-secret
      namespace: quay-enterprise
      uid: 4724aca5-bff0-406a-9162-ccb1972a27c1
      resourceVersion: '4383160'
      creationTimestamp: '2022-03-22T12:35:59Z'
    ...
    data:
      config.yaml: >-
        RkVBVFVSRV9VU0VSX0lOSVRJQUxJWkU6IHRydWUKQlJ...
      extra_ca_cert_build_cluster.crt: >-
        LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURNakNDQWhxZ0F3SUJBZ0ldw....
      ssl.cert: >-
        LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUVaakNDQTA2Z0F3SUJBZ0lVT...
      ssl.key: >-
        LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBc...
    type: Opaque
    Copy to Clipboard Toggle word wrap
  5. Save
  6. 输入以下命令查看您的 pod 是否重启:

    $ oc get pods -n quay-enterprise
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                                                   READY   STATUS              RESTARTS   AGE
    ...
    example-registry-quay-app-6786987b99-vgg2v             0/1     ContainerCreating   0          2s
    example-registry-quay-app-7975d4889f-q7tvl             1/1     Running             0          5d21h
    example-registry-quay-app-7975d4889f-zn8bb             1/1     Running             0          5d21h
    example-registry-quay-app-upgrade-lswsn                0/1     Completed           0          6d1h
    example-registry-quay-config-editor-77847fc4f5-nsbbv   0/1     ContainerCreating   0          2s
    example-registry-quay-config-editor-c6c4d9ccd-2mwg2    1/1     Running             0          5d21h
    example-registry-quay-database-66969cd859-n2ssm        1/1     Running             0          6d1h
    example-registry-quay-mirror-764d7b68d9-jmlkk          1/1     Terminating         0          5d21h
    example-registry-quay-mirror-764d7b68d9-jqzwg          1/1     Terminating         0          5d21h
    example-registry-quay-redis-7cc5f6c977-956g8           1/1     Running             0          5d21h
    Copy to Clipboard Toggle word wrap

  7. 重新配置 Red Hat Quay registry 后,输入以下命令来检查 Red Hat Quay 应用程序 pod 是否在运行:

    $ oc get pods -n quay-enterprise
    Copy to Clipboard Toggle word wrap

    输出示例

    example-registry-quay-app-6786987b99-sz6kb             1/1     Running            0          7m45s
    example-registry-quay-app-6786987b99-vgg2v             1/1     Running            0          9m1s
    example-registry-quay-app-upgrade-lswsn                0/1     Completed          0          6d1h
    example-registry-quay-config-editor-77847fc4f5-nsbbv   1/1     Running            0          9m1s
    example-registry-quay-database-66969cd859-n2ssm        1/1     Running            0          6d1h
    example-registry-quay-mirror-758fc68ff7-5wxlp          1/1     Running            0          8m29s
    example-registry-quay-mirror-758fc68ff7-lbl82          1/1     Running            0          8m29s
    example-registry-quay-redis-7cc5f6c977-956g8           1/1     Running            0          5d21h
    Copy to Clipboard Toggle word wrap

  8. 在您的浏览器中,访问 registry 端点并验证证书是否已更新。例如:

    Common Name (CN)	example-registry-quay-quay-enterprise.apps.docs.quayteam.org
    Organisation (O)	DOCS
    Organisational Unit (OU)	QUAY
    Copy to Clipboard Toggle word wrap
16.3.2.3. 使用 UI 创建构建触发器

使用以下步骤使用 UI 创建构建触发器。

流程

  1. 登录您的 Red Hat Quay 存储库。
  2. 单击 Create New Repository 并创建一个新 registry,如 testrepo
  3. Repositories 页面上,单击导航窗格中的 Builds 选项卡。或者,直接使用对应的 URL:

    https://example-registry-quay-quay-enterprise.apps.docs.quayteam.org/repository/quayadmin/testrepo?tab=builds
    Copy to Clipboard Toggle word wrap
    重要

    在某些情况下,构建器可能会在解决主机名时遇到问题。此问题可能与在作业对象上设置为 defaultdnsPolicy 相关。目前,这个问题还没有临时解决方案。它将在以后的 Red Hat Quay 版本中解决。

  4. Create Build TriggerCustom Git Repository Push
  5. 输入用于克隆 Git 存储库的 HTTPS 或 SSH 风格 URL,然后点 Continue。例如:

    https://github.com/gabriel-rh/actions_test.git
    Copy to Clipboard Toggle word wrap
  6. 检查带有分支或标签名称的 Tag 清单,然后单击 Continue
  7. 在调用触发器时输入要构建的 Dockerfile 位置,如 /Dockerfile,再单击 Continue
  8. 输入 Docker 构建的上下文位置,如 /,然后单击 Continue
  9. 如果保证,请创建一个 Robot 帐户。否则,点 Continue
  10. Continue 来验证参数。
  11. Builds 页面中,点 Trigger Name 的 Options 图标,然后点 Run Trigger Now
  12. 从 Git 存储库输入提交 SHA,然后单击 Start Build
  13. 您可以点击 Build History 页面中的提交,或运行 oc get pods -n virtual-builders 来检查构建的状态。例如:

    $ oc get pods -n virtual-builders
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                                               READY   STATUS    RESTARTS   AGE
    f192fe4a-c802-4275-bcce-d2031e635126-9l2b5-25lg2   1/1     Running   0          7s
    Copy to Clipboard Toggle word wrap

    $ oc get pods -n virtual-builders
    Copy to Clipboard Toggle word wrap

    输出示例

    NAME                                               READY   STATUS        RESTARTS   AGE
    f192fe4a-c802-4275-bcce-d2031e635126-9l2b5-25lg2   1/1     Terminating   0          9s
    Copy to Clipboard Toggle word wrap

    $ oc get pods -n virtual-builders
    Copy to Clipboard Toggle word wrap

    输出示例

    No resources found in virtual-builders namespace.
    Copy to Clipboard Toggle word wrap

  14. 构建完成后,您可以检查导航窗格中 Tags 下的标签状态。

    注意

    通过早期访问,构建的完整构建日志和时间戳当前不可用。

16.3.2.4. 修改 AWS S3 存储桶

如果使用 AWS S3 存储,在运行构建程序前,您必须在 AWS 控制台中更改存储桶。

流程

  1. s3.console.aws.com 登录到 AWS 控制台。
  2. 在搜索栏中,搜索 S3,然后单击 S3
  3. 点击存储桶的名称,如 myawsbucket
  4. 单击权限选项卡。
  5. Cross-origin 资源共享(CORS) 下,包含以下参数:

      [
          {
              "AllowedHeaders": [
                  "Authorization"
              ],
              "AllowedMethods": [
                  "GET"
              ],
              "AllowedOrigins": [
                  "*"
              ],
              "ExposeHeaders": [],
              "MaxAgeSeconds": 3000
          },
          {
              "AllowedHeaders": [
                  "Content-Type",
                  "x-amz-acl",
                  "origin"
              ],
              "AllowedMethods": [
                  "PUT"
              ],
              "AllowedOrigins": [
                  "*"
              ],
              "ExposeHeaders": [],
              "MaxAgeSeconds": 3000
          }
      ]
    Copy to Clipboard Toggle word wrap
16.3.2.5. 修改 Google Cloud Platform 对象存储桶

使用以下步骤为虚拟构建器配置跨原始资源共享(CORS)。

注意

如果没有 CORS 配置,上传构建 Dockerfile 会失败。

流程

  1. 使用以下引用来创建 JSON 文件,以满足您的特定 CORS 需求。例如:

    $ cat gcp_cors.json
    Copy to Clipboard Toggle word wrap

    输出示例

    [
        {
          "origin": ["*"],
          "method": ["GET"],
          "responseHeader": ["Authorization"],
          "maxAgeSeconds": 3600
        },
        {
          "origin": ["*"],
          "method": ["PUT"],
          "responseHeader": [
                  "Content-Type",
                  "x-goog-acl",
                  "origin"],
          "maxAgeSeconds": 3600
        }
    ]
    Copy to Clipboard Toggle word wrap

  2. 输入以下命令更新 GCP 存储桶:

    $ gcloud storage buckets update gs://<bucket_name> --cors-file=./gcp_cors.json
    Copy to Clipboard Toggle word wrap

    输出示例

    Updating
      Completed 1
    Copy to Clipboard Toggle word wrap

  3. 您可以运行以下命令来显示 GCP 存储桶的更新 CORS 配置:

    $ gcloud storage buckets describe gs://<bucket_name>  --format="default(cors)"
    Copy to Clipboard Toggle word wrap

    输出示例

    cors:
    - maxAgeSeconds: 3600
      method:
      - GET
      origin:
      - '*'
      responseHeader:
      - Authorization
    - maxAgeSeconds: 3600
      method:
      - PUT
      origin:
      - '*'
      responseHeader:
      - Content-Type
      - x-goog-acl
      - origin
    Copy to Clipboard Toggle word wrap

第 17 章 使用 Red Hat Quay API

Red Hat Quay 提供了完整的 OAuth 2 RESTful API,它:

  • 可通过 URL https://<yourquayhost>/api/v1的每个 Red Hat Quay 实例端点提供
  • 您可以通过浏览器连接到端点,通过启用 Swagger UI 来获取、删除、发布并放置 Red Hat Quay 设置
  • 可以通过发出 API 调用的应用访问并使用 OAuth 令牌
  • 以 JSON 格式发送和接收数据

以下文本描述了如何访问 Red Hat Quay API,并使用它来查看和修改 Red Hat Quay 集群中的设置。下一节将列出并描述 API 端点。

17.1. 从 Quay.io 访问 Quay API

如果您还没有运行自己的 Red Hat Quay 集群,您可以从 Web 浏览器浏览 Quay.io 中的 Red Hat Quay API:

https://docs.quay.io/api/swagger/
Copy to Clipboard Toggle word wrap

出现的 API Explorer 显示 Quay.io API 端点。您不会看到 Quay.io 上未启用的 Red Hat Quay 功能的超级用户 API 端点或端点(如存储库镜像)。

在 API Explorer 中,您可以获得并有时变化,以及以下信息:

  • 账单、订阅和计划
  • 仓库构建和构建触发器
  • 错误消息和全局消息
  • 仓库镜像、清单、权限、通知、漏洞和镜像签名
  • 使用日志
  • 机构、成员和 OAuth 应用程序
  • 用户和机器人帐户
  • 和更多…​

选择打开端点,以查看端点的每个部分的 Model Schema。打开端点,输入任何所需的参数(如存储库名称或镜像),然后选择 Try it out! 按钮以查询或更改与 Quay.io 端点关联的设置。

17.2. 创建 OAuth 访问令牌

要创建 OAuth 访问令牌,以便您可以访问机构的 API:

  1. 登录到 Red Hat Quay 并选择您的机构(或创建新 Quay)。
  2. 点击左侧导航栏中的 Applications 图标。
  3. 选择 Create New Application,并在系统提示时为新应用程序指定一个名称。
  4. 选择新应用。
  5. 从左侧导航中选择 Generate Token。
  6. 选择设置令牌范围的复选框,然后选择 Generate Access Token。
  7. 查看允许的权限,然后选择 Authorize Application 批准它。
  8. 复制新生成的令牌,以用于访问 API。

17.3. 从 Web 浏览器访问 Quay API

通过启用 Swagger,您可以通过 Web 浏览器访问您自己的 Red Hat Quay 实例的 API。这个 URL 通过 Swagger UI 和这个 URL 来公开 Red Hat Quay API explorer:

https://<yourquayhost>/api/v1/discovery.
Copy to Clipboard Toggle word wrap

访问 API 的方式不包括 Red Hat Quay 安装中提供的超级用户端点。以下是通过运行 swagger-ui 容器镜像访问本地系统中运行的 Red Hat Quay API 接口的示例:

# export SERVER_HOSTNAME=<yourhostname>
# sudo podman run -p 8888:8080 -e API_URL=https://$SERVER_HOSTNAME:8443/api/v1/discovery docker.io/swaggerapi/swagger-ui
Copy to Clipboard Toggle word wrap

在运行 swagger-ui 容器的情况下,打开您的 Web 浏览器到 localhost 端口 8888,以通过 swagger-ui 容器查看 API 端点。

如果从浏览器调用,为了避免日志中的错误,如 "API 调用,必须使用 X-Requested-With 标头来调用

BROWSER_API_CALLS_XHR_ONLY: false
Copy to Clipboard Toggle word wrap

17.4. 从命令行访问 Red Hat Quay API

您可以使用 curl 命令通过 Red Hat Quay 集群的 API 获取 GET、PUT、POST 或 DELETE 设置。将 <token > 替换为之前创建的 OAuth 访问令牌,以便在以下示例中获取或更改设置。

17.4.1. 获取超级用户信息

$ curl -X GET -H "Authorization: Bearer <token_here>" \
    "https://<yourquayhost>/api/v1/superuser/users/"
Copy to Clipboard Toggle word wrap

例如:

$ curl -X GET -H "Authorization: Bearer mFCdgS7SAIoMcnTsHCGx23vcNsTgziAa4CmmHIsg" http://quay-server:8080/api/v1/superuser/users/ | jq

{
  "users": [
    {
      "kind": "user",
      "name": "quayadmin",
      "username": "quayadmin",
      "email": "quayadmin@example.com",
      "verified": true,
      "avatar": {
        "name": "quayadmin",
        "hash": "357a20e8c56e69d6f9734d23ef9517e8",
        "color": "#5254a3",
        "kind": "user"
      },
      "super_user": true,
      "enabled": true
    }
  ]
}
Copy to Clipboard Toggle word wrap

17.4.2. 使用 API 创建超级用户

  • 配置超级用户名称,如 Deploy Quay 书中所述:

    • 使用配置编辑器 UI 或
    • 直接编辑 config.yaml 文件,使用 配置 API 来验证(并下载)更新的配置捆绑包的选项
  • 为超级用户名称创建用户帐户:

    • 详细获取身份验证令牌,并使用 curl 创建用户:

      $ curl -H "Content-Type: application/json"  -H "Authorization: Bearer Fava2kV9C92p1eXnMawBZx9vTqVnksvwNm0ckFKZ" -X POST --data '{
       "username": "quaysuper",
       "email": "quaysuper@example.com"
      }'  http://quay-server:8080/api/v1/superuser/users/ | jq
      Copy to Clipboard Toggle word wrap
    • 返回的内容包括为新用户帐户生成的密码:

      {
        "username": "quaysuper",
        "email": "quaysuper@example.com",
        "password": "EH67NB3Y6PTBED8H0HC6UVHGGGA3ODSE",
        "encrypted_password": "fn37AZAUQH0PTsU+vlO9lS0QxPW9A/boXL4ovZjIFtlUPrBz9i4j9UDOqMjuxQ/0HTfy38goKEpG8zYXVeQh3lOFzuOjSvKic2Vq7xdtQsU="
      }
      Copy to Clipboard Toggle word wrap

现在,当您请求 用户列表时,它将以超级用户的形式显示 quaysuper

$ curl -X GET -H "Authorization: Bearer mFCdgS7SAIoMcnTsHCGx23vcNsTgziAa4CmmHIsg" http://quay-server:8080/api/v1/superuser/users/ | jq

{
  "users": [
  {
      "kind": "user",
      "name": "quayadmin",
      "username": "quayadmin",
      "email": "quayadmin@example.com",
      "verified": true,
      "avatar": {
        "name": "quayadmin",
        "hash": "357a20e8c56e69d6f9734d23ef9517e8",
        "color": "#5254a3",
        "kind": "user"
      },
      "super_user": true,
      "enabled": true
    },
    {
      "kind": "user",
      "name": "quaysuper",
      "username": "quaysuper",
      "email": "quaysuper@example.com",
      "verified": true,
      "avatar": {
        "name": "quaysuper",
        "hash": "c0e0f155afcef68e58a42243b153df08",
        "color": "#969696",
        "kind": "user"
      },
      "super_user": true,
      "enabled": true
    }
  ]
}
Copy to Clipboard Toggle word wrap

17.4.3. 列出用量日志

可以使用一个内部 API /api/v1/superuser/logs 来列出当前系统的使用日志。已分页结果,因此以下示例中创建了 20 多个仓库,以演示如何使用多个调用来访问整个结果集。

17.4.3.1. 分页示例

第一次调用

$ curl -X GET -k -H "Authorization: Bearer qz9NZ2Np1f55CSZ3RVOvxjeUdkzYuCp0pKggABCD" https://example-registry-quay-quay-enterprise.apps.example.com/api/v1/superuser/logs | jq
Copy to Clipboard Toggle word wrap

初始输出

{
  "start_time": "Sun, 12 Dec 2021 11:41:55 -0000",
  "end_time": "Tue, 14 Dec 2021 11:41:55 -0000",
  "logs": [
    {
      "kind": "create_repo",
      "metadata": {
        "repo": "t21",
        "namespace": "namespace1"
      },
      "ip": "10.131.0.13",
      "datetime": "Mon, 13 Dec 2021 11:41:16 -0000",
      "performer": {
        "kind": "user",
        "name": "user1",
        "is_robot": false,
        "avatar": {
          "name": "user1",
          "hash": "5d40b245471708144de9760f2f18113d75aa2488ec82e12435b9de34a6565f73",
          "color": "#ad494a",
          "kind": "user"
        }
      },
      "namespace": {
        "kind": "org",
        "name": "namespace1",
        "avatar": {
          "name": "namespace1",
          "hash": "6cf18b5c19217bfc6df0e7d788746ff7e8201a68cba333fca0437e42379b984f",
          "color": "#e377c2",
          "kind": "org"
        }
      }
    },
    {
      "kind": "create_repo",
      "metadata": {
        "repo": "t20",
        "namespace": "namespace1"
      },
      "ip": "10.131.0.13",
      "datetime": "Mon, 13 Dec 2021 11:41:05 -0000",
      "performer": {
        "kind": "user",
        "name": "user1",
        "is_robot": false,
        "avatar": {
          "name": "user1",
          "hash": "5d40b245471708144de9760f2f18113d75aa2488ec82e12435b9de34a6565f73",
          "color": "#ad494a",
          "kind": "user"
        }
      },
      "namespace": {
        "kind": "org",
        "name": "namespace1",
        "avatar": {
          "name": "namespace1",
          "hash": "6cf18b5c19217bfc6df0e7d788746ff7e8201a68cba333fca0437e42379b984f",
          "color": "#e377c2",
          "kind": "org"
        }
      }
    },
...

   {
      "kind": "create_repo",
      "metadata": {
        "repo": "t2",
        "namespace": "namespace1"
      },
      "ip": "10.131.0.13",
      "datetime": "Mon, 13 Dec 2021 11:25:17 -0000",
      "performer": {
        "kind": "user",
        "name": "user1",
        "is_robot": false,
        "avatar": {
          "name": "user1",
          "hash": "5d40b245471708144de9760f2f18113d75aa2488ec82e12435b9de34a6565f73",
          "color": "#ad494a",
          "kind": "user"
        }
      },
      "namespace": {
        "kind": "org",
        "name": "namespace1",
        "avatar": {
          "name": "namespace1",
          "hash": "6cf18b5c19217bfc6df0e7d788746ff7e8201a68cba333fca0437e42379b984f",
          "color": "#e377c2",
          "kind": "org"
        }
      }
    }
  ],
  "next_page": "gAAAAABhtzGDsH38x7pjWhD8MJq1_2FAgqUw2X9S2LoCLNPH65QJqB4XAU2qAxYb6QqtlcWj9eI6DUiMN_q3e3I0agCvB2VPQ8rY75WeaiUzM3rQlMc4i6ElR78t8oUxVfNp1RMPIRQYYZyXP9h6E8LZZhqTMs0S-SedaQJ3kVFtkxZqJwHVjgt23Ts2DonVoYwtKgI3bCC5"
}
Copy to Clipboard Toggle word wrap

第二个调用使用 next_page

$ curl -X GET -k -H "Authorization: Bearer qz9NZ2Np1f55CSZ3RVOvxjeUdkzYuCp0pKggABCD" https://example-registry-quay-quay-enterprise.apps.example.com/api/v1/superuser/logs?next_page=gAAAAABhtzGDsH38x7pjWhD8MJq1_2FAgqUw2X9S2LoCLNPH65QJqB4XAU2qAxYb6QqtlcWj9eI6DUiMN_q3e3I0agCvB2VPQ8rY75WeaiUzM3rQlMc4i6ElR78t8oUxVfNp1RMPIRQYYZyXP9h6E8LZZhqTMs0S-SedaQJ3kVFtkxZqJwHVjgt23Ts2DonVoYwtKgI3bCC5 | jq
Copy to Clipboard Toggle word wrap

第二个调用的输出

{
  "start_time": "Sun, 12 Dec 2021 11:42:46 -0000",
  "end_time": "Tue, 14 Dec 2021 11:42:46 -0000",
  "logs": [
    {
      "kind": "create_repo",
      "metadata": {
        "repo": "t1",
        "namespace": "namespace1"
      },
      "ip": "10.131.0.13",
      "datetime": "Mon, 13 Dec 2021 11:25:07 -0000",
      "performer": {
        "kind": "user",
        "name": "user1",
        "is_robot": false,
        "avatar": {
          "name": "user1",
          "hash": "5d40b245471708144de9760f2f18113d75aa2488ec82e12435b9de34a6565f73",
          "color": "#ad494a",
          "kind": "user"
        }
      },
      "namespace": {
        "kind": "org",
        "name": "namespace1",
        "avatar": {
          "name": "namespace1",
          "hash": "6cf18b5c19217bfc6df0e7d788746ff7e8201a68cba333fca0437e42379b984f",
          "color": "#e377c2",
          "kind": "org"
        }
      }
    },
    ...
  ]
}
Copy to Clipboard Toggle word wrap

17.4.4. 目录同步

要为机构 testadminorg 中的团队 newteam 启用目录同步,在 LDAP 中对应的组名称为 ldapgroup

$ curl -X POST -H "Authorization: Bearer 9rJYBR3v3pXcj5XqIA2XX6Thkwk4gld4TCYLLWDF" \
       -H "Content-type: application/json" \
       -d '{"group_dn": "cn=ldapgroup,ou=Users"}' \
       http://quay1-server:8080/api/v1/organization/testadminorg/team/newteam/syncing
Copy to Clipboard Toggle word wrap

为同一团队禁用同步:

$ curl -X DELETE -H "Authorization: Bearer 9rJYBR3v3pXcj5XqIA2XX6Thkwk4gld4TCYLLWDF" \
       http://quay1-server:8080/api/v1/organization/testadminorg/team/newteam/syncing
Copy to Clipboard Toggle word wrap

17.4.5. 通过 API 创建存储库构建

要从指定的输入构建存储库并使用自定义标签标记构建,用户可以使用 requestRepoBuild 端点。它采用以下数据:

{
"docker_tags": [
   "string"
],
"pull_robot": "string",
"subdirectory": "string",
"archive_url": "string"
}
Copy to Clipboard Toggle word wrap

archive_url 参数应指向 tarzip 存档,其中包含构建的 Dockerfile 和其他必要文件。file_id 参数除了我们旧的构建系统之外。无法再使用。如果 Dockerfile 位于子目录中,也需要指定它。

归档应可以通过公开访问。OAuth 应用应具有"Administer Organization"范围,因为只有机构管理员可以访问机器人的帐户令牌。否则,某人只需向机器人(无访问权限本身)授予构建访问权限即可获得机器人的权限,并使用它来获取镜像内容。如果出现错误,请检查返回 json 块,并确保正确传递存档位置、pull 机器和其他参数。单击各个构建页面右上角的"下载日志",以检查日志以查看更详细的信息。

17.4.6. 创建机构机器

$ curl -X PUT https://quay.io/api/v1/organization/{orgname}/robots/{robot shortname} \
   -H 'Authorization: Bearer <token>''
Copy to Clipboard Toggle word wrap

17.4.7. 触发构建

$ curl -X POST https://quay.io/api/v1/repository/YOURORGNAME/YOURREPONAME/build/ \
   -H 'Authorization: Bearer <token>'
Copy to Clipboard Toggle word wrap

带有请求的 Python

import requests
r = requests.post('https://quay.io/api/v1/repository/example/example/image', headers={'content-type': 'application/json', 'Authorization': 'Bearer <redacted>'}, data={[<request-body-contents>})
print(r.text)
Copy to Clipboard Toggle word wrap

17.4.8. 创建私有存储库

$ curl -X POST https://quay.io/api/v1/repository \
    -H 'Authorization: Bearer {token}' \
    -H 'Content-Type: application/json' \
    -d '{"namespace":"yournamespace", "repository":"yourreponame",
    "description":"descriptionofyourrepo", "visibility": "private"}' | jq
Copy to Clipboard Toggle word wrap

17.4.9. 创建已镜像的存储库

最小配置

curl -X POST
  -H "Authorization: Bearer ${bearer_token}"
  -H "Content-Type: application/json"
  --data '{"external_reference": "quay.io/minio/mc", "external_registry_username": "", "sync_interval": 600, "sync_start_date": "2021-08-06T11:11:39Z", "root_rule": {"rule_kind": "tag_glob_csv", "rule_value": [ "latest" ]}, "robot_username": "orga+robot"}' https://${quay_registry}/api/v1/repository/${orga}/${repo}/mirror | jq
Copy to Clipboard Toggle word wrap

扩展配置

$ curl -X POST
  -H "Authorization: Bearer ${bearer_token}"
  -H "Content-Type: application/json"
  --data '{"is_enabled": true, "external_reference": "quay.io/minio/mc", "external_registry_username": "username", "external_registry_password": "password", "external_registry_config": {"unsigned_images":true, "verify_tls": false, "proxy": {"http_proxy": "http://proxy.tld", "https_proxy": "https://proxy.tld", "no_proxy": "domain"}}, "sync_interval": 600, "sync_start_date": "2021-08-06T11:11:39Z", "root_rule": {"rule_kind": "tag_glob_csv", "rule_value": [ "*" ]}, "robot_username": "orga+robot"}' https://${quay_registry}/api/v1/repository/${orga}/${repo}/mirror | jq
Copy to Clipboard Toggle word wrap

法律通告

Copyright © 2024 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat