8.3. 使用 oc-mirror 插件创建自定义目录


您可以使用 oc-mirror OpenShift CLI (oc)插件创建带有广泛可用 Operator 的自定义目录,并对其进行镜像。

8.3.1. 使用红帽提供的 Operator 目录和镜像 registry

您可以使用 oc-mirror OpenShift CLI (oc)插件过滤和修剪目录以获取特定的 Operator 并进行镜像。您还可以在断开连接的设置中使用 Operator,或嵌入 Red Hat Enterprise Linux for Edge (RHEL for Edge)镜像中。要了解有关如何为镜像配置您的系统的更多详细信息,请使用以下"Additional resources"部分中的链接。如果您已准备好从红帽提供的 Operator 目录、镜像或将其嵌入到 RHEL for Edge 镜像中,请从以下部分开始,"使用 oc-mirror 插件创建目录内容"。

8.3.2. 关于用于创建镜像 registry 的 oc-mirror 插件

您可以使用 MicroShift 的 oc-mirror OpenShift CLI (oc)插件来过滤和修剪 Operator 目录。然后,您可以将过滤的目录内容镜像到镜像 registry,或使用 RHEL for Edge 的断开连接的或离线部署中的容器镜像。

注意

MicroShift 使用 oc-mirror 插件的通用版本(1)。不要在 oc-mirror 插件的技术预览版本(2)中使用以下步骤。

您可以在本地将所需 Operator 所需的容器镜像镜像,或镜像到支持 Docker v2-2 (如 Red Hat Quay)的容器镜像。从连接到互联网到断开连接的镜像 registry 的 Red Hat 托管 registry 镜像内容的过程与您选择的 registry 无关。镜像目录内容后,将每个集群配置为从您的镜像 registry 中检索此内容。

8.3.2.1. 填充镜像 registry 时的连接注意事项

在填充 registry 时,您可以使用以下连接场景之一:

连接的镜像
如果您的主机可以同时访问互联网和您的镜像 registry,但不能访问您的集群节点,您可以直接从该机器中镜像内容。
断开连接的镜像

如果您没有可同时访问互联网和您的镜像 registry 的主机,您必须将镜像镜像(mirror)到文件系统中,然后将该主机或可移动介质置于断开连接的环境中。

重要

容器 registry 必须可以被您置备的集群中的每个机器访问。如果 registry 无法访问,则安装、更新和其他操作(如重新定位工作负载)可能会失败。

为了避免由无法访问的 registry 造成的问题,请使用以下标准实践:

  • 以高可用性方式运行镜像 registry。
  • 确保镜像 registry 至少与集群的生产环境可用性匹配。

8.3.2.2. 使用 oc-mirror 插件检查目录内容

使用以下示例流程选择目录并列出可用 OpenShift Container Platform 内容的 Operator,以添加到 oc-mirror 插件镜像设置配置文件中。

注意

如果使用自己的目录和 Operator,您可以将镜像直接推送到内部 registry。

先决条件

  • 已安装 OpenShift CLI (oc)。
  • 已安装 Operator Lifecycle Manager (OLM)。
  • 已安装 oc-mirror OpenShift CLI (oc)插件。

流程

  1. 运行以下命令,获取可用红帽提供的 Operator 目录列表来过滤:

    $ oc mirror list operators --version 4.15 --catalogs
  2. 运行以下命令,获取 Red Hat Operator 目录中的 Operator 列表:

    $ oc mirror list operators <--catalog=<catalog_source>> 1
    1
    指定目录源,如 registry.redhat.io/redhat/redhat-operator-index:v4.15quay.io/operatorhubio/catalog:latest
  3. 选择一个 Operator。在本例中,选择了 amq-broker-rhel8
  4. 可选: 要检查您要过滤的 Operator 的频道和版本,请输入以下命令:

    1. 运行以下命令来获取频道列表:

      $ oc mirror list operators --catalog=registry.redhat.io/redhat/redhat-operator-index:v4.15 --package=amq-broker-rhel8
    2. 运行以下命令,获取频道中的版本列表:

      $ oc mirror list operators --catalog=registry.redhat.io/redhat/redhat-operator-index:v4.15 --package=amq-broker-rhel8 --channel=7.11.x

