8.3. 使用 oc-mirror 插件创建自定义目录
您可以使用 oc-mirror OpenShift CLI (oc)插件创建带有广泛可用 Operator 的自定义目录,并对其进行镜像。
8.3.1. 使用红帽提供的 Operator 目录和镜像 registry
您可以使用 oc-mirror OpenShift CLI (oc)插件过滤和修剪目录以获取特定的 Operator 并进行镜像。您还可以在断开连接的设置中使用 Operator,或嵌入 Red Hat Enterprise Linux for Edge (RHEL for Edge)镜像中。要了解有关如何为镜像配置您的系统的更多详细信息,请使用以下"Additional resources"部分中的链接。如果您已准备好从红帽提供的 Operator 目录、镜像或将其嵌入到 RHEL for Edge 镜像中,请从以下部分开始,"使用 oc-mirror 插件创建目录内容"。
8.3.2. 关于用于创建镜像 registry 的 oc-mirror 插件
您可以使用 MicroShift 的 oc-mirror OpenShift CLI (oc)插件来过滤和修剪 Operator 目录。然后,您可以将过滤的目录内容镜像到镜像 registry,或使用 RHEL for Edge 的断开连接的或离线部署中的容器镜像。
MicroShift 使用 oc-mirror 插件的通用版本(1)。不要在 oc-mirror 插件的技术预览版本(2)中使用以下步骤。
您可以在本地将所需 Operator 所需的容器镜像镜像,或镜像到支持 Docker v2-2 (如 Red Hat Quay)的容器镜像。从连接到互联网到断开连接的镜像 registry 的 Red Hat 托管 registry 镜像内容的过程与您选择的 registry 无关。镜像目录内容后,将每个集群配置为从您的镜像 registry 中检索此内容。
8.3.2.1. 填充镜像 registry 时的连接注意事项
在填充 registry 时,您可以使用以下连接场景之一:
- 连接的镜像
- 如果您的主机可以同时访问互联网和您的镜像 registry,但不能访问您的集群节点,您可以直接从该机器中镜像内容。
- 断开连接的镜像
如果您没有可同时访问互联网和您的镜像 registry 的主机,您必须将镜像镜像(mirror)到文件系统中,然后将该主机或可移动介质置于断开连接的环境中。
重要容器 registry 必须可以被您置备的集群中的每个机器访问。如果 registry 无法访问,则安装、更新和其他操作(如重新定位工作负载)可能会失败。
为了避免由无法访问的 registry 造成的问题,请使用以下标准实践:
- 以高可用性方式运行镜像 registry。
- 确保镜像 registry 至少与集群的生产环境可用性匹配。
其他资源
8.3.2.2. 使用 oc-mirror 插件检查目录内容
使用以下示例流程选择目录并列出可用 OpenShift Container Platform 内容的 Operator,以添加到 oc-mirror 插件镜像设置配置文件中。
如果使用自己的目录和 Operator,您可以将镜像直接推送到内部 registry。
先决条件
-
已安装 OpenShift CLI (
oc
)。 - 已安装 Operator Lifecycle Manager (OLM)。
- 已安装 oc-mirror OpenShift CLI (oc)插件。
流程
运行以下命令,获取可用红帽提供的 Operator 目录列表来过滤:
$ oc mirror list operators --version 4.15 --catalogs
运行以下命令,获取 Red Hat Operator 目录中的 Operator 列表:
$ oc mirror list operators <--catalog=<catalog_source>> 1
- 1
- 指定目录源,如
registry.redhat.io/redhat/redhat-operator-index:v4.15
或quay.io/operatorhubio/catalog:latest
。
-
选择一个 Operator。在本例中,选择了
amq-broker-rhel8
。 可选: 要检查您要过滤的 Operator 的频道和版本,请输入以下命令:
运行以下命令来获取频道列表:
$ oc mirror list operators --catalog=registry.redhat.io/redhat/redhat-operator-index:v4.15 --package=amq-broker-rhel8
运行以下命令,获取频道中的版本列表:
$ oc mirror list operators --catalog=registry.redhat.io/redhat/redhat-operator-index:v4.15 --package=amq-broker-rhel8 --channel=7.11.x
后续步骤
- 使用此流程中收集的信息创建和编辑镜像设置配置文件。
- 将转换的镜像设置配置文件镜像到镜像 registry 或磁盘。
8.3.2.3. 创建镜像设置配置文件
您必须创建一个镜像设置配置文件,以使用 oc-mirror 插件镜像目录内容。镜像设置配置文件定义了哪些 Operator 与 oc-mirror 插件的其他配置设置一起镜像。生成默认镜像集文件后,您必须编辑内容,以便剩余的条目与 MicroShift 和您计划使用的 Operator 兼容。
您必须在镜像设置配置文件中指定存储后端。此存储后端可以是本地目录或支持 Docker v2-2 的 registry。oc-mirror 插件在创建镜像的过程中将元数据存储在这个存储后端中。
不要删除或修改 oc-mirror 插件生成的元数据。每次针对同一镜像 registry 运行 oc-mirror 插件时,都必须使用相同的存储后端。
先决条件
- 您已创建了容器镜像 registry 凭证文件。请参阅配置允许镜像镜像的凭证。
流程
使用
oc mirror init
命令为镜像设置配置创建模板,并将其保存到名为imageset-config.yaml
的文件中:$ oc mirror init <--registry <storage_backend> > imageset-config.yaml 1
- 1
- 指定存储后端的位置,如
example.com/mirror/oc-mirror-metadata
。
默认镜像设置配置文件示例
kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v1alpha2 storageConfig: registry: imageURL: registry.example.com/oc-mirror skipTLS: false mirror: platform: 1 channels: - name: stable-4.15 type: ocp operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: serverless-operator channels: - name: stable additionalImages: 2 - name: registry.redhat.io/ubi8/ubi:latest helm: {} 3
编辑镜像设置配置文件的值,以满足您要镜像的 MicroShift 和 Operator 的要求,如下例所示:
编辑 MicroShift 镜像设置配置文件示例
kind: ImageSetConfiguration apiVersion: mirror.openshift.io/v1alpha2 storageConfig: 1 registry: imageURL: <storage_backend> 2 skipTLS: false mirror: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 3 packages: - name: amq-broker-rhel8 4 channels: - name: 7.11.x 5
- 1
- 设置保存镜像设置元数据的后端位置。此位置可以是 registry 或本地目录。必须指定
storageConfig
值。 - 2
- 设置存储后端的注册表 URL,如
<example.com/mirror/oc-mirror-metadata
。 - 3
- 将 Operator 目录设置为从中检索镜像。
- 4
- 指定要包含在镜像集中的 Operator 软件包。删除此字段以检索目录中的所有软件包。
- 5
- 仅指定要包含在镜像集中的 Operator 软件包的某些频道。即使您没有使用该频道中的捆绑包,还必须始终包含 Operator 软件包的默认频道。您可以运行以下命令来找到默认频道:
oc mirror list operators --catalog=<catalog_name> --package=<package_name>
。
- 保存更新的文件。
后续步骤
- 使用 oc-mirror 插件将镜像直接设置为目标镜像 registry。
- 配置 CRI-O。
- 将目录源应用到集群。
8.3.2.3.1. 镜像设置配置参数
oc-mirror 插件需要一个镜像设置配置文件,该文件定义哪些镜像要镜像(mirror)。下表列出了 ImageSetConfiguration
资源的可用参数。
参数 | 描述 | 值 |
---|---|---|
|
|
字符串.例如: |
| 镜像集的配置。 | 对象 |
| 镜像集的额外镜像配置。 | 对象数组。例如: additionalImages: - name: registry.redhat.io/ubi8/ubi:latest |
| 要 mirror 的镜像的标签或摘要。 |
字符串.例如: |
| 阻止 mirror 的镜像的完整标签、摘要或模式。 |
字符串数组。例如: |
| 镜像集的 Operator 配置。 | 对象数组。例如: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: elasticsearch-operator minVersion: '2.4.0' |
| 包括在镜像集中的 Operator 目录。 |
字符串.例如: |
|
为 |
布尔值.默认值为 |
| Operator 软件包配置。 | 对象数组。例如: operators: - catalog: registry.redhat.io/redhat/redhat-operator-index:v4.15 packages: - name: elasticsearch-operator minVersion: '5.2.3-31' |
| 镜像集中要包含的 Operator 软件包名称 |
字符串.例如: |
| Operator 软件包频道配置。 | 对象 |
| Operator 频道名称(软件包中唯一)要包括在镜像集中。 |
字符串.例如: |
| Operator 镜像的最高版本,在其中存在所有频道。详情请查看以下备注。 |
字符串.例如: |
| 要包含的最小捆绑包的名称,以及频道头更新图中的所有捆绑包。仅在命名捆绑包没有语义版本元数据时设置此字段。 |
字符串.例如: |
| Operator 的最低版本,用于镜像存在的所有频道。详情请查看以下备注。 |
字符串.例如: |
| Operator 最高版本,可跨所有存在的频道进行镜像。详情请查看以下备注。 |
字符串.例如: |
| Operator 的最低版本,用于镜像存在的所有频道。详情请查看以下备注。 |
字符串.例如: |
|
如果为 |
布尔值.默认值为 |
| 要镜像引用的目录的替代名称和可选命名空间层次结构。 |
字符串.例如: |
| 将引用的目录镜像为。
|
字符串.例如: |
|
附加到 |
字符串.例如: |
| 镜像集的后端配置。 | 对象 |
| 镜像集的本地后端配置。 | 对象 |
| 包含镜像设置元数据的目录路径。 |
字符串.例如: |
| 镜像集的 registry 后端配置。 | 对象 |
| 后端 registry URI。可以选择在 URI 中包含命名空间引用。 |
字符串.例如: |
| (可选)跳过引用的后端 registry 的 TLS 验证。 |
布尔值.默认值为 |
使用 minVersion
和 maxVersion
属性过滤特定 Operator 版本范围可能会导致多个频道头错误。错误消息指出 有多个频道头。
这是因为当应用过滤器时,Operator 的更新图表会被截断。
Operator Lifecycle Manager 要求每个 Operator 频道都包含一个端点组成更新图表的版本,即 Operator 的最新版本。应用过滤器范围时,该图可切换到两个或多个独立图形或具有多个端点的图形。
要避免这个错误,请不要过滤 Operator 的最新版本。如果您仍然遇到错误,具体取决于 Operator,则必须增加 maxVersion
属性,或者 minVersion
属性必须减少。因为每个 Operator 图都可以不同,所以您可能需要调整这些值,直到错误解决为止。
其他资源
8.3.2.4. 镜像(mirror)到镜像(mirror)的镜像
您可以使用 oc-mirror 插件将镜像直接设置为在镜像设置过程中可访问的目标镜像 registry。
您必须在镜像设置配置文件中指定存储后端。这个存储后端可以是本地目录或 Docker v2 registry。oc-mirror 插件在创建镜像的过程中将元数据存储在这个存储后端中。
不要删除或修改 oc-mirror 插件生成的元数据。每次针对同一镜像 registry 运行 oc-mirror 插件时,都必须使用相同的存储后端。
先决条件
- 您可以访问互联网来获取所需的容器镜像。
-
已安装 OpenShift CLI(
oc
)。 -
已安装
oc-mirror
CLI 插件。 - 您已创建了镜像设置配置文件。
流程
运行
oc mirror
命令将指定镜像集配置中的镜像镜像到指定的 registry:$ oc mirror --config=./<imageset-config.yaml> \1 docker://registry.example:5000 2
输出示例
Rendering catalog image "registry.example.com/redhat/redhat-operator-index:v{ocp-version}" with file-based catalog
验证
-
进入生成的
oc-mirror-workspace/
目录。 -
导航到结果目录,例如,
results-1639608409/
。 -
验证
ImageContentSourcePolicy
和CatalogSource
资源是否存在 YAML 文件。
ImageContentSourcePolicy
YAML 文件用作在 MicroShift 中手动配置 CRI-O 的参考内容。您无法将资源直接应用到 MicroShift 集群。
后续步骤
-
转换
ImageContentSourcePolicy
YAML 内容,用于手动配置 CRI-O。 - 如果需要,将镜像从 mirror 镜像到磁盘,以便断开连接或离线使用。
- 配置集群以使用 oc-mirror 生成的资源。
故障排除
8.3.2.5. 为 Operator 使用 registry 镜像配置 CRI-O
您必须将通过 oc-mirror 插件创建的 imageContentSourcePolicy.yaml
文件转换为与 MicroShift 使用的 CRI-O 容器运行时配置兼容的格式。
先决条件
-
已安装 OpenShift CLI (
oc
)。 - 已安装 Operator Lifecycle Manager (OLM)。
- 已安装 oc-mirror OpenShift CLI (oc)插件。
-
已安装
yq
二进制文件。 -
ImageContentSourcePolicy
和CatalogSource
YAML 文件包括在oc-mirror-workspace/results explained
目录中。
流程
运行以下命令确认
imageContentSourcePolicy.yaml
文件的内容:$ cat oc-mirror-workspace/<results-directory>/imageContentSourcePolicy.yaml 1
- 1
- 指定
结果
目录名称,如 <results-1707148826
>。
输出示例
apiVersion: operator.openshift.io/v1alpha1 kind: ImageContentSourcePolicy metadata: labels: operators.openshift.org/catalog: "true" name: operator-0 spec: repositoryDigestMirrors: - mirrors: - registry.<example.com>/amq7 source: registry.redhat.io/amq7
运行以下命令,将
imageContentSourcePolicy.yaml
转换为 CRI-O 配置的格式:yq '.spec.repositoryDigestMirrors[] as $item ireduce([]; . + [{"mirror": $item.mirrors[], "source": ($item | .source)}]) | .[] | "[[registry]] prefix = \"" + .source + "\" location = \"" + .mirror + "\" mirror-by-digest-only = true insecure = true "' ./icsp.yaml
输出示例
[[registry]] prefix = "registry.redhat.io/amq7" location = "registry.example.com/amq7" mirror-by-digest-only = true insecure = true
将输出添加到
/etc/containers/registries.conf.d/
目录中的 CRI-O 配置文件中:crio-config.yaml
镜像配置文件示例[[registry]] prefix = "registry.redhat.io/amq7" location = "registry.example.com/amq7" mirror-by-digest-only = true insecure = true [[registry]] prefix = "" location = "quay.io" mirror-by-digest-only = true [[registry.mirror]] location = "<registry_host>:<port>" 1 insecure = false
- 1
- 指定镜像 registry 服务器的主机名和端口,如
microshift-quay:8443
。
使用以下命令重启 MicroShift 来应用 CRI-O 配置更改:
$ sudo systemctl restart crio
8.3.2.6. 安装使用 oc-mirror 插件创建的自定义目录
将镜像设置为镜像 registry 后,您必须将生成的 CatalogSource
自定义资源(CR)应用到集群。Operator Lifecycle Manager (OLM)使用 CatalogSource
CR 来检索有关镜像 registry 中可用 Operator 的信息。然后,您必须创建并应用订阅 CR 来订阅自定义目录。
先决条件
- 您已将镜像设置为 registry 镜像。
- 您已将镜像引用信息添加到 CRI-O 容器运行时配置中。
流程
运行以下命令,从 results 目录中应用目录源配置文件来创建目录源对象:
$ oc apply -f ./oc-mirror-workspace/results-1708508014/catalogSource-cs-redhat-operator-index.yaml
目录源配置文件示例
apiVersion: operators.coreos.com/v1alpha1 kind: CatalogSource metadata: name: redhat-catalog namespace: openshift-marketplace 1 spec: sourceType: grpc image: registry.example.com/redhat/redhat-operator-index:v4.15 updateStrategy: registryPoll: interval: 60m
- 1
- 指定全局命名空间。将
metadata.namespace
设置为openshift-marketplace
可让目录引用所有命名空间中的目录。任何命名空间中的订阅可以引用openshift-marketplace
命名空间中创建的目录。
输出示例
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,类似以下示例:Subscription
CR 示例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
- 指定订阅的名称,如
my-subscription-cr.yaml
。
输出示例
subscription.operators.coreos.com/amq-broker created