3.7. 镜像用于断开连接的集群的 Operator 目录
您可以使用 oc adm catalog mirror
命令将红帽提供的目录或自定义目录的 Operator 内容镜像到容器镜像 registry 中。目标 registry 必须支持 Docker v2-2。对于受限网络中的集群,此 registry 可以是集群有网络访问权限的 registry,如在受限网络集群安装过程中创建的镜像 registry。
- OpenShift 镜像 registry 不能用作目标 registry,因为它不支持没有标签的推送,在镜像过程中需要这个推送。
-
运行
oc adm catalog mirror
可能会导致以下错误:error: unable to retrieve source image
。当镜像索引包括对镜像 registry 中不再存在的镜像的引用时,会发生此错误。镜像索引可能会保留旧的引用,以便为运行这些镜像的用户在升级图表中显示新的升级路径。作为临时解决方案,您可以使用--skip-missing
选项绕过错误并继续下载镜像索引。如需更多信息,请参阅 Service Mesh Operator 镜像失败。
oc adm catalog mirror
命令还会自动将在镜像过程中指定的索引镜像(无论是红帽提供的索引镜像还是您自己的自定义构建索引镜像)镜像到目标 registry。然后,您可以使用镜像的索引镜像创建一个目录源,允许 Operator Lifecycle Manager(OLM)将镜像目录加载到 OpenShift Container Platform 集群。
3.7.1. 先决条件
与断开连接的集群一起使用的 Operator 目录具有以下先决条件:
- 没有网络访问限制的工作站
-
podman
1.9.3 或更高版本。 如果要过滤或 prune 一个现存的目录,且仅选择性地镜像部分 Operator,请参阅以下部分:
如果要镜像红帽提供的目录,请在具有无网络访问限制的工作站中运行以下命令,以便与
registry.redhat.io
进行身份验证:$ podman login registry.redhat.io
- 访问支持 Docker v22 的镜像 registry。
-
在镜像 registry 上,决定使用哪个存储库或命名空间来存储已镜像的 Operator 内容。例如,您可以创建一个
olm-mirror
存储库。 - 如果您的镜像 registry 无法访问互联网,请将可移动介质连接到您的没有网络访问限制的工作站。
如果您正在使用私有 registry,包括
registry.redhat.io
,请将REG_CREDS
环境变量设置为 registry 凭证的文件路径,以便在后续步骤中使用。例如,对于podman
CLI:$ REG_CREDS=${XDG_RUNTIME_DIR}/containers/auth.json
3.7.2. 提取和镜像目录内容
oc adm catalog mirror
命令提取索引镜像的内容,以生成镜像所需的清单。命令的默认行为会生成清单,然后会自动将索引镜像以及索引镜像本身中的所有镜像内容镜像(mirror)到您的镜像 registry。
另外,如果您的镜像 registry 位于完全断开连接的主机上,或者断开连接的或 airgapped 主机上,您可以首先将内容镜像到可移动介质,将介质移到断开连接的环境中,然后将内容从介质镜像到 registry。
3.7.2.1. 将目录内容镜像到同一网络上的 registry
如果您的镜像 registry 与您的没有网络访问限制的工作站位于同一个网络中,请在您的工作站上执行以下操作:
流程
如果您的镜像 registry 需要身份验证,请运行以下命令登录到 registry:
$ podman login <mirror_registry>
运行以下命令,将内容提取并镜像到镜像 registry:
$ oc adm catalog mirror \ <index_image> \ 1 <mirror_registry>:<port>[/<repository>] \ 2 [-a ${REG_CREDS}] \ 3 [--insecure] \ 4 [--index-filter-by-os='<platform>/<arch>'] \ 5 [--manifests-only] 6
- 1
- 指定您要镜像的目录的索引镜像。
- 2
- 指定要将 Operator 内容镜像到的目标 registry 的完全限定域名(FQDN)。镜像 registry
<repository>
可以是 registry 上的任何现有存储库或命名空间,如先决条件中所述,如olm-mirror
。如果在镜像过程中找到现有的存储库,存储库名称将添加到生成的镜像名称中。如果您不希望镜像名称包含存储库名称,请省略此行中的<repository>
值,例如<mirror_registry>:<port>
。 - 3
- 可选:如果需要,指定 registry 凭证文件的位置。
registry.redhat.io
需要{REG_CREDS}
。 - 4
- 可选:如果您不想为目标 registry 配置信任,请添加
--insecure
标志。 - 5
- 可选:在有多个变体可用时,指定索引镜像的平台和架构。镜像被传递为
'<platform>/<arch>[/<variant>]'
。这不适用于索引引用的镜像。有效值为linux/amd64
,linux/ppc64le
,linux/s390x
,linux/arm64
. - 6
- 可选:只生成镜像所需的清单,而不实际将镜像内容镜像到 registry。这个选项对检查哪些将被镜像(mirror)非常有用,如果您只需要一小部分软件包,可以对映射列表进行修改。然后,您可以使用带有
oc image mirror
命令的mapping.txt
文件来在以后的步骤中镜像修改的镜像列表。此标志用于从目录中对内容进行高级选择性镜像。
输出示例
src image has index label for database path: /database/index.db using database path mapping: /database/index.db:/tmp/153048078 wrote database to /tmp/153048078 1 ... wrote mirroring manifests to manifests-redhat-operator-index-1614211642 2
- 1
- 命令生成的临时
index.db
数据库的目录。 - 2
- 记录生成的 manifests 目录名称。该目录在后续过程中被引用。注意
Red Hat Quay 不支持嵌套存储库。因此,运行
oc adm catalog mirror
命令会失败,并显示401
未授权错误。作为临时解决方案,您可以在运行oc adm catalog mirror
命令时使用--max-components=2
选项来禁用嵌套存储库的创建。有关此临时解决方案的更多信息,请参阅 Unauthorized error thrown while using catalog mirror command with Quay registry。
其他资源
3.7.2.2. 将目录内容镜像到 airgapped registry
如果您的镜像 registry 位于完全断开连接的主机上,或 airgapped 主机上,请执行以下操作。
流程
在您的工作站中运行以下命令,且没有网络访问权限将内容镜像到本地文件中:
$ oc adm catalog mirror \ <index_image> \ 1 file:///local/index \ 2 -a ${REG_CREDS} \ 3 --insecure \ 4 --index-filter-by-os='<platform>/<arch>' 5
输出示例
... info: Mirroring completed in 5.93s (5.915MB/s) wrote mirroring manifests to manifests-my-index-1614985528 1 To upload local images to a registry, run: oc adm catalog mirror file://local/index/myrepo/my-index:v1 REGISTRY/REPOSITORY 2
此命令会在当前目录中创建
v2/
目录中。-
将
v2/
目录复制到可移动介质。 - 物理删除该介质并将其附加到断开连接的环境中可访问镜像 registry 的主机。
如果您的镜像 registry 需要身份验证,请在断开连接的环境中的主机上运行以下命令以登录到 registry:
$ podman login <mirror_registry>
从包含
v2/
目录的父目录运行以下命令,将镜像从本地文件上传到镜像 registry:$ oc adm catalog mirror \ file://local/index/<repository>/<index_image>:<tag> \ 1 <mirror_registry>:<port>[/<repository>] \ 2 -a ${REG_CREDS} \ 3 --insecure \ 4 --index-filter-by-os='<platform>/<arch>' 5
- 1
- 指定上一命令输出中的
file://
路径。 - 2
- 指定要将 Operator 内容镜像到的目标 registry 的完全限定域名(FQDN)。镜像 registry
<repository>
可以是 registry 上的任何现有存储库或命名空间,如先决条件中所述,如olm-mirror
。如果在镜像过程中找到现有的存储库,存储库名称将添加到生成的镜像名称中。如果您不希望镜像名称包含存储库名称,请省略此行中的<repository>
值,例如<mirror_registry>:<port>
。 - 3
- 可选:如果需要,指定 registry 凭证文件的位置。
- 4
- 可选:如果您不想为目标 registry 配置信任,请添加
--insecure
标志。 - 5
- 可选:在有多个变体可用时,指定索引镜像的平台和架构。镜像被指定为
'<platform>/<arch>[/<variant>]'
。这不适用于索引引用的镜像。有效值为linux/amd64
,linux/ppc64le
,linux/s390x
,linux/arm64
, 和.*
注意Red Hat Quay 不支持嵌套存储库。因此,运行
oc adm catalog mirror
命令会失败,并显示401
未授权错误。作为临时解决方案,您可以在运行oc adm catalog mirror
命令时使用--max-components=2
选项来禁用嵌套存储库的创建。有关此临时解决方案的更多信息,请参阅 Unauthorized error thrown while using catalog mirror command with Quay registry。再次运行
oc adm catalog mirror
命令。使用新镜像的索引镜像作为源,以及上一步中使用的同一镜像 registry 目标:$ oc adm catalog mirror \ <mirror_registry>:<port>/<index_image> \ <mirror_registry>:<port>[/<repository>] \ --manifests-only \1 [-a ${REG_CREDS}] \ [--insecure]
- 1
- 此步骤需要
--manifests-only
标志,以便该命令不会再次复制所有镜像的内容。
重要这一步是必需的,因为上一步中生成的
imageContentSourcePolicy.yaml
文件中的镜像映射必须从本地路径更新为有效的镜像位置。如果不这样做,会在稍后的步骤中创建ImageContentSourcePolicy
对象时会导致错误。
在镜像目录后,您可以继续执行集群的其余部分。在集群安装成功完成后,您必须指定此流程中的 manifests 目录来创建 ImageContentSourcePolicy
和 CatalogSource
对象。需要这些对象才能从 OperatorHub 安装 Operator。
其他资源
3.7.3. 生成的清单
将 Operator 目录内容镜像到镜像 registry 后,会在当前目录中生成清单目录。
如果您将内容镜像到同一网络上的 registry,则目录名称采用以下模式:
manifests-<index_image_name>-<random_number>
如果您在上一节中将内容镜像到断开连接的主机上的 registry,则目录名称采用以下模式:
manifests-index/<repository>/<index_image_name>-<random_number>
清单目录名称在后续过程中被引用。
manifests 目录包含以下文件,其中的一些文件可能需要进一步修改:
catalogSource.yaml
文件是CatalogSource
对象的基本定义,它预先填充索引镜像标签及其他相关元数据。此文件可原样使用,或进行相应修改来在集群中添加目录源。重要如果将内容镜像到本地文件,您必须修改 catalogSource
.yaml
文件,从metadata.name
字段中删除任何反斜杠(/
)字符。否则,当您试图创建对象时,会失败并显示 "invalid resource name” 错误。用来定义
ImageContentSourcePolicy
对象的imageContentSourcePolicy.yaml
,它可以将节点配置为在 Operator 清单中存储的镜像(image)引用和镜像 (mirror) 的 registry 间进行转换。注意如果您的集群使用
ImageContentSourcePolicy
对象来配置存储库镜像,则只能将全局 pull secret 用于镜像 registry。您不能在项目中添加 pull secret。mapping.txt
文件,在其中包含所有源镜像,并将它们映射到目标 registry。此文件与oc image mirror
命令兼容,可用于进一步自定义镜像(mirror)配置。重要如果您在镜像过程中使用
--manifests-only
标志,并希望进一步调整要镜像的软件包子集,请参阅 OpenShift Container Platform 4.7 文档中的镜像软件包清单格式目录镜像流程中有关修改mapping.txt
文件并使用oc image mirror
命令的步骤。
3.7.4. 安装后的要求
在镜像目录后,您可以继续执行集群的其余部分。在集群安装成功完成后,您必须指定此流程中的 manifests 目录来创建 ImageContentSourcePolicy
和 CatalogSource
对象。这些对象需要填充和启用从 OperatorHub 安装 Operator。