×

Operator Lifecycle Manager (OLM) v1 仅为技术预览功能。技术预览功能不受 Red Hat 生产服务级别协议 (SLA) 的支持,并且功能可能不完整。Red Hat 不建议在生产环境中使用它们。这些功能可让客户提前访问即将推出的产品功能,从而能够在开发过程中测试功能并提供反馈。

有关 Red Hat 技术预览功能的支持范围的更多信息,请参见 技术预览功能支持范围

目录维护人员可以创建基于文件的目录格式的新目录,以便与 OpenShift Container Platform 上的 Operator Lifecycle Manager (OLM) v1 一起使用。

目前,Operator Lifecycle Manager (OLM) v1 无法验证私有注册表(例如 Red Hat 提供的 Operator 目录)。这是一个已知问题。因此,依赖于安装 Red Hat Operators 目录的 OLM v1 流程无法运行。(OCPBUGS-36364

创建基于文件的目录映像

您可以使用 opm CLI 创建一个使用纯文本 *基于文件的目录* 格式(JSON 或 YAML)的目录映像,该格式替换了已弃用的 SQLite 数据库格式。

先决条件
  • 您已安装 opm CLI。

  • 您的 podman 版本为 1.9.3+。

  • 捆绑包映像已构建并推送到支持 Docker v2-2 的注册表。

步骤
  1. 初始化目录

    1. 通过运行以下命令创建目录的目录:

      $ mkdir <catalog_dir>
    2. 通过运行 opm generate dockerfile 命令生成可以构建目录映像的 Dockerfile。

      $ opm generate dockerfile <catalog_dir> \
          -i registry.redhat.io/openshift4/ose-operator-registry-rhel9:v4.17 (1)
      1 使用 -i 标志指定官方 Red Hat 基础映像,否则 Dockerfile 使用默认的上游映像。

      Dockerfile 必须与您在上一步中创建的目录目录位于同一父目录中。

      示例目录结构
      . (1)
      ├── <catalog_dir> (2)
      └── <catalog_dir>.Dockerfile (3)
      1 父目录
      2 目录目录
      3 opm generate dockerfile 命令生成的 Dockerfile
    3. 通过运行 opm init 命令使用您的 Operator 的包定义填充目录。

      $ opm init <operator_name> \ (1)
          --default-channel=preview \ (2)
          --description=./README.md \ (3)
          --icon=./operator-icon.svg \ (4)
          --output yaml \ (5)
          > <catalog_dir>/index.yaml (6)
      1 Operator 或包名称
      2 如果未指定,订阅默认使用的通道
      3 Operator 的 README.md 或其他文档的路径
      4 Operator 图标的路径
      5 输出格式:JSON 或 YAML
      6 创建目录配置文件的路径

      此命令在指定的目录配置文件中生成 olm.package 声明性配置 Blob。

  2. 通过运行 opm render 命令将捆绑包添加到目录。

    $ opm render <registry>/<namespace>/<bundle_image_name>:<tag> \ (1)
        --output=yaml \
        >> <catalog_dir>/index.yaml (2)
    1 捆绑包映像的拉取规范
    2 目录配置文件的路径

    通道必须至少包含一个捆绑包。

  3. 为捆绑包添加通道条目。例如,将以下示例修改为您的规格,并将其添加到您的 <catalog_dir>/index.yaml 文件中。

    示例通道条目
    ---
    schema: olm.channel
    package: <operator_name>
    name: preview
    entries:
      - name: <operator_name>.v0.1.0 (1)
    1 确保在版本中的 v 之前但在 <operator_name> 之后包含句点 (.)。否则,该条目将无法通过 opm validate 命令。
  4. 验证基于文件的目录

    1. 对目录运行opm validate命令

      $ opm validate <catalog_dir>
    2. 检查错误代码是否为0

      $ echo $?
      示例输出
      0
  5. 运行podman build命令构建目录镜像

    $ podman build . \
        -f <catalog_dir>.Dockerfile \
        -t <registry>/<namespace>/<catalog_image_name>:<tag>
  6. 将目录镜像推送到注册表

    1. 如果需要,运行podman login命令对目标注册表进行身份验证

      $ podman login <registry>
    2. 运行podman push命令推送目录镜像

      $ podman push <registry>/<namespace>/<catalog_image_name>:<tag>
其他资源

更新或过滤基于文件的目录镜像

您可以使用opm CLI 更新或过滤使用基于文件目录格式的目录镜像。通过提取现有目录镜像的内容,您可以根据需要修改目录,例如:

  • 添加软件包

  • 删除软件包

  • 更新现有软件包条目

  • 详细说明每个软件包、通道和捆绑包的弃用消息

然后,您可以将镜像重新构建为目录的更新版本。

或者,如果您已经在镜像注册表中拥有目录镜像,则可以使用 oc-mirror CLI 插件在将目录镜像镜像到目标注册表的同时,自动从更新的源版本目录镜像中修剪任何已删除的镜像。

有关 oc-mirror 插件和此用例的更多信息,请参阅“使用 oc-mirror 插件镜像断开连接的安装的镜像”中的“保持镜像注册表内容更新”部分,特别是“修剪镜像”小节。

先决条件
  • 您的工作站上有以下内容:

    • opm CLI。

    • podman 版本 1.9.3+。

    • 基于文件的目录镜像。

    • 最近在您的工作站上初始化的与该目录相关的目录目录结构。

      如果您没有初始化的目录目录,请创建目录并生成 Dockerfile。有关更多信息,请参阅“创建基于文件的目录镜像”过程中的“初始化目录”步骤。

步骤
  1. 将目录镜像的内容以 YAML 格式提取到目录目录中的index.yaml文件

    $ opm render <registry>/<namespace>/<catalog_image_name>:<tag> \
        -o yaml > <catalog_dir>/index.yaml

    或者,您可以使用-o json标志以 JSON 格式输出。

  2. 根据您的规范修改生成的index.yaml文件的内容

    假设在目录中发布捆绑包后,您的某个用户已安装它。请确保目录中之前发布的所有捆绑包都具有到当前或更新的通道头的更新路径,以避免使已安装该版本的用户的安装中断。

    • 要添加 Operator,请按照“创建基于文件的目录镜像”过程中创建软件包、捆绑包和通道条目的步骤进行操作。

    • 要删除 Operator,请删除与软件包相关的olm.packageolm.channelolm.bundle blob 集。以下示例显示了必须删除以从目录中删除example-operator软件包的集合:

      已删除的条目示例
      ---
      defaultChannel: release-2.7
      icon:
        base64data: <base64_string>
        mediatype: image/svg+xml
      name: example-operator
      schema: olm.package
      ---
      entries:
      - name: example-operator.v2.7.0
        skipRange: '>=2.6.0 <2.7.0'
      - name: example-operator.v2.7.1
        replaces: example-operator.v2.7.0
        skipRange: '>=2.6.0 <2.7.1'
      - name: example-operator.v2.7.2
        replaces: example-operator.v2.7.1
        skipRange: '>=2.6.0 <2.7.2'
      - name: example-operator.v2.7.3
        replaces: example-operator.v2.7.2
        skipRange: '>=2.6.0 <2.7.3'
      - name: example-operator.v2.7.4
        replaces: example-operator.v2.7.3
        skipRange: '>=2.6.0 <2.7.4'
      name: release-2.7
      package: example-operator
      schema: olm.channel
      ---
      image: example.com/example-inc/example-operator-bundle@sha256:<digest>
      name: example-operator.v2.7.0
      package: example-operator
      properties:
      - type: olm.gvk
        value:
          group: example-group.example.io
          kind: MyObject
          version: v1alpha1
      - type: olm.gvk
        value:
          group: example-group.example.io
          kind: MyOtherObject
          version: v1beta1
      - type: olm.package
        value:
          packageName: example-operator
          version: 2.7.0
      - type: olm.bundle.object
        value:
          data: <base64_string>
      - type: olm.bundle.object
        value:
          data: <base64_string>
      relatedImages:
      - image: example.com/example-inc/example-related-image@sha256:<digest>
        name: example-related-image
      schema: olm.bundle
      ---
    • 要为 Operator 添加或更新弃用消息,请确保在与软件包的index.yaml文件相同的目录中存在deprecations.yaml文件。有关deprecations.yaml文件格式的信息,请参阅“olm.deprecations 模式”。

  3. 保存您的更改。

  4. 验证目录

    $ opm validate <catalog_dir>
  5. 重建目录

    $ podman build . \
        -f <catalog_dir>.Dockerfile \
        -t <registry>/<namespace>/<catalog_image_name>:<tag>
  6. 将更新的目录镜像推送到注册表

    $ podman push <registry>/<namespace>/<catalog_image_name>:<tag>
验证
  1. 在 Web 控制台中,导航到**管理** → **集群设置** → **配置**页面中的 OperatorHub 配置资源。

  2. 添加目录源或更新现有目录源以使用更新的目录镜像的拉取规范。

    有关更多信息,请参阅本节“其他资源”中的“将目录源添加到集群”。

  3. 目录源处于**就绪**状态后,导航到**Operators** → **OperatorHub**页面,并检查您所做的更改是否反映在 Operators 列表中。