后续步骤

  • 使用此流程中收集的信息创建和编辑镜像设置配置文件。
  • 将转换的镜像设置配置文件镜像到镜像 registry 或磁盘。

8.3.2.3. 创建镜像设置配置文件

您必须创建一个镜像设置配置文件,以使用 oc-mirror 插件镜像目录内容。镜像设置配置文件定义了哪些 Operator 与 oc-mirror 插件的其他配置设置一起镜像。生成默认镜像集文件后,您必须编辑内容,以便剩余的条目与 MicroShift 和您计划使用的 Operator 兼容。

您必须在镜像设置配置文件中指定存储后端。此存储后端可以是本地目录或支持 Docker v2-2 的 registry。oc-mirror 插件在创建镜像的过程中将元数据存储在这个存储后端中。

重要

不要删除或修改 oc-mirror 插件生成的元数据。每次针对同一镜像 registry 运行 oc-mirror 插件时,都必须使用相同的存储后端。

先决条件

流程

  1. 使用 oc mirror init 命令为镜像设置配置创建模板,并将其保存到名为 imageset-config.yaml 的文件中:

    $ oc mirror init <--registry <storage_backend> > imageset-config.yaml 1
    1
    指定存储后端的位置,如 example.com/mirror/oc-mirror-metadata

    默认镜像设置配置文件示例

    kind: ImageSetConfiguration
    apiVersion: mirror.openshift.io/v1alpha2
    storageConfig:
      registry:
        imageURL: registry.example.com/oc-mirror
        skipTLS: false
    mirror:
      platform: 1
        channels:
        - name: stable-4.15
          type: ocp
      operators:
      - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15
        packages:
        - name: serverless-operator
          channels:
          - name: stable
      additionalImages: 2
      - name: registry.redhat.io/ubi8/ubi:latest
      helm: {} 3

    1
    MicroShift 不支持 platform 字段和相关字段,必须被删除。
    2
    指定要在镜像集中包含的任何其他镜像。如果不需要指定其他镜像,请删除此字段。
    3
    MicroShift 不支持 Helm,必须被删除。
  2. 编辑镜像设置配置文件的值,以满足您要镜像的 MicroShift 和 Operator 的要求,如下例所示:

    编辑 MicroShift 镜像设置配置文件示例

    kind: ImageSetConfiguration
    apiVersion: mirror.openshift.io/v1alpha2
    storageConfig: 1
      registry:
        imageURL: <storage_backend> 2
        skipTLS: false
    mirror:
      operators:
      - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 3
        packages:
        - name: amq-broker-rhel8 4
          channels:
          - name: 7.11.x 5

    1
    设置保存镜像设置元数据的后端位置。此位置可以是 registry 或本地目录。必须指定 storageConfig 值。
    2
    设置存储后端的注册表 URL,如 <example.com/mirror/oc-mirror-metadata
    3
    将 Operator 目录设置为从中检索镜像。
    4
    指定要包含在镜像集中的 Operator 软件包。删除此字段以检索目录中的所有软件包。
    5
    仅指定要包含在镜像集中的 Operator 软件包的某些频道。即使您没有使用该频道中的捆绑包,还必须始终包含 Operator 软件包的默认频道。您可以运行以下命令来找到默认频道:oc mirror list operators --catalog=<catalog_name> --package=<package_name>
  3. 保存更新的文件。

后续步骤

  • 使用 oc-mirror 插件将镜像直接设置为目标镜像 registry。
  • 配置 CRI-O。
  • 将目录源应用到集群。
8.3.2.3.1. 镜像设置配置参数

oc-mirror 插件需要一个镜像设置配置文件,该文件定义哪些镜像要镜像(mirror)。下表列出了 ImageSetConfiguration 资源的可用参数。

