4.9. 在受限网络中使用 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 本身。Operator 必须:
-
在
ClusterServiceVersion
(CSV) 对象的relatedImages
参数中列出所有相关的镜像,或 Operator 执行时可能需要的其他容器镜像。 - 通过摘要 (SHA) 而不是标签来引用所有指定的镜像。
您可以通过选择 Infrastucture Features 下的 Disconnected 过滤器,在 Red Hat Ecosystem Catalog 中搜索支持以断开连接模式运行的红帽 Operator 列表:
4.9.1. 先决条件
-
以具有
cluster-admin
权限的用户身份登录 OpenShift Container Platform 集群。 -
如果要修剪默认目录,且只有选择地镜像部分 Operator,请安装
opm
CLI。
如果您在 IBM Z 上的受限网络中使用 OLM,则必须至少为放置 registry 的目录分配 12 GB 的存储空间。
4.9.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 控制台管理目录源。在 Administration
4.9.3. 修剪索引镜像
基于 Operator Bundle Format 的索引镜像是 Operator 目录的容器化快照。您可以修剪除指定的软件包列表以外的所有索引,创建只包含您想要的 Operator 的源索引副本。
当将 Operator Lifecycle Manager(OLM)配置为在受限网络 OpenShift Container Platform 集群上使用镜像内容时,如果您只想从默认目录中镜像一部分 Operator,请使用此修剪方法。
对于此过程中的步骤,目标 registry 是一个存在的镜像 registry,您的具有无限网络访问权限的工作站可以访问该 registry。本例还显示修剪默认 redhat-operators
目录的索引镜像,但所有索引镜像的过程都是一样的。
先决条件
- 没有网络访问限制的工作站
-
podman
版本 1.9.3+ -
grpcurl
(第三方命令行工具) -
opm
版本 1.18.0+ 访问支持 Docker v2-2 的 registry
重要OpenShift Container Platform 集群的内部 registry 不能用作目标 registry,因为它不支持没有标签的推送(在镜像过程中需要这个功能)。
流程
通过
registry.redhat.io
进行身份验证:$ podman login registry.redhat.io
通过目标 registry 进行身份验证:
$ podman login <target_registry>
确定您要包括在您的修剪索引中的软件包列表。
运行您要修剪容器中的源索引镜像。例如:
$ podman run -p50051:50051 \ -it registry.redhat.io/redhat/redhat-operator-index:v4.8
输出示例
Trying to pull registry.redhat.io/redhat/redhat-operator-index:v4.8... Getting image source signatures Copying blob ae8a0c23f5b1 done ... INFO[0000] serving registry database=/database/index.db port=50051
在一个单独的终端会话中,使用
grpcurl
命令获取由索引提供的软件包列表:$ grpcurl -plaintext localhost:50051 api.Registry/ListPackages > packages.out
检查
package.out
文件,确定要保留在此列表中的哪个软件包名称。例如:软件包列表片断示例
... { "name": "advanced-cluster-management" } ... { "name": "jaeger-product" } ... { { "name": "quay-operator" } ...
-
在您执行
podman run
命令的终端会话中,按 Ctrl 和 C 停止容器进程。
运行以下命令来修剪指定软件包以外的所有源索引:
$ opm index prune \ -f registry.redhat.io/redhat/redhat-operator-index:v4.8 \1 -p advanced-cluster-management,jaeger-product,quay-operator \2 [-i registry.redhat.io/openshift4/ose-operator-registry:v4.8] \3 -t <target_registry>:<port>/<namespace>/redhat-operator-index:v4.8 4
运行以下命令将新索引镜像推送到目标 registry:
$ podman push <target_registry>:<port>/<namespace>/redhat-operator-index:v4.8
其中
<namespace>
是 registry 上的任何现有命名空间。例如,您可以创建一个olm-mirror
命名空间来将所有镜像的内容推送到。
4.9.4. 对 Operator 目录进行镜像(mirror)
您可以使用 oc adm catalog mirror
命令将红帽提供的目录或自定义目录的 Operator 内容镜像到容器镜像 registry 中。目标 registry 必须支持 Docker v2-2。对于受限网络中的集群,此 registry 可以是集群有网络访问权限的 registry,如在受限网络集群安装过程中创建的镜像 registry。
OpenShift Container Platform 集群的内部 registry 不能用作目标 registry,因为它不支持没有标签的推送(在镜像过程中需要这个功能)。
oc adm catalog mirror
命令还会自动将在镜像过程中指定的索引镜像(无论是红帽提供的索引镜像还是您自己的自定义构建索引镜像)镜像到目标 registry。然后,您可以使用镜像的索引镜像创建一个目录源,允许 Operator Lifecycle Manager(OLM)将镜像目录加载到 OpenShift Container Platform 集群。
先决条件
- 没有网络访问限制的工作站
-
podman
1.9.3 或更高版本。 - 访问支持 Docker v2-2 的镜像 registry。
-
决定镜像 registry 上用于存储已镜像 Operator 内容的镜像 registry 内容。例如,您可以创建一个
olm-mirror
命名空间。 - 如果您的镜像 registry 无法访问互联网,请将可移动介质连接到您的没有网络访问限制的工作站。
如果您正在使用私有 registry,包括
registry.redhat.io
,请将REG_CREDS
环境变量设置为 registry 凭证的文件路径,以便在后续步骤中使用。例如,对于podman
CLI:$ REG_CREDS=${XDG_RUNTIME_DIR}/containers/auth.json
流程
如果要镜像红帽提供的目录,请在具有无网络访问限制的工作站中运行以下命令,以便与
registry.redhat.io
进行身份验证:$ podman login registry.redhat.io
oc adm catalog mirror
命令提取索引镜像的内容,以生成镜像所需的清单。命令的默认行为会生成清单,然后会自动将索引镜像以及索引镜像本身中的所有镜像内容镜像(mirror)到您的镜像 registry。另外,如果您的镜像 registry 位于完全断开连接的主机上,或者断开连接的或 airgapped 主机上,您可以首先将内容镜像到可移动介质,将介质移到断开连接的环境中,然后将内容从介质镜像到 registry。选项 A: 如果您的镜像 registry 与您的没有网络访问限制的工作站位于同一个网络中,请在您的工作站中执行以下操作:
如果您的镜像 registry 需要身份验证,请运行以下命令登录到 registry:
$ podman login <mirror_registry>
运行以下命令镜像内容:
$ oc adm catalog mirror \ <index_image> \1 <mirror_registry>:<port>/<namespace> \2 [-a ${REG_CREDS}] \3 [--insecure] \4 [--index-filter-by-os='<platform>/<arch>'] \5 [--manifests-only] 6
- 1
- 指定您要镜像的目录的索引镜像。例如,这可能是之前创建的已修剪索引镜像,也可以是默认目录的源索引镜像之一,如
registry.redhat.io/redhat/redhat-operator-index:v4.8
。 - 2
- 指定要将 Operator 内容镜像到的目标 registry 和命名空间的完全限定域名(FQDN),其中
<namespace>
是 registry 上的任何现有命名空间。例如,您可以创建一个olm-mirror
命名空间来将所有镜像的内容推送到。 - 3
- 可选:如果需要,指定 registry 凭证文件的位置。
registry.redhat.io
需要{REG_CREDS}
。 - 4
- 可选:如果您不想为目标 registry 配置信任,请添加
--insecure
标志。 - 5
- 可选:在有多个变体可用时,指定索引镜像的平台和架构。镜像被传递为
'<platform>/<arch>[/<variant>]'
。这不适用于索引引用的镜像。有效值为linux/amd64
、linux/ppc64le
、linux/s390x
和.*
- 6
- 可选:只生成镜像所需的清单,但并不实际将镜像内容镜像到 registry。这个选项对检查哪些将被镜像(mirror)非常有用,如果您只需要一小部分软件包,可以对映射列表进行修改。然后,您可以使用带有
oc image mirror
命令的mapping.txt
文件来在以后的步骤中镜像修改的镜像列表。此标志仅用于从目录中对内容进行高级选择性镜像;opm index prune
命令适用于大多数目录管理用例,如果之前用来修剪索引镜像。
输出示例
src image has index label for database path: /database/index.db using database path mapping: /database/index.db:/tmp/153048078 wrote database to /tmp/153048078 1 ... wrote mirroring manifests to manifests-redhat-operator-index-1614211642 2
注意Red Hat Quay 不支持嵌套存储库。因此,运行
oc adm catalog mirror
命令会失败,并显示401
未授权错误。作为临时解决方案,您可以在运行oc adm catalog mirror
命令时使用--max-components=2
选项来禁用嵌套存储库的创建。有关这个临时解决方案的更多信息,请参阅使用带有 Quay registry 知识库文章的 catalog mirror 命令时出现 Unauthorized 错误。
选项 B:如果您的镜像 registry 位于断开连接的主机上,请执行以下操作。
在您的工作站中运行以下命令,且没有网络访问权限将内容镜像到本地文件中:
$ oc adm catalog mirror \ <index_image> \1 file:///local/index \2 [-a ${REG_CREDS}] \ [--insecure] \ [--index-filter-by-os='<platform>/<arch>']
输出示例
... info: Mirroring completed in 5.93s (5.915MB/s) wrote mirroring manifests to manifests-my-index-1614985528 1 To upload local images to a registry, run: oc adm catalog mirror file://local/index/myrepo/my-index:v1 REGISTRY/REPOSITORY 2
-
将当前目录中生成的
v2/
目录复制到可移动介质中。 - 物理删除该介质并将其附加到断开连接的环境中可访问镜像 registry 的主机。
如果您的镜像 registry 需要身份验证,请在断开连接的环境中的主机上运行以下命令以登录到 registry:
$ podman login <mirror_registry>
从包含
v2/
目录的父目录运行以下命令,将镜像从本地文件上传到镜像 registry:$ oc adm catalog mirror \ file://local/index/<repo>/<index_image>:<tag> \1 <mirror_registry>:<port>/<namespace> \2 [-a ${REG_CREDS}] \ [--insecure] \ [--index-filter-by-os='<platform>/<arch>']
注意Red Hat Quay 不支持嵌套存储库。因此,运行
oc adm catalog mirror
命令会失败,并显示401
未授权错误。作为临时解决方案,您可以在运行oc adm catalog mirror
命令时使用--max-components=2
选项来禁用嵌套存储库的创建。有关这个临时解决方案的更多信息,请参阅使用带有 Quay registry 知识库文章的 catalog mirror 命令时出现 Unauthorized 错误。再次运行
oc adm catalog mirror
命令。使用新镜像的索引镜像作为源,以及上一步中与目标相同的镜像 registry 命名空间:$ oc adm catalog mirror \ <mirror_registry>:<port>/<index_image> \ <mirror_registry>:<port>/<namespace> \ --manifests-only \1 [-a ${REG_CREDS}] \ [--insecure]
- 1
- 此步骤需要
--manifests-only
标志,以便该命令不会再次复制所有镜像的内容。
重要这一步是必需的,因为上一步中生成的
imageContentSourcePolicy.yaml
文件中的镜像映射必须从本地路径更新为有效的镜像位置。如果不这样做,会在稍后的步骤中创建ImageContentSourcePolicy
对象时会导致错误。
将内容镜像到 registry 后,检查当前目录中生成的清单目录。
注意清单目录名会在以后的步骤中使用。
如果您在上一步中将内容镜像到同一网络上的 registry,则目录名称采用以下格式:
manifests-<index_image_name>-<random_number>
如果您在上一步中将内容镜像到断开连接的主机上的 registry,则目录名称采用以下格式:
manifests-index/<namespace>/<index_image_name>-<random_number>
manifests 目录包含以下文件,其中的一些文件可能需要进一步修改:
catalogSource.yaml
文件是CatalogSource
对象的基本定义,它预先填充索引镜像标签及其他相关元数据。此文件可原样使用,或进行相应修改来在集群中添加目录源。重要如果将内容镜像到本地文件,您必须修改 catalogSource
.yaml
文件,从metadata.name
字段中删除任何反斜杠(/
)字符。否则,当您试图创建对象时,会失败并显示 "invalid resource name” 错误。用来定义
ImageContentSourcePolicy
对象的imageContentSourcePolicy.yaml
,它可以将节点配置为在 Operator 清单中存储的镜像(image)引用和镜像 (mirror) 的 registry 间进行转换。注意如果您的集群使用
ImageContentSourcePolicy
对象来配置存储库镜像,则只能将全局 pull secret 用于镜像 registry。您不能在项目中添加 pull secret。mapping.txt
文件,在其中包含所有源镜像,并将它们映射到目标 registry。此文件与oc image mirror
命令兼容,可用于进一步自定义镜像(mirror)配置。重要如果您在镜像过程中使用
--manifests-only
标志,并希望进一步调整要镜像的软件包子集,请参阅 OpenShift Container Platform 4.7 文档中的镜像软件包清单格式目录镜像流程中有关修改mapping.txt
文件并使用oc image mirror
命令的步骤。在进行了这些操作后,您可以继续这个过程。
在可访问断开连接的集群的主机上,运行以下命令来指定 manifests 目录中的
imageContentSourcePolicy.yaml
文件,创建ImageContentSourcePolicy
(ICSP) 对象:$ oc create -f <path/to/manifests/dir>/imageContentSourcePolicy.yaml
其中
<path/to/manifests/dir>
是镜像内容的 manifests 目录的路径。现在,您可以创建一个
CatalogSource
来引用您的镜像索引镜像和 Operator 内容。
4.9.5. 从索引镜像创建目录
您可以从索引镜像创建 Operator 目录,并将其应用到 OpenShift Container Platform 集群,供 Operator Lifecycle Manager(OLM)使用。
先决条件
- 构建并推送到 registry 的索引镜像。
流程
创建一个
CatalogSource
对象来引用索引镜像。如果使用oc adm catalog mirror
命令将目录镜像到目标 registry,您可以使用生成的catalogSource.yaml
文件作为起点。根据您的规格修改以下内容,并将它保存为
catalogSource.yaml
文件:apiVersion: operators.coreos.com/v1alpha1 kind: CatalogSource metadata: name: my-operator-catalog 1 namespace: openshift-marketplace 2 spec: sourceType: grpc image: <registry>:<port>/<namespace>/redhat-operator-index:v4.8 3 displayName: My Operator Catalog publisher: <publisher_name> 4 updateStrategy: registryPoll: 5 interval: 30m
使用该文件创建
CatalogSource
对象:$ oc apply -f catalogSource.yaml
确定成功创建以下资源。
检查 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
检查目录源:
$ oc get catalogsource -n openshift-marketplace
输出示例
NAME DISPLAY TYPE PUBLISHER AGE my-operator-catalog My Operator Catalog grpc 5s
检查软件包清单:
$ oc get packagemanifest -n openshift-marketplace
输出示例
NAME CATALOG AGE jaeger-product My Operator Catalog 93s
现在,您可以在 OpenShift Container Platform Web 控制台中通过 OperatorHub 安装 Operator。
其他资源
- 如果您的索引镜像托管在私有 registry 上且需要进行身份验证,请参阅 从私有 registry 访问 Operator 的镜像。
4.9.6. 更新索引镜像
在将 OperatorHub 配置为使用引用自定义索引镜像的目录源后,集群管理员可通过将捆绑包镜像添加到索引镜像来保持其集群上的可用 Operator 最新状态。
您可以使用 opm index add
命令来更新存在的索引镜像。对于受限网络,还必须将更新的内容重新镜像到集群。
先决条件
-
opm
版本 1.12.3+ -
podman
版本 1.9.3+ - 构建并推送到 registry 的索引镜像。
- 引用索引镜像的现有目录源。
流程
通过添加捆绑包镜像来更新现有索引:
$ 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
其中:
<registry>
-
指定 registry 的主机名,如
quay.io
或mirror.example.com
。 <namespace>
-
指定 registry 的命名空间,如
ocs-dev
或abc
。 <new_bundle_image>
-
指定要添加到 registry 的新捆绑包镜像,如
ocs-operator
。 <digest>
-
指定捆绑包镜像的 SHA 镜像 ID 或摘要,如
c7f11097a628f092d8bad148406aa0e0951094a03445fd4bc0775431ef683a41
。 <existing_index_image>
-
指定之前推送的镜像,如
abc-redhat-operator-index
。 <existing_tag>
-
指定之前推送的镜像标签,如
4.8
。 <updated_tag>
-
指定要应用到更新的索引镜像的镜像标签,如
4.8.1
。
示例命令
$ opm index add \ --bundles quay.io/ocs-dev/ocs-operator@sha256:c7f11097a628f092d8bad148406aa0e0951094a03445fd4bc0775431ef683a41 \ --from-index mirror.example.com/abc/abc-redhat-operator-index:4.8 \ --tag mirror.example.com/abc/abc-redhat-operator-index:4.8.1 \ --pull-tool podman
推送更新的索引镜像:
$ podman push <registry>/<namespace>/<existing_index_image>:<updated_tag>
按照镜像 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
命令当前必须用于此步骤。Operator Lifecycle Manager(OLM)会在常规时间段内自动轮询目录源中引用的索引镜像,验证是否已成功添加新软件包:
$ oc get packagemanifests -n openshift-marketplace