4.8.4. 对 Operator 目录进行镜像(mirror)

您可以使用 oc adm catalog mirror 命令将红帽提供的目录或自定义目录的 Operator 内容镜像到容器镜像 registry 中。目标 registry 必须支持 Docker v2-2。对于受限网络中的集群,此 registry 可以是集群有网络访问权限的 registry,如在受限网络集群安装过程中创建的镜像 registry。

重要

OpenShift Container Platform 集群的内部 registry 不能用作目标 registry,因为它不支持没有标签的推送(在镜像过程中需要这个功能)。

oc adm catalog mirror 命令还会自动将在镜像过程中指定的索引镜像(无论是红帽提供的索引镜像还是您自己的自定义构建索引镜像)镜像到目标 registry。然后,您可以使用镜像的索引镜像创建一个目录源,允许 Operator Lifecycle Manager(OLM)将镜像目录加载到 OpenShift Container Platform 集群。

先决条件

  • 没有网络访问限制的工作站
  • podman 1.9.3 或更高版本。
  • 访问支持 Docker v2-2 的镜像 registry。
  • 决定镜像 registry 上用于存储已镜像 Operator 内容的镜像 registry 内容。例如,您可以创建一个 olm-mirror 命名空间。
  • 如果您的镜像 registry 无法访问互联网,请将可移动介质连接到您的没有网络访问限制的工作站。
  • 如果您正在使用私有 registry,包括 registry.redhat.io,请将 REG_CREDS 环境变量设置为 registry 凭证的文件路径,以便在后续步骤中使用。例如,对于 podman CLI:

    $ REG_CREDS=${XDG_RUNTIME_DIR}/containers/auth.json

