8.4. 将基于 OLM 的 Operator 添加到断开连接的集群中
您可以将基于 OLM 的 Operator 嵌入到 Red Hat Enterprise Linux for Edge (RHEL for Edge)镜像中。
8.4.1. 关于将基于 OLM 的 Operator 添加到断开连接的集群中
对于在断开连接的集群上安装的 Operator,Operator Lifecycle Manager (OLM)默认无法访问托管在远程 registry 上的源,因为这些远程源需要足够的互联网连接。因此,您必须将远程 registry 镜像为高度可用的容器 registry。
在断开连接的环境中,需要执行以下步骤来使用基于 OLM 的 Operator:
- 将 OLM 包含在您的镜像 registry 的容器镜像列表中。
-
通过直接更新 CRI-O 配置将系统配置为使用您的镜像 registry。MicroShift 不支持
ImageContentSourcePolicy
。 -
在集群中添加
CatalogSource
对象,以便 OLM catalog Operator 可以使用镜像 registry 上的本地目录。 - 确保 MicroShift 已安装在断开连接的容量中运行。
- 确保网络设置配置为以断开连接模式运行。
在断开连接的集群中启用 OLM 后,您可以继续使用互联网连接的工作站来在发布新版 Operator 时保持本地目录源更新。
8.4.1.1. 执行空运行
您可以使用 oc-mirror 来执行空运行,而无需实际镜像(mirror)。这可让您查看要镜像的镜像列表,以及从镜像 registry 修剪的所有镜像。使用空运行(dry run)还允许您在早期版本中捕获与镜像集配置相关的任何错误,或使用生成的镜像列表以及其他工具来执行镜像操作。
先决条件
- 您可以访问互联网来获取所需的容器镜像。
-
已安装 OpenShift CLI(
oc
)。 -
已安装
oc-mirror
CLI 插件。 - 您已创建了镜像设置配置文件。
流程
使用
--dry-run
标志运行oc mirror
命令来执行空运行:$ oc mirror --config=./imageset-config.yaml \1 docker://registry.example:5000 \2 --dry-run 3
输出示例
Checking push permissions for registry.example:5000 Creating directory: oc-mirror-workspace/src/publish Creating directory: oc-mirror-workspace/src/v2 Creating directory: oc-mirror-workspace/src/charts Creating directory: oc-mirror-workspace/src/release-signatures No metadata detected, creating new workspace wrote mirroring manifests to oc-mirror-workspace/operators.1658342351/manifests-redhat-operator-index ... info: Planning completed in 31.48s info: Dry run complete Writing image mapping to oc-mirror-workspace/mapping.txt
进入生成的工作区目录:
$ cd oc-mirror-workspace/
查看生成的
mapping.txt
文件。此文件包含将要镜像的所有镜像的列表。
查看生成的
prune-plan.json
文件。此文件包含在发布镜像集时从镜像 registry 中修剪的所有镜像的列表。
注意只有在 oc-mirror 命令指向您的镜像 registry 且需要修剪的镜像时,才会生成
prune-plan.json
文件。
8.4.1.2. 在断开连接的环境中获取用于 RHEL for Edge 的目录和 Operator 容器镜像引用
使用 oc-mirror 插件执行空运行后,以查看您要镜像的镜像列表,您必须获取所有容器镜像引用,然后格式化添加到镜像构建器蓝图的输出。
对于为专有 Operator 创建的目录,您可以在不按照以下流程的情况下格式化镜像构建器蓝图的镜像引用。
先决条件
- 有要使用的 Operator 的目录索引。
-
已安装
jq
CLI 工具。 - 熟悉镜像构建器蓝图文件。
- 您有一个 Image Builder 蓝图 TOML 文件。
流程
解析目录
index.json
文件,以获取 Image Builder 蓝图中包含的镜像引用。您可以使用 unfiltered 目录,也可以过滤掉无法镜像的镜像:运行以下命令,解析未过滤的目录
index.json
文件以获取镜像引用:jq -r --slurp '.[] | select(.relatedImages != null) | "[[containers]]\nsource = \"" + .relatedImages[].image + "\"\n"' ./oc-mirror-workspace/src/catalogs/registry.redhat.io/redhat/redhat-operator-index/v4.16/index/index.json
如果要过滤无法镜像的镜像,请运行以下命令过滤并解析目录
index.json
文件:$ jq -r --slurp '.[] | select(.relatedImages != null) | .relatedImages[] | select(.name | contains("ppc") or contains("s390x") | not) | "[[containers]]\\nsource = \\"" + .image + "\\"\\n"' ./oc-mirror-workspace/src/catalogs/registry.redhat.io/redhat/redhat-operator-index/v4.16/index/index.json
注意此步骤使用 AMQ Broker Operator 作为示例。您可以在
jq
命令中添加其他条件来进一步过滤您的用例。image-reference 输出示例
[[containers]] source = "registry.redhat.io/amq7/amq-broker-init-rhel8@sha256:0b2126cfb6054fdf428c1f43b69e36e93a09a49ce15350e9273c98cc08c6598b" [[containers]] source = "registry.redhat.io/amq7/amq-broker-init-rhel8@sha256:0dde839c2dce7cb684094bf26523c8e16677de03149a0fff468b8c3f106e1f4f" ... ... [[containers]] source = "registry.redhat.io/amq7/amq-broker-rhel8@sha256:e8fa2a00e576ecb95561ffbdbf87b1c82d479c8791ab2c6ce741dd0d0b496d15" [[containers]] source = "registry.redhat.io/amq7/amq-broker-rhel8@sha256:ff6fefad518a6c997d4c5a6e475ba89640260167f0bc27715daf3cc30116fad1" … EOF
重要对于镜像和断开连接的用例,请确保从目录
index.json
文件中过滤的所有源都是摘要。如果任何源使用标签而不是摘要,Operator 安装会失败。标签需要互联网连接。
运行以下命令,查看
imageset-config.yaml
以获取CatalogSource
自定义资源(CR)的目录镜像引用:$ cat imageset-config.yaml
输出示例
kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v1alpha2 storageConfig: registry: imageURL: registry.example.com/microshift-mirror mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.16 1 packages: - name: amq-broker-rhel8 channels: - name: 7.11.x
- 1
- 使用
mirror.catalog
catalog image reference for the follwingjq
命令中的值来获取镜像摘要。在本例中,< registry.redhat.io/redhat/redhat-operator-index:v4.16 >。
运行以下命令,获取目录索引镜像的 SHA:
$ skopeo inspect docker://<registry.redhat.io/redhat/redhat-operator-index:v4.16> | jq `.Digest` 1
- 1
- 使用
jq
命令的mirror.catalog
目录镜像引用中的值来获取镜像摘要。在本例中,< registry.redhat.io/redhat/redhat-operator-index:v4.16 >。
输出示例
"sha256:7a76c0880a839035eb6e896d54ebd63668bb37b82040692141ba39ab4c539bc6"
要准备在 Image Builder 蓝图文件中添加镜像引用,请使用以下示例格式化目录镜像引用:
[[containers]] source = "registry.redhat.io/redhat/redhat-operator-index@sha256:7a76c0880a839035eb6e896d54ebd63668bb37b82040692141ba39ab4c539bc6"
将前面所有步骤中的镜像引用添加到镜像构建器蓝图中。
生成的镜像构建器蓝图示例片断
name = "microshift_blueprint" description = "MicroShift 4.16.1 on x86_64 platform" version = "0.0.1" modules = [] groups = [] [[packages]] 1 name = "microshift" version = "4.16.1" ... ... [customizations.services] 2 enabled = ["microshift"] [customizations.firewall] ports = ["22:tcp", "80:tcp", "443:tcp", "5353:udp", "6443:tcp", "30000-32767:tcp", "30000-32767:udp"] ... ... [[containers]] 3 source = "quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:f41e79c17e8b41f1b0a5a32c3e2dd7cd15b8274554d3f1ba12b2598a347475f4" [[containers]] source = "quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:dbc65f1fba7d92b36cf7514cd130fe83a9bd211005ddb23a8dc479e0eea645fd" ... ... [[containers]] 4 source = "registry.redhat.io/redhat/redhat-operator-index@sha256:7a76c0880a839035eb6e896d54ebd63668bb37b82040692141ba39ab4c539bc6" ... ... [[containers]] source = "registry.redhat.io/amq7/amq-broker-init-rhel8@sha256:0dde839c2dce7cb684094bf26523c8e16677de03149a0fff468b8c3f106e1f4f" ... ... [[containers]] source = "registry.redhat.io/amq7/amq-broker-rhel8@sha256:e8fa2a00e576ecb95561ffbdbf87b1c82d479c8791ab2c6ce741dd0d0b496d15" [[containers]] source = "registry.redhat.io/amq7/amq-broker-rhel8@sha256:ff6fefad518a6c997d4c5a6e475ba89640260167f0bc27715daf3cc30116fad1" … EOF
8.4.1.3. 在断开连接的 RHEL for Edge 镜像中应用目录和 Operator
为断开连接的环境创建了 RHEL for Edge 镜像并配置了 MicroShift 网络设置后,您可以配置命名空间和创建目录和 Operator 自定义资源(CR)以运行 Operator。
先决条件
- 您有一个 RHEL for Edge 镜像。
- 配置了网络以断开连接使用。
- 您完成了 oc-mirror 插件空运行过程。
流程
创建一个
CatalogSource
自定义资源(CR),如下例所示:my-catalog-source-cr.yaml
文件示例apiVersion: operators.coreos.com/v1alpha1 kind: CatalogSource metadata: name: cs-redhat-operator-index namespace: openshift-marketplace 1 spec: image: registry.example.com/redhat/redhat-operator-index:v4.16 sourceType: grpc displayName: publisher: updateStrategy: registryPoll: interval: 60m
- 1
- 全局命名空间。将
metadata.namespace
设置为openshift-marketplace
可让目录在所有命名空间中运行。任何命名空间中的订阅可以引用openshift-marketplace
命名空间中创建的目录。
注意openshift-marketplace
的默认 pod 安全准入定义是baseline
,因此在该命名空间中创建的目录源自定义资源(CR)不需要设置spec.grpcPodConfig.securityContextConfig
值。如果需要使用命名空间和 Operator,您可以设置传统
或受限
值。将目录索引提交的 SHA 添加到目录源(CR)中,如下例所示:
命名空间
spec.image
配置示例apiVersion: operators.coreos.com/v1alpha1 kind: CatalogSource metadata: name: cs-redhat-operator-index namespace: openshift-marketplace spec: image: registry.example.com/redhat/redhat-operator-index@sha256:7a76c0880a839035eb6e896d54ebd63668bb37b82040692141ba39ab4c539bc6 1 sourceType: grpc displayName: publisher: updateStrategy: registryPoll: interval: 60m
- 1
- 镜像提交的 SHA。使用添加到镜像构建器蓝图中的相同 SHA。
重要您必须使用 SHA 而不是目录 CR 中的标签,或者 pod 无法启动。
运行以下命令,将 oc-mirror 插件空运行结果目录应用到集群:
$ oc apply -f ./oc-mirror-workspace/results-1708508014/catalogSource-cs-redhat-operator-index.yaml
输出示例
catalogsource.operators.coreos.com/cs-redhat-operator-index created
运行以下命令验证
CatalogSource
资源是否已成功安装:$ oc get catalogsource --all-namespaces
使用以下命令验证目录源是否正在运行:
$ oc get pods -n openshift-marketplace
输出示例
NAME READY STATUS RESTARTS AGE cs-redhat-operator-index-4227b 2/2 Running 0 2m5s
创建一个
Subscription
CR,类似以下示例:my-subscription-cr.yaml
文件示例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
运行以下命令来应用
Subscription
CR:$ oc apply -f ./<my-subscription-cr.yaml> 1
- 1
- 指定
Subscription
CR 的名称,如my-subscription-cr.yaml
。
输出示例
subscription.operators.coreos.com/amq-broker created