4.8.2.3. 更新软件包清单格式目录镜像

集群管理员将 OperatorHub 配置为使用自定义 Operator 目录镜像后,管理员可通过红帽提供的 App Registry 目录获得更新,使其 OpenShift Container Platform 集群与最新的 Operator 保持一致。这可以通过构建和推送新的 Operator 目录镜像,然后将 CatalogSource 对象中现有的 spec.image 参数替换为新镜像摘要。

在本例中,该流程假设已配置了自定义 redhat-operators 目录镜像,以便与 OperatorHub 搭配使用。

注意

只有 oc 客户端的 Linux 版本可用于此流程,因为 Windows 和 macOS 版本不提供 oc adm catalog build 命令。

先决条件

  • 没有网络访问限制的工作站
  • oc 版本 4.3.5+ Linux 客户端
  • podman 版本 1.9.3+
  • 访问支持 Docker v2-2 的镜像(mirror)registry

    重要

    OpenShift Container Platform 集群的内部 registry 不能用作目标 registry,因为它不支持没有标签的推送(在镜像过程中需要这个功能)。

  • OperatorHub 配置为使用自定义目录镜像
  • 如果您正在使用私有 registry,请将 REG_CREDS 环境变量设置为到 registry 凭证的文件路径。例如,对于 podman CLI:

    $ REG_CREDS=${XDG_RUNTIME_DIR}/containers/auth.json
  • 如果您正在使用 quay.io 帐户可访问的私有命名空间,您必须设置 Quay 身份验证令牌。使用您的 quay.io 凭证对登录 API 发出请求,从而设置用于 --auth-token 标志的 AUTH_TOKEN 环境变量:

    $ AUTH_TOKEN=$(curl -sH "Content-Type: application/json" \
        -XPOST https://quay.io/cnr/api/v1/users/login -d '
        {
            "user": {
                "username": "'"<quay_username>"'",
                "password": "'"<quay_password>"'"
            }
        }' | jq -r '.token')

流程

  1. 在没有网络访问限制的工作站中,与目标镜像(mirror) registry 进行身份验证:

    $ podman login <registry_host_name>
  2. 使用 registry.redhat.io 进行身份验证,以便在构建期间拉取基础镜像:

    $ podman login registry.redhat.io
  3. 根据 Quay.io 中的 redhat-operators 目录构建新目录镜像,标记并将其推送到您的镜像 registry:

    $ oc adm catalog build \
        --appregistry-org redhat-operators \1
        --from=registry.redhat.io/openshift4/ose-operator-registry:v4.7 \2
        --filter-by-os="linux/amd64" \3
        --to=<registry_host_name>:<port>/olm/redhat-operators:v2 \4
        [-a ${REG_CREDS}] \5
        [--insecure] \6
        [--auth-token "${AUTH_TOKEN}"] 7
    1
    从 App Registry 实例中拉取的机构(命名空间)。
    2
    使用与目标 OpenShift Container Platform 集群主版本和次版本匹配的标签将 --from 设置为 Operator Registry 基础镜像。
    3
    --filter-by-os 设置为用于基本镜像的操作系统和架构,该镜像必须与目标 OpenShift Container Platform 集群匹配。有效值是 linux/amd64linux/ppc64lelinux/s390x
    4
    为您的目录镜像命名并包含一个标签,例如: v2 ,因为它是更新的目录。
    5
    可选:如果需要,指定 registry 凭证文件的位置。
    6
    可选:如果您不想为目标 registry 配置信任,请添加 --insecure 标志。
    7
    可选:如果使用其他不公开的应用程序 registry 目录,则需要指定 Quay 身份验证令牌。

    输出示例

    INFO[0013] loading Bundles                               dir=/var/folders/st/9cskxqs53ll3wdn434vw4cd80000gn/T/300666084/manifests-829192605
    ...
    Pushed sha256:f73d42950021f9240389f99ddc5b0c7f1b533c054ba344654ff1edaf6bf827e3 to example_registry:5000/olm/redhat-operators:v2

  4. 将目录镜像 (mirror) 到目标 registry。以下 oc adm catalog mirror 命令提取自定义 Operator catalog 镜像的内容,以生成镜像 (mirror) 和把镜像(image)镜像 (mirror)到 registry 所需的清单:

    $ oc adm catalog mirror \
        <registry_host_name>:<port>/olm/redhat-operators:v2 \ 1
        <registry_host_name>:<port> \ 2
        [-a ${REG_CREDS}] \ 3
        [--insecure] \ 4
        [--index-filter-by-os='<platform>/<arch>'] 5
    1
    指定新 Operator 目录镜像。
    2
    指定目标 registry 的完全限定域名(FQDN)。
    3
    可选:如果需要,指定 registry 凭证文件的位置。
    4
    可选:如果您不想为目标 registry 配置信任,请添加 --insecure 标志。
    5
    可选:在有多个变体可用时,指定目录镜像的平台和架构。镜像被传递为 '<platform>/<arch>[/<variant>]'。这不适用于目录镜像引用的镜像。有效值是 linux/amd64linux/ppc64lelinux/s390x
  5. 应用新生成的清单:

    $ oc replace -f ./manifests-redhat-operators-<random_number>
    重要

    您可能不需要应用 imageContentSourcePolicy.yaml 清单。对文件进行一个 diff 操作来决定是否需要改变。

  6. 更新 CatalogSource 对象以引用您的目录镜像。

    1. 如果您有此 CatalogSource 对象的原始 catalogsource.yaml 文件:

      1. 编辑 catalogsource.yaml 文件,在 spec.image 字段中引用新目录镜像 :

        apiVersion: operators.coreos.com/v1alpha1
        kind: CatalogSource
        metadata:
          name: my-operator-catalog
          namespace: openshift-marketplace
        spec:
          sourceType: grpc
          image: <registry_host_name>:<port>/olm/redhat-operators:v2 1
          displayName: My Operator Catalog
          publisher: grpc
        1
        指定新 Operator 目录镜像。
      2. 使用更新的文件替换 CatalogSource 对象:

        $ oc replace -f catalogsource.yaml
    2. 或者,使用以下命令编辑目录源,在 spec.image 参数中引用您的新目录镜像 :

      $ oc edit catalogsource <catalog_source_name> -n openshift-marketplace

现在,OpenShift Container Platform 集群上的 OperatorHub 页中应可以提供更新的 Operator。