流程

  1. 如果要镜像红帽提供的目录,请在具有无网络访问限制的工作站中运行以下命令,以便与 registry.redhat.io 进行身份验证:

    $ podman login registry.redhat.io
  2. oc adm catalog mirror 命令提取索引镜像的内容,以生成镜像所需的清单。命令的默认行为会生成清单,然后会自动将索引镜像以及索引镜像本身中的所有镜像内容镜像(mirror)到您的镜像 registry。另外,如果您的镜像 registry 位于完全断开连接的主机上,或者断开连接的或 airgapped 主机上,您可以首先将内容镜像到可移动介质,将介质移到断开连接的环境中,然后将内容从介质镜像到 registry。

    • 选项 A: 如果您的镜像 registry 与您的没有网络访问限制的工作站位于同一个网络中,请在您的工作站中执行以下操作:

      1. 如果您的镜像 registry 需要身份验证,请运行以下命令登录到 registry:

        $ podman login <mirror_registry>
      2. 运行以下命令镜像内容:

        $ oc adm catalog mirror \
            <index_image> \1
            <mirror_registry>:<port>/<namespace> \2
            [-a ${REG_CREDS}] \3
            [--insecure] \4
            [--index-filter-by-os='<platform>/<arch>'] \5
            [--manifests-only] 6
        1
        指定您要镜像的目录的索引镜像。例如,这可能是之前创建的已修剪索引镜像,也可以是默认目录的源索引镜像之一,如 registry.redhat.io/redhat/redhat-operator-index:v4.6
        2
        指定要将 Operator 内容镜像到的目标 registry 和命名空间的完全限定域名(FQDN),其中 <namespace> 是 registry 上的任何现有命名空间。例如,您可以创建一个 olm-mirror 命名空间来将所有镜像的内容推送到。
        3
        可选:如果需要,指定 registry 凭证文件的位置。registry.redhat.io 需要 {REG_CREDS}
        4
        可选:如果您不想为目标 registry 配置信任,请添加 --insecure 标志。
        5
        可选:在有多个变体可用时,指定索引镜像的平台和架构。镜像被传递为 '<platform>/<arch>[/<variant>]'。这不适用于索引引用的镜像。有效值是 linux/amd64linux/ppc64lelinux/s390x
        6
        可选:只生成镜像所需的清单,但并不实际将镜像内容镜像到 registry。这个选项对检查哪些将被镜像(mirror)非常有用,如果您只需要一小部分软件包,可以对映射列表进行修改。然后,您可以使用带有 oc image mirror 命令的 mapping.txt 文件来在以后的步骤中镜像修改的镜像列表。此标志仅用于从目录中对内容进行高级选择性镜像;opm index prune 命令适用于大多数目录管理用例,如果之前用来修剪索引镜像。

        输出示例

        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 选项来禁用嵌套存储库的创建。有关这个临时解决方案的更多信息,请参阅使用带有 Quay registry 知识库文章的 catalog mirror 命令时出现 Unauthorized 错误

    • 选项 B:如果您的镜像 registry 位于断开连接的主机上,请执行以下操作。

      1. 在您的工作站中运行以下命令,且没有网络访问权限将内容镜像到本地文件中:

        $ oc adm catalog mirror \
            <index_image> \1
            file:///local/index \2
            [-a ${REG_CREDS}] \
            [--insecure]
        1
        指定您要镜像的目录的索引镜像。例如,这可能是之前创建的已修剪索引镜像,也可以是默认目录的源索引镜像之一,如 registry.redhat.io/redhat/redhat-operator-index:v4.6
        2
        将内容镜像到您当前目录中的本地文件。

        输出示例

        ...
        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

        1
        务必记录生成的 manifests 目录名称。该目录名将在以后的步骤中使用。
        2
        记录基于您提供的索引镜像展开的 file:// 路径。该路径在以后的步骤中会使用。
      2. 将当前目录中生成的 v2/ 目录复制到可移动介质中。
      3. 物理删除该介质并将其附加到断开连接的环境中可访问镜像 registry 的主机。
      4. 如果您的镜像 registry 需要身份验证,请在断开连接的环境中的主机上运行以下命令以登录到 registry:

        $ podman login <mirror_registry>
      5. 从包含 v2/ 目录的父目录运行以下命令,将镜像从本地文件上传到镜像 registry:

        $ oc adm catalog mirror \
            file://local/index/<repo>/<index_image>:<tag> \1
            <mirror_registry>:<port>/<namespace> \2
            [-a ${REG_CREDS}] \
            [--insecure]
        1
        指定上一命令输出中的 file:// 路径。
        2
        指定要将 Operator 内容镜像到的目标 registry 和命名空间的完全限定域名(FQDN),其中 <namespace> 是 registry 上的任何现有命名空间。例如,您可以创建一个 olm-mirror 命名空间来将所有镜像的内容推送到。
        注意

        Red Hat Quay 不支持嵌套存储库。因此,运行 oc adm catalog mirror 命令会失败,并显示 401 未授权错误。作为临时解决方案,您可以在运行 oc adm catalog mirror 命令时使用 --max-components=2 选项来禁用嵌套存储库的创建。有关这个临时解决方案的更多信息,请参阅使用带有 Quay registry 知识库文章的 catalog mirror 命令时出现 Unauthorized 错误

  3. 将内容镜像到 registry 后,检查当前目录中生成的清单目录。

    注意

    清单目录名会在以后的步骤中使用。

    如果您在上一步中将内容镜像到同一网络上的 registry,则目录名称采用以下格式:

    manifests-<index_image_name>-<random_number>

    如果您在上一步中将内容镜像到断开连接的主机上的 registry,则目录名称采用以下格式:

    manifests-index/<namespace>/<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 标志,并希望进一步调整要镜像的软件包子集,请参阅"镜像软件包清单格式目录镜像"中有关修改 mapping.txt 文件的步骤,并使用 oc image mirror 命令使用该文件。在进行了这些操作后,您可以继续这个过程。

  4. 在可访问断开连接的集群的主机上,运行以下命令来指定 manifests 目录中的 imageContentSourcePolicy.yaml 文件,创建 ImageContentSourcePolicy 对象:

    $ oc create -f <path/to/manifests/dir>/imageContentSourcePolicy.yaml

    其中 <path/to/manifests/dir> 是镜像内容的 manifests 目录的路径。

现在,您可以创建一个 CatalogSource 来引用您的镜像索引镜像和 Operator 内容。