4.9.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
    Copy to Clipboard Toggle word wrap

流程

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

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

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

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

        $ podman login <mirror_registry>
        Copy to Clipboard Toggle word wrap
      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
        Copy to Clipboard Toggle word wrap
        1
        指定您要镜像的目录的索引镜像。例如,这可能是之前创建的已修剪索引镜像,也可以是默认目录的源索引镜像之一,如 registry.redhat.io/redhat/redhat-operator-index:v4.7
        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
        Copy to Clipboard Toggle word wrap

        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]
        Copy to Clipboard Toggle word wrap
        1
        指定您要镜像的目录的索引镜像。例如,这可能是之前创建的已修剪索引镜像,也可以是默认目录的源索引镜像之一,如 registry.redhat.io/redhat/redhat-operator-index:v4.7
        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
        Copy to Clipboard Toggle word wrap

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

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

        $ oc adm catalog mirror \
            file://local/index/<repo>/<index_image>:<tag> \
        1
        
            <mirror_registry>:<port>/<namespace> \
        2
        
            [-a ${REG_CREDS}] \
            [--insecure]
        Copy to Clipboard Toggle word wrap
        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 错误

      6. 再次运行 oc adm catalog mirror 命令。使用新镜像的索引镜像作为源,以及上一步中与目标相同的镜像 registry 命名空间:

        $ oc adm catalog mirror \
            <mirror_registry>:<port>/<index_image> \
            <mirror_registry>:<port>/<namespace> \
            --manifests-only \
        1
        
            [-a ${REG_CREDS}] \
            [--insecure]
        Copy to Clipboard Toggle word wrap
        1
        此步骤需要 --manifests-only 标志,以便该命令不会再次复制所有镜像的内容。
        重要

        这一步是必需的,因为上一步中生成的 imageContentSourcePolicy.yaml 文件中的镜像映射必须从本地路径更新为有效的镜像位置。如果不这样做,会在稍后的步骤中创建 ImageContentSourcePolicy 对象时会导致错误。

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

    注意

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

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

    manifests-<index_image_name>-<random_number>
    Copy to Clipboard Toggle word wrap

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

    manifests-index/<namespace>/<index_image_name>-<random_number>
    Copy to Clipboard Toggle word wrap

    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 (ICSP) 对象:

    $ oc create -f <path/to/manifests/dir>/imageContentSourcePolicy.yaml
    Copy to Clipboard Toggle word wrap

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

    注意

    应用 ICSP 会导致集群中的所有 worker 节点重启。在继续操作前,您必须等待此重启过程完成每个 worker 节点的循环。

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

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2026 Red Hat