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


您可以使用广泛可用的 Operator 创建自定义目录,并使用 oc-mirror OpenShift CLI (oc)插件镜像它们。

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

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

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。将内容从连接到互联网的红帽托管的 registry 中镜像到断开连接的镜像 registry 的步骤是相同的,而与您选择的 registry 无关。镜像目录内容后,将每个集群配置为从镜像 registry 中检索此内容。

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

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

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

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

重要

您置备的集群中的每个机器都必须可以访问容器 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.17 --catalogs
  2. 运行以下命令,获取 Red Hat Operator 目录中的 Operator 列表:

    $ oc mirror list operators <--catalog=<catalog_source>> 1
    1
    指定目录源,如 registry.redhat.io/redhat/redhat-operator-index:v4.17quay.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.17 --package=amq-broker-rhel8
    2. 运行以下命令,获取频道中的版本列表:

      $ oc mirror list operators --catalog=registry.redhat.io/redhat/redhat-operator-index:v4.17 --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.17
          type: ocp
      operators:
      - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.17
        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.17 3
        packages:
        - name: amq-broker-rhel8 4
          channels:
          - name: 7.11.x 5

    1
    设置保存镜像设置元数据的后端位置。此位置可以是 registry 或本地目录。必须指定 storageConfig 值。
    2
    设置存储后端的 registry 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.17
    packages:
      - name: elasticsearch-operator
        minVersion: '2.4.0'

mirror.operators.catalog

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

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

mirror.operators.full

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

布尔值.默认值为 false

mirror.operators.packages

Operator 软件包配置。

对象数组。例如:

operators:
  - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.17
    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.17

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. 配置 CRI-O,为 Operator 使用 registry 镜像

您必须使用 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 github 目录中。

流程

  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. 运行以下命令,应用来自结果目录中的目录源配置文件来创建目录源对象:

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