4.10. 在受限网络中使用 Operator Lifecycle Manager

对于在受限网络中安装的 OpenShift Container Platform 集群(也称为 断开连接的集群 ),Operator Lifecycle Manager(OLM)默认无法访问托管在远程 registry 上的红帽提供的 OperatorHub 源,因为这些远程源需要足够的互联网连接。

但是,作为集群管理员,如果您有一个有完全互联网访问的工作站,则仍可以让集群在受限网络中使用 OLM。工作站需要完全访问互联网来拉取远程 OperatorHub 内容,用于准备远程源的本地镜像,并将内容推送到镜像 registry。

镜像 registry 可以位于堡垒主机上,它需要连接到您的工作站和断开连接的集群,或者一个完全断开连接的或 airgapped 主机,这需要可移动介质物理将镜像内容移到断开连接的环境中。

本指南描述了在受限网络中启用 OLM 所需的流程:

  • 为 OLM 禁用默认远程 OperatorHub 源。
  • 使用有完全互联网访问的工作站来创建并推送 OperatorHub 内容的本地镜像到镜像 registry。
  • 将 OLM 配置为从镜像 registry 上的本地源而不是默认的远程源安装和管理 Operator。

在受限网络中启用 OLM 后,您可以继续使用不受限制的工作站在发布新版 Operator 时保持本地 OperatorHub 源的更新。

重要

虽然 OLM 可以从本地源管理 Operator,但给定 Operator 在受限网络中成功运行仍取决于 Operator 本身满足以下条件:

  • ClusterServiceVersion (CSV) 对象的 relatedImages参数中列出所有相关的镜像,或 Operator 执行时可能需要的其他容器镜像。
  • 通过摘要 (SHA) 而不是标签来引用所有指定的镜像。

您可以通过使用以下选择过滤,在 Red Hat Ecosystem Catalog 上搜索软件以获取支持以断开连接模式运行的红帽 Operator 列表:

类型

容器化应用程序

部署方法

Operator

基础架构特性

断开连接

4.10.1. 先决条件

  • 以具有 cluster-admin 权限的用户身份登录 OpenShift Container Platform 集群。
  • 如果要修剪默认目录,且只有选择地镜像部分 Operator,请安装 opm CLI
注意

如果您在 IBM Z 上的受限网络中使用 OLM,则必须至少为放置 registry 的目录分配 12 GB 的存储空间。

4.10.2. 禁用默认的 OperatorHub 源

在 OpenShift Container Platform 安装过程中,默认为 OperatorHub 配置由红帽和社区项目提供的源内容的 operator 目录。在受限网络环境中,必须以集群管理员身份禁用默认目录。然后,您可以将 OperatorHub 配置为使用本地目录源。

流程

  • 通过在 OperatorHub 对象中添加 disableAllDefaultSources: true 来 禁用默认目录的源:

    $ oc patch OperatorHub cluster --type json \
        -p '[{"op": "add", "path": "/spec/disableAllDefaultSources", "value": true}]'
提示

或者,您可以使用 Web 控制台管理目录源。在 AdministrationCluster SettingsConfigurationOperatorHub 页面中,点 Sources 选项卡,您可以在其中创建、删除、禁用和启用单独的源。

4.10.3. 过滤基于 SQLite 的索引镜像

基于 Operator Bundle Format 的索引镜像是 Operator 目录的容器化快照。您可以过滤或 prune(修剪)除指定的软件包列表以外的所有索引,创建只包含您想要的 Operator 的源索引副本。

当将 Operator Lifecycle Manager(OLM)配置为在受限网络 OpenShift Container Platform 集群上使用镜像内容时,如果您只想从默认目录中镜像一部分 Operator,请使用此修剪方法。

对于此过程中的步骤,目标 registry 是一个存在的镜像 registry,您的具有无限网络访问权限的工作站可以访问该 registry。本例还显示修剪默认 redhat-operators 目录的索引镜像,但所有索引镜像的过程都是一样的。

先决条件

  • 没有网络访问限制的工作站
  • podman 版本 1.9.3+
  • grpcurl (第三方命令行工具)
  • opm
  • 访问支持 Docker v2-2 的 registry

