使用 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 租期模型 复制链接链接已复制到粘贴板!
- 组织 在通用命名空间中共享存储库的方式,这些存储库不属于单个用户,而是在共享设置(如公司)中的很多用户共享。
- 团队 提供了一种方式,供组织委派权限(包括全局存储库和特定存储库),以设置或用户组。
-
用户可以通过 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 实例创建新用户:
- 以超级用户(默认为quay)登录 Red Hat Quay。
- 从主页右上角选择您的帐户名称,然后选择 Super User Admin Panel。
- 从左列中选择 Users 图标。
- 选择创建用户按钮。
- 输入新用户的 Username 和 Email 地址,然后选择 Create User 按钮。
返回到 Users 页面,选择新 Username 右侧的 Options 图标。此时会出现一个下拉菜单,如下图所示:
- 从菜单中选择"更改密码"。
- 添加新密码并进行验证,然后选择"更改用户密码"按钮。
新用户现在可以使用该用户名和密码通过 web ui 或某些容器客户端登录。
1.3. 创建机构帐户 复制链接链接已复制到粘贴板!
任何用户都可以创建自己的组织来共享容器镜像的存储库。要创建新机构,请执行以下操作:
- 以任何用户身份登录时,从主页右上角选择加号(+),然后选择 New Organization。
- 输入机构的名称。名称必须是字母数字、所有小写以及 2 到 255 个字符的长度
选择 Create Organization。新组织显示,您可以开始添加存储库、团队、机器人帐户和其他功能(来自左列中的图标)。下图显示了选择有 settings 选项卡的新机构页面示例。
第 2 章 创建软件仓库 复制链接链接已复制到粘贴板!
存储库提供了一个中央位置,用于存储一组相关的容器镜像。在 Red Hat Quay 中创建存储库有两种方法:通过 push (来自 docker
或 podman
)并通过 Red Hat Quay UI 创建存储库。无论您使用 Quay.io 还是您自己的 Red Hat Quay 实例,它们基本上都相同。
2.1. 通过 UI 创建镜像存储库 复制链接链接已复制到粘贴板!
要在 Red Hat Quay UI 中创建存储库,请执行以下操作:通过 Web UI 登录用户帐户。点击主页上标题右上角的 + 图标(或其他与用户相关的页面),然后选择 New Repository,如下图所示:
+
在出现的 Create New Repository 页面中
- 将新存储库名称添加到用户名
- 单击 Repository Description,再键入存储库的描述
- 在 Repository Visibility 中,选择您想要存储库是公开的还是私有的
- 单击创建存储库按钮。
新存储库已创建,开始为空。您可以使用 docker pull 命令从该存储库拉取镜像(减去镜像名称)出现在屏幕上。
要在 Red Hat Quay UI 中创建存储库,请执行以下操作:
- 以具有组织的 Admin 或 Write 权限的用户身份登录。
- 从 Repositories 视图,从 Users 和 Organizations 下的右列中选择组织名称。此时会出现机构页面,类似于图 2.x 所示的页面:
- 在页面的右上角,单击 +Create New Repository。
在出现的 Create New Repository 页面中:
- 将新存储库名称添加到机构名称
- 单击 Repository Description,再键入存储库的描述
- 在 Repository Visibility 中,选择您想要存储库是公开的还是私有的
- 单击创建存储库按钮。
新存储库已创建,开始为空。您可以使用 docker pull 命令从该存储库拉取镜像(减去镜像名称)出现在屏幕上。
2.2. 通过 docker 或 podman 创建镜像存储库 复制链接链接已复制到粘贴板!
假设您有正确的凭证,将镜像推送到 Red Hat Quay 实例中尚不存在的存储库,因为它将创建该存储库,因为它将镜像推送到该存储库。docker
或 podman
命令可用于这些示例。
标记镜像:使用本地系统上
docker
或podman
提供的镜像,使用新存储库名称和镜像名称标记该镜像。以下是将镜像推送到 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
# sudo podman tag myubi-minimal quay.io/namespace/repo_name # sudo podman tag myubi-standard reg.example.com/namespace/repo_name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 推送到适当的 registry。例如:
sudo podman push quay.io/namespace/repo_name sudo podman push reg.example.com/namespace/repo_name
# sudo podman push quay.io/namespace/repo_name # sudo podman push reg.example.com/namespace/repo_name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
要创建应用程序存储库,请按照创建容器镜像存储库相同的步骤进行操作。
第 3 章 管理对软件仓库的访问 复制链接链接已复制到粘贴板!
作为 Red Hat Quay 用户,您可以创建自己的存储库,并使其可以被 Red Hat Quay 实例上的其他用户访问。另外,您可以创建机构来根据团队访问存储库。在用户和组织存储库中,您可以通过创建与机器机器帐户关联的凭证来访问这些存储库。机器人帐户使得各种容器客户端(如 docker 或 podman)更易于访问您的仓库,而无需客户端具有 Red Hat Quay 用户帐户。
3.1. 允许访问用户软件仓库 复制链接链接已复制到粘贴板!
在用户命名空间中创建存储库时,您可以向用户帐户或机器人帐户添加对该存储库的访问权限。
3.1.1. 允许用户访问用户存储库 复制链接链接已复制到粘贴板!
要允许访问与用户帐户关联的存储库,请执行以下操作:
- 登录到您的 Red Hat Quay 用户帐户。
- 在要共享访问权限的用户命名空间中选择一个仓库。
- 从左列中选择 Settings 图标。
键入您要为其授予存储库访问权限的用户名称。用户名应如您输入的形式出现,如下图所示:
在权限框中,选择以下内容之一:
- read - 允许用户查看存储库并从中拉取。
- write - 允许用户查看存储库,以及从镜像拉取(pull)镜像或将镜像推送到存储库。
- admin - 允许存储库的所有管理设置以及所有读写权限。
- 选择添加权限按钮。用户现在具有分配的权限。
要删除存储库用户权限,请选择用户条目右侧的 Options 图标,然后选择 Delete Permission。
3.2. 允许机器访问用户存储库 复制链接链接已复制到粘贴板!
机器人帐户用于自动访问 Red Hat Quay registry 中的存储库。它们类似于 OpenShift 服务帐户。设置机器机器帐户时,您可以:
- 生成与机器机器帐户关联的凭证
- 识别机器可将镜像推送到或拉取镜像的存储库和镜像
- 复制并粘贴生成的凭证,以用于不同的容器客户端(如 Docker、podman、Kubernetes、Mesos 等)以访问每个定义的存储库
请记住,每个机器人帐户都仅限于单个用户命名空间或组织。例如,机器人可以为用户提供 jsmith 访问的所有存储库的访问权限,但不能访问任何不属于用户存储库列表中的任何存储库。
您可以通过设置机器人帐户来访问您的存储库的步骤。
- 选择 Robot 图标:从 Repositories 视图中,选择左列中的 Robot 图标。
- 创建 Robot 帐户:选择 Create Robot Account 按钮。
- 设置 Robot 名:输入名称和描述,然后选择 Create robot account 按钮。机器人名称成为您的用户名组合,加上您设置的机器人名称(例如,jsmith+myrobot)
为机器人帐户添加权限:从机器机器帐户的 Add permissions 屏幕,定义您要访问机器的存储库,如下所示:
- 在机器人可以访问的每个存储库旁边放置一个复选标记
对于每个仓库,选择以下项之一并点击 Add permissions:
- None - Robot 对存储库没有权限
- read - Robot can view and pull from the repository
- write - Robot can read (pull)从写入(推送)到存储库
- admin - 从存储库拉取和推送到存储库的完全访问权限,以及执行与存储库关联的管理任务的功能
- 选择添加权限按钮以应用设置
- 获取通过 robot: Back 在 Robot Accounts 页面上访问存储库的凭证,选择 Robot account name 以查看该机器的凭据信息。
获取令牌:选择 Robot Token,如下图所示,查看为机器机器生成的令牌。如果要重置令牌,请选择 Regenerate Token。
注意务必要清楚,重新生成令牌会导致这个机器的所有之前令牌都无效。
获取凭证:当您满足生成的令牌后,以以下方式获取生成的凭证:
- 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. 将团队添加到机构中 复制链接链接已复制到粘贴板!
当您为您的机构创建团队时,您可以选择团队名称,选择哪些存储库可供团队使用,并决定对团队的访问权限级别。
- 在 Organization 视图中,从左列中选择 Teams 和 Membership 图标。您将看到一个所有者团队,其中包含创建该组织的用户的 Admin 权限。
- 选择 Create New Team。系统会提示您输入要与机构关联的新团队名称。键入团队名称,它必须以小写字母开头,其组名称作为小写字母和数字的任意组合(不允许使用大写或特殊字符)。
- 选择创建团队按钮。此时会出现 Add permissions 窗口,显示机构中的存储库列表。
检查您希望团队能够访问的每个存储库。并为每项选择以下权限之一:
- Read - 团队成员可以查看和拉取镜像
- write - 团队成员可以查看、拉取和推送镜像
- admin - 团队成员具有完全的读/写权限,以及执行与存储库相关的管理任务的能力
- 选择 Add permissions,为团队保存存储库权限。
3.3.2. 设置团队角色 复制链接链接已复制到粘贴板!
添加团队后,您可以在组织内设置该团队的角色。从机构的 Teams 和 Membership 屏幕中,选择 TEAM ROLE 下拉菜单,如下图所示:
对于所选团队,请选择以下角色之一:
- member - 继承为团队设置的所有权限
- 创建者 - 所有成员权限,以及创建新存储库的功能
- admin - 完全对组织的管理访问权限,包括创建团队、添加成员和设置权限的能力。
3.3.3. 将用户添加到团队 复制链接链接已复制到粘贴板!
作为具有管理员权限的用户,您可以在团队中添加用户和机器机器。当您添加用户时,它会向该用户发送电子邮件。用户保持待处理状态,直到该用户接受邀请。
要将用户或机器机器添加到团队,请从机构屏幕开始并执行以下操作:
- 选择您要添加用户或机器的团队。
在 Team Members 框中,输入以下内容之一:
- 来自 Red Hat Quay registry 帐户的用户名
- registry 中用户帐户的电子邮件地址
- 机器人帐户的名称。名称必须采用 orgname+robotname 的形式
- 如果是机器人帐户,它会立即添加到团队中。对于用户帐户,邀请加入将发送给用户。在用户接受邀请之前,用户会一直处于 INVITED TO JOIN 状态。
接下来,用户接受加入团队的电子邮件邀请。用户下次登录到 Red Hat Quay 实例时,用户从 INVITED TO JOIN 列表移到该组织的 MEMBERS 列表。
第 4 章 使用标签 复制链接链接已复制到粘贴板!
标签提供了一种标识镜像版本的方法,并提供以不同方式命名相同镜像的方法。除了镜像的版本外,镜像标签还可以标识其用途(如 devel、test 或 prod)或者它是最新的版本(latest)。
在镜像存储库的 Tags 选项卡中,您可以查看、修改、添加、移动、删除和查看标签历史记录。您还可以获取命令行,使用不同的命令下载(基于其名称和标签)特定镜像(基于其名称和标签)。
4.1. 查看和修改标签 复制链接链接已复制到粘贴板!
可以在存储库页面的标签面板中查看和修改存储库标签,单击 标签 选项卡即可找到。
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 选项卡中,您可以查看从准备好使用这些镜像的客户端中拉取镜像的不同方法。
- 选择特定的存储库/镜像
- 选择左列中的标签
- 选择特定镜像/标签组合的 Fetch Tag 图标
- 当显示 Fetch Tag 弹出窗口中时,选择映像格式框,以查看一个下拉菜单,显示可用于拉取镜像的不同方法。选择提供将特定容器镜像拉取到本地系统的完整命令行:
您可以选择通过标签名称或使用 docker 命令来拉取镜像的常规镜像。选择您想要的拉取类型,然后选择 Copy Command
。完整的命令行复制到您的剪贴板中。这两个命令显示按标签和摘要的 docker pull :
docker pull quay.io/cnegus/whatever:latest docker pull quay.io/cnegus/whatever@sha256:e02231a6aa8ba7f5da3859a359f99d77e371cb47e643ce78e101958782581fb9
docker pull quay.io/cnegus/whatever:latest
docker pull quay.io/cnegus/whatever@sha256:e02231a6aa8ba7f5da3859a359f99d77e371cb47e643ce78e101958782581fb9
将命令粘贴到有 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 字段上,以查看当前设置的过期日期和时间。
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 查看仓库或命名空间的日志条目,请执行以下操作:
- 选择具有 Admin 权限的存储库或命名空间(organization 或 user)。
从左列中选择 Usage Logs 图标。此时会出现 Usage Logs 屏幕,如下图所示:
在 Usage Logs 页面中,您可以:
- 通过向 From 和 框添加日期来设置用于查看日志条目的日期范围。默认情况下会显示最近一个日志条目的一周。
- 在 Filter Logs 框中键入字符串,以显示容器给定字符串的日志条目。
- 将箭头切换为任何日志条目的左侧,以查看与该日志条目关联的更多文本。
5.2. 导出存储库日志 复制链接链接已复制到粘贴板!
为了能够获取大量日志文件并将它们保存到 Red Hat Quay 数据库外,您可以使用 Export Logs 功能。以下是您应该了解的有关使用导出日志的一些事项:
- 您可以为要从仓库收集的日志选择一系列日期。
- 您可以通过电子邮件附件或定向到回调 URL 来请求日志发送到您的。
- 您需要对存储库或命名空间的 Admin 权限才能导出日志
- 一次可导出最多 30 天日志数据
- 导出日志只收集之前生成的日志数据。它不会流传输日志记录数据。
- 必须为此功能配置 Red Hat Quay 实例(本地存储不起作用)。
- 收集并可用日志后,您应立即复制这些数据(如果您想要保存)。默认情况下,数据会在一小时内过期。
使用导出日志功能:
- 选择具有 Admin 权限的存储库。
- 从左列中选择 Usage Logs 图标。此时会出现 Usage Logs 屏幕。
- 选择您要收集的日志条目的 From 和 to date 范围。
选择导出日志按钮。此时会出现一个出口 Usage Logs 弹出,如下所示
- 输入您要接收导出的日志的电子邮件地址或回调 URL。对于回调 URL,您可以使用指向 Webhook.site 等位置的 URL。
- 选择 Start Logs Export。这会导致 Red Hat Quay 开始收集所选日志条目。根据要收集的日志数据量,这在一分钟到一小时的任何位置可能需要一些时间才能完成。
当日志导出完成后,您将:
- 收到一封电子邮件,提醒您提供您导出的日志条目。
- 请参阅来自 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.cert
和 ssl.key
文件。在本例中,如果希望集群支持构建器,您必须将 Quay 路由和构建器路由名称添加到证书中的 SAN 列表中,或使用通配符。要添加构建器路由,请使用以下格式:
[quayregistry-cr-name]-quay-builder-[ocp-namespace].[ocp-domain-name]
[quayregistry-cr-name]-quay-builder-[ocp-namespace].[ocp-domain-name]
6.4.2. Prepare OpenShift for Red Hat Quay Builds 复制链接链接已复制到粘贴板!
在 OpenShift 集群中接受 Red Hat Quay 构建前,需要一些操作。
创建一个将运行构建的项目(如 'builder')
oc new-project builder
$ oc new-project builder
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在此
项目
中创建一个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
$ 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 Copied! Toggle word wrap Toggle overflow - 识别 OpenShift 集群 API 服务器的 URL。这可以通过 OpenShift 控制台找到。
-
识别调度构建作业时使用的 worker
节点标签
。因为构建 pod 需要在裸机 worker 节点上运行,因此通常使用特定标签来标识这些 pod。检查您的集群管理员,以确定应使用哪个节点标签。 如果集群使用自签名证书,获取 kube apiserver 的 CA 来添加到 Red Hat Quay 的额外证书中。
获取包含 CA 的 secret 名称:
oc get sa openshift-apiserver-sa --namespace=openshift-apiserver -o json | jq '.secrets[] | select(.name | contains("openshift-apiserver-sa-token"))'.name
$ oc get sa openshift-apiserver-sa --namespace=openshift-apiserver -o json | jq '.secrets[] | select(.name | contains("openshift-apiserver-sa-token"))'.name
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
从 Openshift 控制台中的 secret 获取
ca.crt
键值。该值应该以"-----BEGIN CERTIFICATE-----"开头。 -
使用 ConfigTool 在 Red Hat Quay 中导入 CA。确保此文件的名称匹配
K8S_API_TLS_CA
。
-
为
ServiceAccount
创建所需的安全上下文/角色绑定:
6.4.3. 启用构建器并在 Red Hat Quay 的配置捆绑包中添加构建配置 复制链接链接已复制到粘贴板!
- 确保已在 Red Hat Quay 配置中启用了 Builds。
FEATURE_BUILD_SUPPORT: True
FEATURE_BUILD_SUPPORT: True
- 将以下内容添加到 Red Hat Quay 配置捆绑包中,使用特定于安装的值替换每个值。
目前,只能通过 Red Hat Quay Config Tool 启用构建功能。必须在 config.yaml 文件中手动进行 Build Manager 和 Executors 的实际配置。
每个配置字段都如下所述。
- 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
-
指定构建器是否应该运行
docker
或podman
。使用红帽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 路由
的一个限制只能为单一端口提供流量,因此设置构建需要额外的步骤。确保您的 kubectl
或 oc
CLI 工具被配置为与安装 Quay Operator 的集群一起工作,并且您的 QuayRegistry
存在(您的 QuayRegistry 不一定与运行构建器的裸机集群相同)。
- 按照以下步骤,确保 OpenShift 集群上启用了 HTTP/2 入口。
Quay Operator 将创建一个
Route
,它将 gRPC 流量定向到在现有 Quay pod 内运行的构建管理器服务器。如果要使用自定义主机名(如builder.registry.example.com
)的自定义主机名,请确保创建一个带有 DNS 供应商的 CNAME 记录,指向所创建的Route
的status.ingress[0].host
:kubectl get -n <namespace> route <quayregistry-name>-quay-builder -o jsonpath={.status.ingress[0].host}
$ kubectl get -n <namespace> route <quayregistry-name>-quay-builder -o jsonpath={.status.ingress[0].host}
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过 OpenShift UI 或 CLI,使用构建集群 CA 证书(密钥
extra_ca_cert_build_cluster.cert
)更新QuayRegistry
的spec.configBundleSecret
引用的Secret
, 使用上面的构建程序配置(取决于您的构建 executor))中引用的正确的值以及BUILDMAN_HOSTNAME
字段更新config.yaml
条目:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
额外的配置字段如下所述:
- BUILDMAN_HOSTNAME
-
外部可访问的服务器主机名,构建作业用来与构建管理器通信。默认为与
SERVER_HOSTNAME
相同。对于 OpenShiftRoute
,如果使用自定义主机名,则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。例如:
当设置为 true 时,DEBUG 将阻止构建节点在 quay-builder 服务完成后关闭,并阻止构建管理器清理实例(终止 EC2 实例或删除 k8s 作业)。这将允许调试构建器节点问题,不应 在生产环境中设置。生命周期服务仍然存在。例如,实例在约 2 小时(EC2 实例将终止)后,K8s 作业也将影响 ALLOWED_WORKER_COUNT,因为未终止的实例/作业仍然会计算运行的工作总数。这意味着,如果达到 ALLOWED_WORKER_COUNT,则需要手动删除现有的构建器工作程序,才能调度新构建。
使用以下步骤:
客户机虚拟机将其 SSH 端口(22)转发到其主机(容器集)端口 2222。将构建器 Pod 的端口 2222 转发到 localhost 上的端口。例如
kubectl port-forward <builder pod> 9999:2222
$ kubectl port-forward <builder pod> 9999:2222
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用从 SSH_AUTHORIZED_KEYS 设置的密钥,通过 SSH 连接到容器内运行的虚拟机:
ssh -i /path/to/ssh/key/set/in/ssh_authorized_keys -p 9999 core@localhost
$ ssh -i /path/to/ssh/key/set/in/ssh_authorized_keys -p 9999 core@localhost
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 获取 quay-builder 服务日志:
systemctl status quay-builder journalctl -f -u quay-builder
$ systemctl status quay-builder $ journalctl -f -u quay-builder
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在单一 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’
$ 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 Copied! Toggle word wrap Toggle overflow
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 归档的构建,构建工作程序提取存档并进入构建上下文。例如:
试想一下,上面的示例是 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
来使用。
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:
此请求需要包含 application/json
的 Content-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. 为构建触发器设置标签名称 复制链接链接已复制到粘贴板!
按照以下步骤为构建触发器配置自定义标签:
- 在存储库视图中,从左侧导航中选择 Builds 图标。
选择 Create Build Trigger 菜单,再选择您想要的存储库推送的类型(GitHub、Bitbucket、GitLab 或 Custom Git 存储库推送)。在本例中,选择了 GitHub Repository Push,如下图所示。
- 当显示 Setup Build Trigger 页面时,选择您要在其中设置触发器的存储库和命名空间。
在 Configure Trigger 下,选择 Trigger for all branches and tags 或 Trigger only on branches and tags matching a regular expression。然后选择 Continue。Configure Tagging 部分会出现,如下图所示:
向下滚动到 Configure Tagging,然后从以下选项中选择:
- 带有分支或标签名称 : Check this box 的标签清单,以使用提交发生在镜像上使用的标签的分支或标签的名称。这会被默认启用。
-
在默认分支上添加 latest 标签 :如果此框位于存储库的默认分支上,则使用该镜像的
latest
标签。这会被默认启用。 - 添加自定义标记模板 :在 Enter a tag 模板 框中输入自定义标签或模板。您可以在此处输入多个标签模板,如本节前面所述。它们包括使用简短的 SHA、时间戳、作者名称、提交者和分支名称作为标签的方法。
- 选择 Continue。系统会提示您输入 Docker 构建的目录构建上下文。构建上下文目录标识含有 Dockerfile 的目录的位置,以及触发构建时所需的其他文件。如果 Dockerfile 位于 git 存储库的根目录,则请输入 "/"。
- 选择 Continue。系统将提示您添加可选的 Robot Account。如果要在构建过程中拉取私有基础镜像,请执行以下操作。机器人帐户需要访问构建。
- 选择 Continue 以完成构建触发器的设置。
如果要返回到存储库的 Repository Builds 页面,则您设置的构建触发器将在 Build Triggers 标题下列出。
第 11 章 在 GitHub 中创建 OAuth 应用程序 复制链接链接已复制到粘贴板!
您可以授权 registry 访问 GitHub 帐户及其存储库,方法是将它注册为 GitHub OAuth 应用程序。
11.1. 创建新 GitHub 应用程序 复制链接链接已复制到粘贴板!
- 登录 GitHub (企业)
- 访问您组织设置下的 Applications 页面。
-
点 Register New Application。此时会显示
Register a new OAuth 应用程序
配置屏幕: 设置主页 URL:输入 Quay Enterprise URL 作为
Homepage URL
注意如果使用公共 GitHub,则输入的主页 URL 必须可以被您的用户访问。它仍然是内部 URL。
- 设置授权回调 URL:输入 https://{$RED_HAT_QUAY_URL}/oauth2/github/callback 作为授权回调 URL。
- 点 Register application 按钮保存您的设置。此时会显示新应用程序概述:
- 记录为新应用显示的客户端 ID 和客户端 Secret。
第 12 章 仓库通知 复制链接链接已复制到粘贴板!
Quay 支持将 通知 添加到仓库生命周期中发生的各种事件的存储库中。要添加通知,可在查看存储库时单击 Settings 选项卡,然后选择 Create Notification
。在发生此事件时
,选择您要接收通知的项目:
选择事件后,通过添加如何通知该事件来进一步配置该事件。
添加通知需要 存储库 admin 权限。
以下是存储库事件的示例。
12.1. 仓库事件 复制链接链接已复制到粘贴板!
12.1.1. 存储库 Push 复制链接链接已复制到粘贴板!
向存储库成功推送一个或多个镜像:
12.1.2. Dockerfile 构建队列 复制链接链接已复制到粘贴板!
下面是在构建系统中排队 Dockerfile 构建的示例响应。根据可选属性的使用,响应可能会不同。
12.1.3. Dockerfile 构建已启动 复制链接链接已复制到粘贴板!
下面是构建系统启动的 Dockerfile 构建示例。根据某些属性,响应可能会因一些属性而异。
12.1.4. Dockerfile 构建成功完成 复制链接链接已复制到粘贴板!
以下是构建系统已成功完成的 Dockerfile 构建的示例响应:
此事件会同时 发生,带有一个构建镜像的 Repository Push 事件。
12.1.5. Dockerfile 构建失败 复制链接链接已复制到粘贴板!
Dockerfile 构建失败
12.1.6. Dockerfile 构建取消 复制链接链接已复制到粘贴板!
已取消 Dockerfile 构建
12.1.7. 安全漏洞已弃用 复制链接链接已复制到粘贴板!
在存储库中检测到一个漏洞
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
$ sudo cp rootCA.pem /etc/pki/ca-trust/source/anchors/ $ sudo update-ca-trust extract
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 正式发布: 在 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
$ tar -zxvf helm-v3.8.2-linux-amd64.tar.gz $ mv linux-amd64/helm /usr/local/bin/helm
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
在 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。
流程
添加 chart 存储库:
helm repo add redhat-cop https://redhat-cop.github.io/helm-charts
$ helm repo add redhat-cop https://redhat-cop.github.io/helm-charts
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 从 chart 仓库本地更新可用 chart 的信息:
helm repo update
$ helm repo update
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 从存储库下载 chart:
helm pull redhat-cop/etherpad --version=0.0.4 --untar
$ helm pull redhat-cop/etherpad --version=0.0.4 --untar
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将图表打包成 chart 归档:
helm package ./etherpad
$ helm package ./etherpad
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Successfully packaged chart and saved it to: /home/user/linux-amd64/etherpad-0.0.4.tgz
Successfully packaged chart and saved it to: /home/user/linux-amd64/etherpad-0.0.4.tgz
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
helm registry 登录
Quay 存储库:helm registry login quay370.apps.quayperf370.perfscale.devcluster.openshift.com
$ helm registry login quay370.apps.quayperf370.perfscale.devcluster.openshift.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 使用
helm push
命令将 chart 推送到 Quay 存储库:helm push etherpad-0.0.4.tgz oci://quay370.apps.quayperf370.perfscale.devcluster.openshift.com
$ helm push etherpad-0.0.4.tgz oci://quay370.apps.quayperf370.perfscale.devcluster.openshift.com
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例:
Pushed: quay370.apps.quayperf370.perfscale.devcluster.openshift.com/etherpad:0.0.4 Digest: sha256:a6667ff2a0e2bd7aa4813db9ac854b5124ff1c458d170b70c2d2375325f2451b
Pushed: quay370.apps.quayperf370.perfscale.devcluster.openshift.com/etherpad:0.0.4 Digest: sha256:a6667ff2a0e2bd7aa4813db9ac854b5124ff1c458d170b70c2d2375325f2451b
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 通过删除本地副本来确保推送可以正常工作,然后从存储库拉取 chart:
rm -rf etherpad-0.0.4.tgz
$ rm -rf etherpad-0.0.4.tgz
Copy to Clipboard Copied! Toggle word wrap Toggle overflow helm pull oci://quay370.apps.quayperf370.perfscale.devcluster.openshift.com/etherpad --version 0.0.4
$ helm pull oci://quay370.apps.quayperf370.perfscale.devcluster.openshift.com/etherpad --version 0.0.4
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例:
Pulled: quay370.apps.quayperf370.perfscale.devcluster.openshift.com/etherpad:0.0.4 Digest: sha256:4f627399685880daf30cf77b6026dc129034d68c7676c7e07020b70cf7130902
Pulled: quay370.apps.quayperf370.perfscale.devcluster.openshift.com/etherpad:0.0.4 Digest: sha256:4f627399685880daf30cf77b6026dc129034d68c7676c7e07020b70cf7130902
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
13.3. OCI 和 Helm 配置字段 复制链接链接已复制到粘贴板!
现在,FEATURE _GENERAL_OCI_SUPPORT 属性支持
Helm 的支持。如果您需要明确启用该功能,例如,如果之前已被禁用,或者已从默认没有启用的版本升级,则需要在 Quay 配置中添加两个属性来启用 OCI 工件:
FEATURE_GENERAL_OCI_SUPPORT: true FEATURE_HELM_OCI_SUPPORT: true
FEATURE_GENERAL_OCI_SUPPORT: true
FEATURE_HELM_OCI_SUPPORT: true
字段 | 类型 | Description |
---|---|---|
FEATURE_GENERAL_OCI_SUPPORT | 布尔值 |
启用对 OCI 工件的支持 |
FEATURE_HELM_OCI_SUPPORT | 布尔值 |
启用对 Helm 工件的支持 |
从 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 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
...
接下来,生成密钥对:
cosign generate-key-pair
$ cosign generate-key-pair
Enter password for private key:
Enter again:
Private key written to cosign.key
Public key written to cosign.pub
使用以下命令为密钥对签名:
cosign sign -key cosign.key quay-server.example.com/user1/busybox:test
$ 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
有些用户可能会遇到以下错误:
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[]
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[]
因为 cosign 依赖于 ~/.docker/config.json 进行授权,您可能需要执行以下命令:
podman login --authfile ~/.docker/config.json quay-server.example.com
$ podman login --authfile ~/.docker/config.json quay-server.example.com
Username:
Password:
Login Succeeded!
您可以使用以下命令查看更新的授权配置:
13.6. 在 Quay 中添加其他 OCI 介质类型 复制链接链接已复制到粘贴板!
Helm、cosign 和 ztsd 压缩方案工件默认内置在 Red Hat Quay 3.6 中。对于默认不支持的任何其他 OCI 介质类型,您可以使用以下格式将它们添加到 ALLOWED_OCI_ARTIFACT_TYPES
配置中:
例如,您可以通过在 config.yaml 中添加以下内容来添加 Singularity (SIF)支持:
在添加未默认配置的 OCI 介质类型时,用户还需要手动添加对 cosign 和 Helm 的支持。默认情况下支持 ztsd 压缩方案,因此用户不需要将该 OCI 介质类型添加到其 config.yaml 中以启用支持。
13.7. 在 Quay 中禁用 OCI 工件 复制链接链接已复制到粘贴板!
如果要禁用 OCI 工件支持,可以在 config.yaml 中将 FEATURE_GENERAL_OCI_SUPPORT
设置为 False
:
... FEATURE_GENERAL_OCI_SUPPORT = False ...
...
FEATURE_GENERAL_OCI_SUPPORT = False
...
第 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. 配额管理限制 复制链接链接已复制到粘贴板!
配额管理有助于组织维护资源消耗。配额管理的一个限制是计算在推送上的资源消耗会导致计算成为推送关键路径的一部分。如果没有这种情况,使用数据可能会偏移。
最大存储配额大小取决于所选数据库:
变量 | Description |
---|---|
Postgres | 8388608 TB |
MySQL | 8388608 TB |
SQL Server | 16777216 TB |
14.3. 配额管理配置 复制链接链接已复制到粘贴板!
现在,FEATURE _QUOTA_MANAGEMENT
属性支持配额管理,并默认关闭。要启用配额管理,将 config.yaml
中的 feature 标志设置为 true
:
FEATURE_QUOTA_MANAGEMENT: true
FEATURE_QUOTA_MANAGEMENT: true
在 Red Hat Quay 3.7 中,需要超级用户权限才能创建、更新和删除配额。虽然可以为用户和机构设置配额,但您无法使用 Red Hat Quay UI 重新配置 用户配额,而您必须使用 API。
14.3.1. 默认配额 复制链接链接已复制到粘贴板!
要指定应用于每个机构和用户的系统范围默认存储配额,请使用 DEFAULT_SYSTEM_REJECT_QUOTA_BYTES 配置标志。
字段 | 类型 | 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
$ 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
输出示例
[]
[]
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
$ 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
输出示例
"Created"
"Created"
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
$ 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
输出示例
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
$ 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
输出示例
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
$ 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
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"a=true' | jq
$ 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"a=true' | jq
输出示例
14.4.4.3. 推送另一个镜像 复制链接链接已复制到粘贴板!
拉取、标记和推送第二个镜像,如
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
$ 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 Copied! Toggle word wrap Toggle overflow 要查看机构中存储库的配额报告,请使用 /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"a=true'
$ 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"a=true'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 要在机构详情中查看配额信息,请使用 /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
$ 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 Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
14.4.5. 使用配额限制拒绝推送 复制链接链接已复制到粘贴板!
如果镜像推送超过定义的配额限制,则会出现软或硬检查:
- 对于软检查或警告 , 请通知用户。
- 对于硬检查 或拒绝,推送将被终止。
14.4.5.1. 设置 reject 和 warning 限制 复制链接链接已复制到粘贴板!
要设置 reject 和 warning 限制,将 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
$ 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
警告限制命令示例
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
$ 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
14.4.5.2. 查看拒绝和警告限制 复制链接链接已复制到粘贴板!
要查看 reject 和 warning 限制,请使用 /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
$ 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
配额限制输出示例
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
$ 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
配额超过时的输出示例
14.4.5.4. 超过限制的通知 复制链接链接已复制到粘贴板!
超过限制时,会出现通知:
配额通知
第 15 章 Red Hat Quay 作为上游 registry 的代理缓存 复制链接链接已复制到粘贴板!
随着容器开发日益普及,客户越来越多依赖 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. 代理缓存架构 复制链接链接已复制到粘贴板!
下图显示了代理缓存功能的预期设计流和架构。
当用户从 Red Hat Quay 上的上游存储库中拉取(如 postgres:14
)时,存储库会检查是否存在镜像。如果镜像不存在,则会启动新的拉取。拉取(pull)后,镜像层被保存到并行用户的缓存和服务器。下图描述了此情境的架构概述:
如果缓存中的镜像存在,用户可以依赖 Quay 的缓存与上游源保持最新状态,以便自动拉取缓存中的更新镜像。当上游 registry 中会覆盖原始镜像的标签时,会出现这种情况。下图显示了当上游镜像和镜像的缓存版本不同时所发生情况的架构概述:
如果上游镜像和缓存的版本相同,则不会拉取任何层,缓存的镜像会被传递给用户。
在某些情况下,用户会在上游 registry 停机时启动拉取。如果出现这种情况发生于配置的陈旧期限,则发送存储在缓存中的镜像。如果在配置的过时期后拉取(pull)发生,则错误会传播到用户。以下镜像描述了在配置的过时期限后拉取发生时的架构概述:
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 中的用户和组织。
流程
-
在 UI 上的 Quay 机构中,例如
cache-quayio
,单击左侧窗格的 Organization Settings。 可选:点 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 更新中解决。在 Remote Registry 中,输入要缓存的远程 registry 的名称,如
quay.io
,然后单击 Save。注意通过将命名空间添加到 远程 Registry 中(如
quay.io/<namespace
>),您的机构中的用户只能从该命名空间中代理。可选:添加 Remote Registry Username 和 Remote Registry Password。
注意如果您没有设置 Remote Registry Username 和 Remote Registry Password,则无法添加它而无需删除代理缓存并创建新的 registry。
可选:在 到期 字段中设置一个时间。
注意- 代理组织中缓存镜像的默认标签 Expiration 字段被设置为 86400 秒。在代理机构中,每次拉取标签时,标签过期会被刷新到 UI 的 Expiration 字段中设置的值。此功能与 Quay 的默认 单个标签过期 功能不同。在代理机构中,可以覆盖单个标签功能。发生这种情况时,会根据代理机构的 过期 字段重置单个标签的过期时间。
- 已过期的镜像会在分配的时间后消失,但仍存储在 Quay 中。镜像被完全删除或收集的时间取决于您组织的 Time Machine 设置。垃圾回收的默认时间为 14 天,除非另有指定。
- 点 Save。
在 CLI 中,从 registry 中拉取公共镜像,如 quay.io,作为代理缓存:
podman pull <registry_url>/<organization_name>/<quayio_namespace>/<image_name>
$ podman pull <registry_url>/<organization_name>/<quayio_namespace>/<image_name>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要如果您的组织已设置为从远程 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
。
流程
将镜像从代理机构拉取(pull),例如:
podman pull quay-server.example.com/proxytest/projectquay/quay:3.7.9
$ podman pull quay-server.example.com/proxytest/projectquay/quay:3.7.9
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 根据存储库中的空间,您可能需要从代理机构中拉取其他镜像,例如:
podman pull quay-server.example.com/proxytest/projectquay/quay:3.6.2
$ podman pull quay-server.example.com/proxytest/projectquay/quay:3.6.2
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 Red Hat Quay registry UI 中,点您的存储库的名称。
-
点导航窗格中的标签,并确保
quay:3.7.9
和quay:3.6.2
已标记。
-
点导航窗格中的标签,并确保
拉取将导致您的仓库超过分配的配额的最后一个镜像,例如:
podman pull quay-server.example.com/proxytest/projectquay/quay:3.5.1
$ podman pull quay-server.example.com/proxytest/projectquay/quay:3.5.1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
刷新 Red Hat Quay registry 的 Tags 页面。您推送的第一个镜像(如
quay:3.7.9
)应该可以自动使用。Tags 页面现在应当显示quay:3.6.2
和quay: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 增强的构建架构 复制链接链接已复制到粘贴板!
前面的镜像显示了增强的构建功能的预期设计流和架构:
在这个版本中,构建管理器首先会创建作业对象
。然后,作业对象
使用 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.cert
和 ssl.key
文件。在本实例中,如果您希望集群支持构建器,您必须将 Quay 路由和构建器路由名称添加到证书中的 SAN 列表中,或者使用通配符。
要添加构建器路由,请使用以下格式:
[quayregistry-cr-name]-quay-builder-[ocp-namespace].[ocp-domain-name]:443
[quayregistry-cr-name]-quay-builder-[ocp-namespace].[ocp-domain-name]:443
构建器需要 SSL/TLS 证书。有关 SSL/TLS 证书的更多信息,请参阅 将 TLS 证书添加到 Red Hat Quay 容器。
如果使用 Amazon Web Service (AWS) S3 存储,您必须在 AWS 控制台中修改存储桶,然后才能运行构建程序。如需所需参数,请参见以下部分中"修改 AWS S3 存储桶"。
16.3.2.1. 为虚拟构建器准备 OpenShift Container Platform 复制链接链接已复制到粘贴板!
使用以下步骤为 Red Hat Quay 虚拟构建器准备 OpenShift Container Platform。
- 此流程假设您已置备集群并运行 Quay Operator。
- 此流程是在 OpenShift Container Platform 中设置虚拟命名空间。
流程
- 使用集群管理员帐户登录 Red Hat Quay 集群。
运行以下命令,创建一个运行虚拟构建器(如
virtual-builders
)的新项目:oc new-project virtual-builders
$ oc new-project virtual-builders
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令在项目中创建一个
ServiceAccount
:oc create sa -n virtual-builders quay-builder
$ oc create sa -n virtual-builders quay-builder
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 为创建的服务帐户提供编辑权限,以便它能够运行构建:
oc adm policy -n virtual-builders add-role-to-user edit system:serviceaccount:virtual-builders:quay-builder
$ oc adm policy -n virtual-builders add-role-to-user edit system:serviceaccount:virtual-builders:quay-builder
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令授予 Quay builder
anyuid scc
权限:oc adm policy -n virtual-builders add-scc-to-user anyuid -z quay-builder
$ oc adm policy -n virtual-builders add-scc-to-user anyuid -z quay-builder
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意此操作需要集群管理员特权。这是必要的,因为构建器必须以 Podman 用户身份运行,才能进行无特权构建或无根构建工作。
获取 Quay builder 服务帐户的令牌。
如果使用 OpenShift Container Platform 4.10 或更早的版本,请输入以下命令:
oc sa get-token -n virtual-builders quay-builder
oc sa get-token -n virtual-builders quay-builder
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果使用 OpenShift Container Platform 4.11 或更高版本,请输入以下命令:
oc create token quay-builder -n virtual-builders
$ oc create token quay-builder -n virtual-builders
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
eyJhbGciOiJSUzI1NiIsImtpZCI6IldfQUJkaDVmb3ltTHZ0dGZMYjhIWnYxZTQzN2dJVEJxcDJscldSdEUtYWsifQ...
eyJhbGciOiJSUzI1NiIsImtpZCI6IldfQUJkaDVmb3ltTHZ0dGZMYjhIWnYxZTQzN2dJVEJxcDJscldSdEUtYWsifQ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
输入以下命令确定构建程序路由:
oc get route -n quay-enterprise
$ oc get route -n quay-enterprise
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
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 ...
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 Copied! Toggle word wrap Toggle overflow 输入以下命令使用 .crt 扩展生成自签名 SSL/TlS 证书:
oc extract cm/kube-root-ca.crt -n openshift-apiserver
$ oc extract cm/kube-root-ca.crt -n openshift-apiserver
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
ca.crt
ca.crt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令将
ca.crt
文件重命名为extra_ca_cert_build_cluster.crt
:mv ca.crt extra_ca_cert_build_cluster.crt
$ mv ca.crt extra_ca_cert_build_cluster.crt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在控制台中找到配置捆绑包的 secret,然后选择 Actions → Edit Secret 并添加适当的构建程序配置:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 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
时获取。
配置示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 示例命令
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
$ 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 Copied! Toggle word wrap Toggle overflow
16.3.2.2.2. 将 TLS 设置为非受管 复制链接链接已复制到粘贴板!
使用以下步骤将 king:tls
设置为 unmanaged。
流程
在 Red Hat Quay Registry YAML 中,将
kind: tls
设置为managed: false
:- kind: tls managed: false
- kind: tls managed: false
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 Events 页面中,更改会被阻止,直到您设置适当的
config.yaml
文件。例如:Copy to Clipboard Copied! Toggle word wrap Toggle overflow
16.3.2.2.3. 创建临时 secret 复制链接链接已复制到粘贴板!
使用以下步骤为 CA 证书创建临时 secret。
流程
在默认命名空间中创建一个 secret,用于 CA 证书:
oc create secret generic -n quay-enterprise temp-crt --from-file extra_ca_cert_build_cluster.crt
$ oc create secret generic -n quay-enterprise temp-crt --from-file extra_ca_cert_build_cluster.crt
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在默认命名空间中为
ssl.key
和ssl.cert
文件创建一个 secret:oc create secret generic -n quay-enterprise quay-config-ssl --from-file ssl.cert --from-file ssl.key
$ oc create secret generic -n quay-enterprise quay-config-ssl --from-file ssl.cert --from-file ssl.key
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
16.3.2.2.4. 将 secret 数据复制到配置 YAML 中 复制链接链接已复制到粘贴板!
使用以下步骤将 secret 数据复制到 config.yaml
文件中。
流程
- 在控制台 UI 中的 Workloads → Secrets 中找到新 secret。
对于每个 secret,找到 YAML 视图:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 UI 中找到 Red Hat Quay registry 配置捆绑包的 secret,或运行以下命令来通过命令行,如下所示:
oc get quayregistries.quay.redhat.com -o jsonpath="{.items[0].spec.configBundleSecret}{'\n'}" -n quay-enterprise
$ oc get quayregistries.quay.redhat.com -o jsonpath="{.items[0].spec.configBundleSecret}{'\n'}" -n quay-enterprise
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 OpenShift Container Platform 控制台中,为配置捆绑包 secret 选择 YAML 选项卡,并从您创建的两个 secret 中添加数据:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 点 Save。
输入以下命令查看您的 pod 是否重启:
oc get pods -n quay-enterprise
$ oc get pods -n quay-enterprise
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重新配置 Red Hat Quay registry 后,输入以下命令来检查 Red Hat Quay 应用程序 pod 是否在运行:
oc get pods -n quay-enterprise
$ oc get pods -n quay-enterprise
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在您的浏览器中,访问 registry 端点并验证证书是否已更新。例如:
Common Name (CN) example-registry-quay-quay-enterprise.apps.docs.quayteam.org Organisation (O) DOCS Organisational Unit (OU) QUAY
Common Name (CN) example-registry-quay-quay-enterprise.apps.docs.quayteam.org Organisation (O) DOCS Organisational Unit (OU) QUAY
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
16.3.2.3. 使用 UI 创建构建触发器 复制链接链接已复制到粘贴板!
使用以下步骤使用 UI 创建构建触发器。
流程
- 登录您的 Red Hat Quay 存储库。
-
单击 Create New Repository 并创建一个新 registry,如
testrepo
。 在 Repositories 页面上,单击导航窗格中的 Builds 选项卡。或者,直接使用对应的 URL:
https://example-registry-quay-quay-enterprise.apps.docs.quayteam.org/repository/quayadmin/testrepo?tab=builds
https://example-registry-quay-quay-enterprise.apps.docs.quayteam.org/repository/quayadmin/testrepo?tab=builds
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 重要在某些情况下,构建器可能会在解决主机名时遇到问题。此问题可能与在作业对象上设置为
default
的dnsPolicy
相关。目前,这个问题还没有临时解决方案。它将在以后的 Red Hat Quay 版本中解决。- 点 Create Build Trigger → Custom Git Repository Push。
输入用于克隆 Git 存储库的 HTTPS 或 SSH 风格 URL,然后点 Continue。例如:
https://github.com/gabriel-rh/actions_test.git
https://github.com/gabriel-rh/actions_test.git
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 检查带有分支或标签名称的 Tag 清单,然后单击 Continue。
-
在调用触发器时输入要构建的 Dockerfile 位置,如
/Dockerfile
,再单击 Continue。 -
输入 Docker 构建的上下文位置,如
/
,然后单击 Continue。 - 如果保证,请创建一个 Robot 帐户。否则,点 Continue。
- 点 Continue 来验证参数。
- 在 Builds 页面中,点 Trigger Name 的 Options 图标,然后点 Run Trigger Now。
- 从 Git 存储库输入提交 SHA,然后单击 Start Build。
您可以点击 Build History 页面中的提交,或运行
oc get pods -n virtual-builders
来检查构建的状态。例如:oc get pods -n virtual-builders
$ oc get pods -n virtual-builders
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE f192fe4a-c802-4275-bcce-d2031e635126-9l2b5-25lg2 1/1 Running 0 7s
NAME READY STATUS RESTARTS AGE f192fe4a-c802-4275-bcce-d2031e635126-9l2b5-25lg2 1/1 Running 0 7s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc get pods -n virtual-builders
$ oc get pods -n virtual-builders
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE f192fe4a-c802-4275-bcce-d2031e635126-9l2b5-25lg2 1/1 Terminating 0 9s
NAME READY STATUS RESTARTS AGE f192fe4a-c802-4275-bcce-d2031e635126-9l2b5-25lg2 1/1 Terminating 0 9s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow oc get pods -n virtual-builders
$ oc get pods -n virtual-builders
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
No resources found in virtual-builders namespace.
No resources found in virtual-builders namespace.
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 构建完成后,您可以检查导航窗格中 Tags 下的标签状态。
注意通过早期访问,构建的完整构建日志和时间戳当前不可用。
16.3.2.4. 修改 AWS S3 存储桶 复制链接链接已复制到粘贴板!
如果使用 AWS S3 存储,在运行构建程序前,您必须在 AWS 控制台中更改存储桶。
流程
- 在 s3.console.aws.com 登录到 AWS 控制台。
-
在搜索栏中,搜索
S3
,然后单击 S3。 -
点击存储桶的名称,如
myawsbucket
。 - 单击权限选项卡。
在 Cross-origin 资源共享(CORS) 下,包含以下参数:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
16.3.2.5. 修改 Google Cloud Platform 对象存储桶 复制链接链接已复制到粘贴板!
使用以下步骤为虚拟构建器配置跨原始资源共享(CORS)。
如果没有 CORS 配置,上传构建 Dockerfile 会失败。
流程
使用以下引用来创建 JSON 文件,以满足您的特定 CORS 需求。例如:
cat gcp_cors.json
$ cat gcp_cors.json
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输入以下命令更新 GCP 存储桶:
gcloud storage buckets update gs://<bucket_name> --cors-file=./gcp_cors.json
$ gcloud storage buckets update gs://<bucket_name> --cors-file=./gcp_cors.json
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Updating Completed 1
Updating Completed 1
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 您可以运行以下命令来显示 GCP 存储桶的更新 CORS 配置:
gcloud storage buckets describe gs://<bucket_name> --format="default(cors)"
$ gcloud storage buckets describe gs://<bucket_name> --format="default(cors)"
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
第 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/
https://docs.quay.io/api/swagger/
出现的 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:
- 登录到 Red Hat Quay 并选择您的机构(或创建新 Quay)。
- 点击左侧导航栏中的 Applications 图标。
- 选择 Create New Application,并在系统提示时为新应用程序指定一个名称。
- 选择新应用。
- 从左侧导航中选择 Generate Token。
- 选择设置令牌范围的复选框,然后选择 Generate Access Token。
- 查看允许的权限,然后选择 Authorize Application 批准它。
- 复制新生成的令牌,以用于访问 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.
https://<yourquayhost>/api/v1/discovery.
访问 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
# 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
在运行 swagger-ui 容器的情况下,打开您的 Web 浏览器到 localhost 端口 8888,以通过 swagger-ui 容器查看 API 端点。
如果从浏览器调用,为了避免日志中的错误,如 "API 调用,必须使用 X-Requested-With 标头来调用 。
BROWSER_API_CALLS_XHR_ONLY: false
BROWSER_API_CALLS_XHR_ONLY: false
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/"
$ curl -X GET -H "Authorization: Bearer <token_here>" \
"https://<yourquayhost>/api/v1/superuser/users/"
例如:
17.4.2. 使用 API 创建超级用户 复制链接链接已复制到粘贴板!
配置超级用户名称,如 Deploy Quay 书中所述:
- 使用配置编辑器 UI 或
-
直接编辑
config.yaml
文件,使用 配置 API 来验证(并下载)更新的配置捆绑包的选项
为超级用户名称创建用户帐户:
详细获取身份验证令牌,并使用
curl
创建用户:curl -H "Content-Type: application/json" -H "Authorization: Bearer Fava2kV9C92p1eXnMawBZx9vTqVnksvwNm0ckFKZ" -X POST --data '{
$ 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 Copied! Toggle word wrap Toggle overflow 返回的内容包括为新用户帐户生成的密码:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
现在,当您请求 用户列表时,它将以超级用户的形式显示 quaysuper
:
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
$ curl -X GET -k -H "Authorization: Bearer qz9NZ2Np1f55CSZ3RVOvxjeUdkzYuCp0pKggABCD" https://example-registry-quay-quay-enterprise.apps.example.com/api/v1/superuser/logs | jq
初始输出
第二个调用使用 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
$ 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
第二个调用的输出
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
$ 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
为同一团队禁用同步:
curl -X DELETE -H "Authorization: Bearer 9rJYBR3v3pXcj5XqIA2XX6Thkwk4gld4TCYLLWDF" \ http://quay1-server:8080/api/v1/organization/testadminorg/team/newteam/syncing
$ curl -X DELETE -H "Authorization: Bearer 9rJYBR3v3pXcj5XqIA2XX6Thkwk4gld4TCYLLWDF" \
http://quay1-server:8080/api/v1/organization/testadminorg/team/newteam/syncing
17.4.5. 通过 API 创建存储库构建 复制链接链接已复制到粘贴板!
要从指定的输入构建存储库并使用自定义标签标记构建,用户可以使用 requestRepoBuild 端点。它采用以下数据:
archive_url
参数应指向 tar
或 zip
存档,其中包含构建的 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>''
$ curl -X PUT https://quay.io/api/v1/organization/{orgname}/robots/{robot shortname} \
-H 'Authorization: Bearer <token>''
17.4.7. 触发构建 复制链接链接已复制到粘贴板!
curl -X POST https://quay.io/api/v1/repository/YOURORGNAME/YOURREPONAME/build/ \ -H 'Authorization: Bearer <token>'
$ curl -X POST https://quay.io/api/v1/repository/YOURORGNAME/YOURREPONAME/build/ \
-H 'Authorization: Bearer <token>'
带有请求的 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)
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)
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",
$ 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
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
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
扩展配置
curl -X POST
$ 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