表 8.2. ImageSetConfiguration 参数
参数描述

apiVersion

ImageSetConfiguration 内容的 API 版本。

字符串.例如: mirror.openshift.io/v1alpha2

mirror

镜像集的配置。

对象

mirror.additionalImages

镜像集的额外镜像配置。

对象数组。例如:

additionalImages:
  - name: registry.redhat.io/ubi8/ubi:latest

mirror.additionalImages.name

要 mirror 的镜像的标签或摘要。

字符串.例如: registry.redhat.io/ubi8/ubi:latest

mirror.blockedImages

阻止 mirror 的镜像的完整标签、摘要或模式。

字符串数组。例如: docker.io/library/alpine

mirror.operators

镜像集的 Operator 配置。

对象数组。例如:

operators:
  - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15
    packages:
      - name: elasticsearch-operator
        minVersion: '2.4.0'

mirror.operators.catalog

包括在镜像集中的 Operator 目录。

字符串.例如:registry.redhat.io/redhat/redhat-operator-index:v4.15

mirror.operators.full

true 时,下载完整的目录、Operator 软件包或 Operator 频道。

布尔值.默认值为 false

mirror.operators.packages

Operator 软件包配置。

对象数组。例如:

operators:
  - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15
    packages:
      - name: elasticsearch-operator
        minVersion: '5.2.3-31'

mirror.operators.packages.name

镜像集中要包含的 Operator 软件包名称

字符串.例如: elasticsearch-operator

mirror.operators.packages.channels

Operator 软件包频道配置。

对象

mirror.operators.packages.channels.name

Operator 频道名称(软件包中唯一)要包括在镜像集中。

字符串.例如:faststable-v4.15

mirror.operators.packages.channels.maxVersion

Operator 镜像的最高版本,在其中存在所有频道。详情请查看以下备注。

字符串.例如: 5.2.3-31

mirror.operators.packages.channels.minBundle

要包含的最小捆绑包的名称,以及频道头更新图中的所有捆绑包。仅在命名捆绑包没有语义版本元数据时设置此字段。

字符串.例如: bundleName

mirror.operators.packages.channels.minVersion

Operator 的最低版本,用于镜像存在的所有频道。详情请查看以下备注。

字符串.例如: 5.2.3-31

mirror.operators.packages.maxVersion

Operator 最高版本,可跨所有存在的频道进行镜像。详情请查看以下备注。

字符串.例如: 5.2.3-31

mirror.operators.packages.minVersion

Operator 的最低版本,用于镜像存在的所有频道。详情请查看以下备注。

字符串.例如: 5.2.3-31

mirror.operators.skipDependencies

如果为 true,则不会包含捆绑包的依赖项。

布尔值.默认值为 false

mirror.operators.targetCatalog

要镜像引用的目录的替代名称和可选命名空间层次结构。

字符串.例如:my-namespace/my-operator-catalog

mirror.operators.targetName

将引用的目录镜像为。

targetName 参数已弃用。改为使用 targetCatalog 参数。

字符串.例如: my-operator-catalog

mirror.operators.targetTag

附加到 targetNametargetCatalog 的替代标签。

字符串.例如: v1

storageConfig

镜像集的后端配置。

对象

storageConfig.local

镜像集的本地后端配置。

对象

storageConfig.local.path

包含镜像设置元数据的目录路径。

字符串.例如: ./path/to/dir/

storageConfig.registry

镜像集的 registry 后端配置。

对象

storageConfig.registry.imageURL

后端 registry URI。可以选择在 URI 中包含命名空间引用。

字符串.例如: quay.io/myuser/imageset:metadata

storageConfig.registry.skipTLS

(可选)跳过引用的后端 registry 的 TLS 验证。

布尔值.默认值为 false

注意

使用 minVersionmaxVersion 属性过滤特定 Operator 版本范围可能会导致多个频道头错误。错误消息指出 有多个频道头。这是因为当应用过滤器时,Operator 的更新图表会被截断。