流程

  1. 通过 registry.redhat.io 进行身份验证:

    $ podman login registry.redhat.io
  2. 通过目标 registry 进行身份验证:

    $ podman login <target_registry>
  3. 确定您要包括在您的修剪索引中的软件包列表。

    1. 运行您要修剪容器中的源索引镜像。例如:

      $ podman run -p50051:50051 \
          -it registry.redhat.io/redhat/redhat-operator-index:v4.10

      输出示例

      Trying to pull registry.redhat.io/redhat/redhat-operator-index:v4.10...
      Getting image source signatures
      Copying blob ae8a0c23f5b1 done
      ...
      INFO[0000] serving registry                              database=/database/index.db port=50051

    2. 在一个单独的终端会话中,使用 grpcurl 命令获取由索引提供的软件包列表:

      $ grpcurl -plaintext localhost:50051 api.Registry/ListPackages > packages.out
    3. 检查 package.out 文件,确定要保留在此列表中的哪个软件包名称。例如:

      软件包列表片断示例

      ...
      {
        "name": "advanced-cluster-management"
      }
      ...
      {
        "name": "jaeger-product"
      }
      ...
      {
      {
        "name": "quay-operator"
      }
      ...

    4. 在您执行 podman run 命令的终端会话中,按 CtrlC 停止容器进程。
  4. 运行以下命令来修剪指定软件包以外的所有源索引:

    $ opm index prune \
        -f registry.redhat.io/redhat/redhat-operator-index:v4.10 \1
        -p advanced-cluster-management,jaeger-product,quay-operator \2
        [-i registry.redhat.io/openshift4/ose-operator-registry:v4.9] \3
        -t <target_registry>:<port>/<namespace>/redhat-operator-index:v4.10 4
    1
    到修剪的索引。
    2
    要保留的软件包用逗号隔开。
    3
    只适用于 IBM Power 和 IBM Z 镜像: Operator Registry 基础镜像和与目标 OpenShift Container Platform 集群主版本和次版本匹配的标签。
    4
    用于正在构建新索引镜像的自定义标签。
  5. 运行以下命令将新索引镜像推送到目标 registry:

    $ podman push <target_registry>:<port>/<namespace>/redhat-operator-index:v4.10

    其中 <namespace> 是 registry 上的任何现有命名空间。例如,您可以创建一个 olm-mirror 命名空间来将所有镜像的内容推送到。

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

有关与断开连接的集群一起使用的 Operator 目录的说明,请参阅为断开连接的安装安装 → 镜像

4.10.5. 在集群中添加目录源

将目录源添加到 OpenShift Container Platform 集群可为用户发现和安装 Operator。集群管理员可以创建一个 CatalogSource 对象来引用索引镜像。OperatorHub 使用目录源来填充用户界面。

先决条件

  • 构建并推送到 registry 的索引镜像。

流程

  1. 创建一个 CatalogSource 对象来引用索引镜像。如果使用 oc adm catalog mirror 命令将目录镜像到目标 registry,您可以使用 manifests 目录中生成的 catalogSource.yaml 文件作为起点。

    1. 根据您的规格修改以下内容,并将它保存为 catalogSource.yaml 文件:

      apiVersion: operators.coreos.com/v1alpha1
      kind: CatalogSource
      metadata:
        name: my-operator-catalog 1
        namespace: openshift-marketplace 2
      spec:
        sourceType: grpc
        image: <registry>/<namespace>/redhat-operator-index:v4.10 3
        displayName: My Operator Catalog
        publisher: <publisher_name> 4
        updateStrategy:
          registryPoll: 5
            interval: 30m
      1
      如果您在上传到 registry 前将内容镜像到本地文件,请从 metadata.name 字段中删除任何反斜杠(/)字符,以避免在创建对象时出现 "invalid resource name" 错误。
      2
      如果您希望目录源对所有命名空间中的用户全局可用,请指定 openshift-marketplace 命名空间。否则,您可以指定一个不同的命名空间来对目录进行作用域并只对该命名空间可用。
      3
      指定索引镜像。如果您在镜像名称后指定了标签,如 :v4.10,则目录源 Pod 会使用镜像 pull 策略 Always,这意味着 pod 始终在启动容器前拉取镜像。如果您指定了摘要,如 @sha256:<id>,则镜像拉取策略为 IfNotPresent,这意味着仅在节点上不存在的镜像时才拉取镜像。
      4
      指定发布目录的名称或机构名称。
      5
      目录源可以自动检查新版本以保持最新。
    2. 使用该文件创建 CatalogSource 对象:

      $ oc apply -f catalogSource.yaml
  2. 确定成功创建以下资源。

    1. 检查 pod:

      $ oc get pods -n openshift-marketplace

      输出示例

      NAME                                    READY   STATUS    RESTARTS  AGE
      my-operator-catalog-6njx6               1/1     Running   0         28s
      marketplace-operator-d9f549946-96sgr    1/1     Running   0         26h

    2. 检查目录源:

      $ oc get catalogsource -n openshift-marketplace

      输出示例

      NAME                  DISPLAY               TYPE PUBLISHER  AGE
      my-operator-catalog   My Operator Catalog   grpc            5s

    3. 检查软件包清单:

      $ oc get packagemanifest -n openshift-marketplace

      输出示例

      NAME                          CATALOG               AGE
      jaeger-product                My Operator Catalog   93s

现在,您可以在 OpenShift Container Platform Web 控制台中通过 OperatorHub 安装 Operator。

4.10.6. 更新基于 SQLite 的索引镜像

在将 OperatorHub 配置为使用引用自定义索引镜像的目录源后,集群管理员可通过将捆绑包镜像添加到索引镜像来保持其集群上的可用 Operator 最新状态。

您可以使用 opm index add 命令来更新存在的索引镜像。对于受限网络,还必须将更新的内容重新镜像到集群。

先决条件

  • opm
  • podman 版本 1.9.3+
  • 构建并推送到 registry 的索引镜像。
  • 引用索引镜像的现有目录源。

流程

  1. 通过添加捆绑包镜像来更新现有索引:

    $ opm index add \
        --bundles <registry>/<namespace>/<new_bundle_image>@sha256:<digest> \1
        --from-index <registry>/<namespace>/<existing_index_image>:<existing_tag> \2
        --tag <registry>/<namespace>/<existing_index_image>:<updated_tag> \3
        --pull-tool podman 4
    1
    --bundles 标志指定要添加到索引中的、以逗号分隔的额外捆绑包镜像列表。
    2
    --from-index 标志指定之前推送的索引。
    3
    --tag 标志指定要应用到更新的索引镜像的镜像标签。
    4
    --pull-tool 标志指定用于拉取容器镜像的工具。

    其中:

    <registry>
    指定 registry 的主机名,如 quay.iomirror.example.com
    <namespace>
    指定 registry 的命名空间,如 ocs-devabc
    <new_bundle_image>
    指定要添加到 registry 的新捆绑包镜像,如 ocs-operator
    <digest>
    指定捆绑包镜像的 SHA 镜像 ID 或摘要,如 c7f11097a628f092d8bad148406aa0e0951094a03445fd4bc0775431ef683a41
    <existing_index_image>
    指定之前推送的镜像,如 abc-redhat-operator-index
    <existing_tag>
    指定之前推送的镜像标签,如 4.10
    <updated_tag>
    指定要应用到更新的索引镜像的镜像标签,如 4.10.1

    示例命令

    $ opm index add \
        --bundles quay.io/ocs-dev/ocs-operator@sha256:c7f11097a628f092d8bad148406aa0e0951094a03445fd4bc0775431ef683a41 \
        --from-index mirror.example.com/abc/abc-redhat-operator-index:4.10 \
        --tag mirror.example.com/abc/abc-redhat-operator-index:4.10.1 \
        --pull-tool podman

  2. 推送更新的索引镜像:

    $ podman push <registry>/<namespace>/<existing_index_image>:<updated_tag>
  3. 按照镜像 Operator 目录流程中的步骤来镜像更新的内容。但是,当进入创建 ImageContentSourcePolicy(ICSP)对象的步骤时,请使用 oc replace 命令而不是 oc create 命令。例如:

    $ oc replace -f ./manifests-redhat-operator-index-<random_number>/imageContentSourcePolicy.yaml

    这一更改是必需的,因为对象已存在且必须更新。

    注意

    通常,oc apply 命令可用于更新之前使用 oc apply 创建的现有对象。但是,由于有关 ICSP 对象中的 metadata.annotations 字段大小的已知问题,oc replace 命令当前必须用于此步骤。

  4. Operator Lifecycle Manager(OLM)会在常规时间段内自动轮询目录源中引用的索引镜像,验证是否已成功添加新软件包:

    $ oc get packagemanifests -n openshift-marketplace