Operator Lifecycle Manager 要求每个 Operator 频道都包含一个端点组成更新图表的版本,即 Operator 的最新版本。应用过滤器范围时,该图可切换到两个或多个独立图形或具有多个端点的图形。

要避免这个错误,请不要过滤 Operator 的最新版本。如果您仍然遇到错误,具体取决于 Operator,则必须增加 maxVersion 属性,或者 minVersion 属性必须减少。因为每个 Operator 图都可以不同,所以您可能需要调整这些值,直到错误解决为止。

其他资源

8.3.2.4. 镜像(mirror)到镜像(mirror)的镜像

您可以使用 oc-mirror 插件将镜像直接设置为在镜像设置过程中可访问的目标镜像 registry。

您必须在镜像设置配置文件中指定存储后端。这个存储后端可以是本地目录或 Docker v2 registry。oc-mirror 插件在创建镜像的过程中将元数据存储在这个存储后端中。

重要

不要删除或修改 oc-mirror 插件生成的元数据。每次针对同一镜像 registry 运行 oc-mirror 插件时,都必须使用相同的存储后端。

先决条件

  • 您可以访问互联网来获取所需的容器镜像。
  • 已安装 OpenShift CLI(oc)。
  • 已安装 oc-mirror CLI 插件。
  • 您已创建了镜像设置配置文件。

流程

  • 运行 oc mirror 命令将指定镜像集配置中的镜像镜像到指定的 registry:

    $ oc mirror --config=./<imageset-config.yaml> \1
      docker://registry.example:5000             2
    1
    指定您创建的镜像设置配置文件。例如,imageset-config.yaml
    2
    指定要镜像设置文件的 registry。registry 必须以 docker:// 开头。如果为镜像 registry 指定顶层命名空间,则必须在后续执行时使用此命名空间。

输出示例

Rendering catalog image "registry.example.com/redhat/redhat-operator-index:v{ocp-version}" with file-based catalog

验证

  1. 进入生成的 oc-mirror-workspace/ 目录。
  2. 导航到结果目录,例如,results-1639608409/
  3. 验证 ImageContentSourcePolicyCatalogSource 资源是否存在 YAML 文件。
重要

ImageContentSourcePolicy YAML 文件用作在 MicroShift 中手动配置 CRI-O 的参考内容。您无法将资源直接应用到 MicroShift 集群。

后续步骤

  • 转换 ImageContentSourcePolicy YAML 内容,用于手动配置 CRI-O。
  • 如果需要,将镜像从 mirror 镜像到磁盘,以便断开连接或离线使用。
  • 配置集群以使用 oc-mirror 生成的资源。

故障排除

8.3.2.5. 为 Operator 使用 registry 镜像配置 CRI-O

您必须将通过 oc-mirror 插件创建的 imageContentSourcePolicy.yaml 文件转换为与 MicroShift 使用的 CRI-O 容器运行时配置兼容的格式。

先决条件

  • 已安装 OpenShift CLI (oc)。
  • 已安装 Operator Lifecycle Manager (OLM)。
  • 已安装 oc-mirror OpenShift CLI (oc)插件。
  • 已安装 yq 二进制文件。
  • ImageContentSourcePolicyCatalogSource YAML 文件包括在 oc-mirror-workspace/results explained 目录中。

流程

  1. 运行以下命令确认 imageContentSourcePolicy.yaml 文件的内容:

    $ cat oc-mirror-workspace/<results-directory>/imageContentSourcePolicy.yaml 1
    1
    指定 结果 目录名称,如 < results-1707148826 >。

    输出示例

    apiVersion: operator.openshift.io/v1alpha1
    kind: ImageContentSourcePolicy
    metadata:
      labels:
        operators.openshift.org/catalog: "true"
      name: operator-0
    spec:
      repositoryDigestMirrors:
      - mirrors:
        - registry.<example.com>/amq7
        source: registry.redhat.io/amq7

  2. 运行以下命令,将 imageContentSourcePolicy.yaml 转换为 CRI-O 配置的格式:

    yq '.spec.repositoryDigestMirrors[] as $item ireduce([]; . + [{"mirror": $item.mirrors[], "source": ($item | .source)}]) | .[] |
      "[[registry]]
          prefix = \"" + .source + "\"
          location = \"" + .mirror + "\"
          mirror-by-digest-only = true
          insecure = true
          "' ./icsp.yaml

    输出示例

    [[registry]]
          prefix = "registry.redhat.io/amq7"
          location = "registry.example.com/amq7"
          mirror-by-digest-only = true
          insecure = true

  3. 将输出添加到 /etc/containers/registries.conf.d/ 目录中的 CRI-O 配置文件中:

    crio-config.yaml 镜像配置文件示例

    [[registry]]
          prefix = "registry.redhat.io/amq7"
          location = "registry.example.com/amq7"
          mirror-by-digest-only = true
          insecure = true
    
    [[registry]]
        prefix = ""
        location = "quay.io"
        mirror-by-digest-only = true
    [[registry.mirror]]
        location = "<registry_host>:<port>" 1
        insecure = false

    1
    指定镜像 registry 服务器的主机名和端口,如 microshift-quay:8443
  4. 使用以下命令重启 MicroShift 来应用 CRI-O 配置更改:

    $ sudo systemctl restart crio

8.3.2.6. 安装使用 oc-mirror 插件创建的自定义目录

将镜像设置为镜像 registry 后,您必须将生成的 CatalogSource 自定义资源(CR)应用到集群。Operator Lifecycle Manager (OLM)使用 CatalogSource CR 来检索有关镜像 registry 中可用 Operator 的信息。然后,您必须创建并应用订阅 CR 来订阅自定义目录。

先决条件

  • 您已将镜像设置为 registry 镜像。
  • 您已将镜像引用信息添加到 CRI-O 容器运行时配置中。

流程

  1. 运行以下命令,从 results 目录中应用目录源配置文件来创建目录源对象:

    $ oc apply -f ./oc-mirror-workspace/results-1708508014/catalogSource-cs-redhat-operator-index.yaml

    目录源配置文件示例

    apiVersion: operators.coreos.com/v1alpha1
    kind: CatalogSource
    metadata:
      name: redhat-catalog
      namespace: openshift-marketplace 1
    spec:
      sourceType: grpc
      image: registry.example.com/redhat/redhat-operator-index:v4.15
      updateStrategy:
        registryPoll:
          interval: 60m

    1
    指定全局命名空间。将 metadata.namespace 设置为 openshift-marketplace 可让目录引用所有命名空间中的目录。任何命名空间中的订阅可以引用 openshift-marketplace 命名空间中创建的目录。

    输出示例

    catalogsource.operators.coreos.com/cs-redhat-operator-index created

  2. 运行以下命令验证 CatalogSource 资源是否已成功安装:

    $ oc get catalogsource --all-namespaces
  3. 使用以下命令验证目录源是否正在运行:

    $ oc get pods -n openshift-marketplace

    输出示例

    NAME                             READY   STATUS    RESTARTS   AGE
    cs-redhat-operator-index-4227b   2/2     Running   0          2m5s

  4. 创建一个 Subscription CR,类似以下示例:

    Subscription CR 示例

    apiVersion: operators.coreos.com/v1alpha1
    kind: Subscription
    metadata:
      name: amq-broker
      namespace: openshift-operators
    spec:
      channel: 7.11.x
      name: amq-broker-rhel8
      source: cs-redhat-operator-index
      sourceNamespace: openshift-marketplace

  5. 运行以下命令来应用 Subscription CR 配置:

    $ oc apply -f ./<my-subscription-cr.yaml> 1
    1
    指定订阅的名称,如 my-subscription-cr.yaml

    输出示例

    subscription.operators.coreos.com/amq-broker created

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.