4.7. 管理自定义目录
具有 dedicated-admin
角色和 Operator 目录的维护人员可以使用 OpenShift Dedicated 中的 Operator Lifecycle Manager (OLM) 上的 捆绑包格式 创建和管理打包的自定义目录。
Kubernetes 定期弃用后续版本中删除的某些 API。因此,从使用删除 API 的 Kubernetes 版本的 OpenShift Dedicated 版本开始,Operator 无法使用删除 API 的 API。
如果您的集群使用自定义目录,请参阅控制 Operator 与 OpenShift Dedicated 版本的兼容性,以了解更多有关 Operator 作者如何更新其项目的详细信息,以帮助避免工作负载问题并防止不兼容的升级。
其他资源
4.7.1. 先决条件
-
已安装
opm
CLI。
4.7.2. 基于文件的目录
基于文件的目录是 Operator Lifecycle Manager (OLM) 中目录格式的最新迭代。它是基于纯文本(JSON 或 YAML)和早期 SQLite 数据库格式的声明式配置演变,并且完全向后兼容。
从 OpenShift Dedicated 4.11 开始,默认的红帽提供的 Operator 目录以基于文件的目录格式发布。通过以过时的 SQLite 数据库格式发布的 4.10,用于 OpenShift Dedicated 4.6 的默认红帽提供的 Operator 目录。
与 SQLite 数据库格式相关的 opm
子命令、标志和功能已被弃用,并将在以后的版本中删除。功能仍被支持,且必须用于使用已弃用的 SQLite 数据库格式的目录。
许多 opm
子命令和标志都用于 SQLite 数据库格式,如 opm index prune
,它们无法使用基于文件的目录格式。有关使用基于文件的目录的更多信息,请参阅 Operator Framework 打包格式。
4.7.2.1. 创建基于文件的目录镜像
您可以使用 opm
CLI 创建一个目录镜像,它使用纯文本(基于文件的目录)格式(JSON 或 YAML),替换已弃用的 SQLite 数据库格式。
先决条件
-
已安装
opm
CLI。 -
您有
podman
版本 1.9.3+。 - 已构建捆绑包镜像并推送到支持 Docker v2-2 的 registry。
流程
初始化目录:
运行以下命令,为目录创建一个目录:
$ mkdir <catalog_dir>
运行
opm generate dockerfile
命令生成可构建目录镜像的 Dockerfile:$ opm generate dockerfile <catalog_dir> \ -i registry.redhat.io/openshift4/ose-operator-registry-rhel9:v4 1
- 1
- 使用
-i
标志指定官方红帽基础镜像,否则 Dockerfile 使用默认的上游镜像。
Dockerfile 必须与您在上一步中创建的目录目录位于相同的父目录中:
目录结构示例
. 1 ├── <catalog_dir> 2 └── <catalog_dir>.Dockerfile 3
运行
opm init
命令,使用 Operator 的软件包定义填充目录:$ opm init <operator_name> \ 1 --default-channel=preview \ 2 --description=./README.md \ 3 --icon=./operator-icon.svg \ 4 --output yaml \ 5 > <catalog_dir>/index.yaml 6
此命令在指定的目录配置文件中生成
olm.package
声明性配置 blob。
运行
opm render
命令向目录添加捆绑包:$ opm render <registry>/<namespace>/<bundle_image_name>:<tag> \ 1 --output=yaml \ >> <catalog_dir>/index.yaml 2
注意频道必须至少包含一个捆绑包。
为捆绑包添加频道条目。例如,根据您的规格修改以下示例,并将其添加到
<catalog_dir>/index.yaml
文件中:频道条目示例
--- schema: olm.channel package: <operator_name> name: preview entries: - name: <operator_name>.v0.1.0 1
- 1
- 确定在
<operator_name>
之后、版本v
中包含句点 (.
)。否则,条目无法传递opm validate
命令。
验证基于文件的目录:
针对目录目录运行
opm validate
命令:$ opm validate <catalog_dir>
检查错误代码是否为
0
:$ echo $?
输出示例
0
运行
podman build
命令构建目录镜像:$ podman build . \ -f <catalog_dir>.Dockerfile \ -t <registry>/<namespace>/<catalog_image_name>:<tag>
将目录镜像推送到 registry:
如果需要,运行
podman login
命令与目标 registry 进行身份验证:$ podman login <registry>
运行
podman push
命令来推送目录镜像:$ podman push <registry>/<namespace>/<catalog_image_name>:<tag>
其他资源
4.7.2.2. 更新或过滤基于文件的目录镜像
您可以使用 opm
CLI 更新或过滤使用基于文件的目录格式的目录镜像。通过提取现有目录镜像的内容,您可以根据需要修改目录,例如:
- 添加软件包
- 删除软件包
- 更新现有软件包条目
- 详细说明每个软件包、频道和捆绑包的弃用信息
然后,您可以将镜像重新构建为目录的更新版本。
先决条件
在您的工作站上有以下内容:
-
opm
CLI。 -
podman
版本 1.9.3+。 - 基于文件的目录镜像。
最近在与此目录相关的工作站上初始化的目录结构。
如果您没有初始化的 catalog 目录,请创建目录并生成 Dockerfile。如需更多信息,请参阅"创建基于文件的目录镜像"中的"初始化目录"步骤。
-
流程
以 YAML 格式将目录镜像的内容提取到 catalog 目录中的
index.yaml
文件中:$ opm render <registry>/<namespace>/<catalog_image_name>:<tag> \ -o yaml > <catalog_dir>/index.yaml
注意或者,您可以使用
-o json
标志以 JSON 格式输出。将生成的
index.yaml
文件的内容修改为您的规格:重要在目录中发布捆绑包后,假设您安装了其中一个用户。确保之前发布目录中的所有捆绑包都具有到当前或更新频道头的更新路径,以避免安装该版本的用户。
- 要添加 Operator,请按照"创建基于文件的目录镜像"过程中创建软件包、捆绑包和频道条目的步骤进行操作。
要删除 Operator,请删除与软件包相关的
olm.package
、olm.channel
和olm.bundle
blob 的集合。以下示例显示了一个需要删除的集合,才能从目录中删除example-operator
软件包:例 4.9. 删除条目示例
--- defaultChannel: release-2.7 icon: base64data: <base64_string> mediatype: image/svg+xml name: example-operator schema: olm.package --- entries: - name: example-operator.v2.7.0 skipRange: '>=2.6.0 <2.7.0' - name: example-operator.v2.7.1 replaces: example-operator.v2.7.0 skipRange: '>=2.6.0 <2.7.1' - name: example-operator.v2.7.2 replaces: example-operator.v2.7.1 skipRange: '>=2.6.0 <2.7.2' - name: example-operator.v2.7.3 replaces: example-operator.v2.7.2 skipRange: '>=2.6.0 <2.7.3' - name: example-operator.v2.7.4 replaces: example-operator.v2.7.3 skipRange: '>=2.6.0 <2.7.4' name: release-2.7 package: example-operator schema: olm.channel --- image: example.com/example-inc/example-operator-bundle@sha256:<digest> name: example-operator.v2.7.0 package: example-operator properties: - type: olm.gvk value: group: example-group.example.io kind: MyObject version: v1alpha1 - type: olm.gvk value: group: example-group.example.io kind: MyOtherObject version: v1beta1 - type: olm.package value: packageName: example-operator version: 2.7.0 - type: olm.bundle.object value: data: <base64_string> - type: olm.bundle.object value: data: <base64_string> relatedImages: - image: example.com/example-inc/example-related-image@sha256:<digest> name: example-related-image schema: olm.bundle ---
-
要为 Operator 添加或更新弃用信息,请确保在与软件包的
index.yaml
文件相同的目录中有一个deprecations.yaml
文件。有关deprecations.yaml
文件格式的详情,请参考 "olm.deprecations schema"。
- 保存您的更改。
验证目录:
$ opm validate <catalog_dir>
重建目录:
$ podman build . \ -f <catalog_dir>.Dockerfile \ -t <registry>/<namespace>/<catalog_image_name>:<tag>
将更新的目录镜像推送到 registry:
$ podman push <registry>/<namespace>/<catalog_image_name>:<tag>
验证
-
在 Web 控制台中,进入 Administration
Cluster Settings Configuration 页面中的 OperatorHub 配置资源。 添加目录源或更新现有目录源,以便将 pull spec 用于更新的目录镜像。
如需更多信息,请参阅本节的"添加资源"中的"在集群中添加目录源"。
-
在目录源处于 READY 状态后,进入 Operators
OperatorHub 页面,检查您所做的更改是否反映在 Operator 列表中。
4.7.3. 基于 SQLite 的目录
Operator 目录的 SQLite 数据库格式是一个弃用的功能。弃用的功能仍然包含在 OpenShift Dedicated 中,并且仍然被支持。但是,这个功能会在以后的发行版本中被删除,且不建议在新的部署中使用。
有关 OpenShift Dedicated 中已弃用或删除的主要功能的最新列表,请参阅 OpenShift Dedicated 发行注记中已弃用和删除的功能部分。
4.7.3.1. 创建基于 SQLite 的索引镜像
您可以使用 opm
CLI 根据 SQLite 数据库格式创建索引镜像。
先决条件
-
已安装
opm
CLI。 -
您有
podman
版本 1.9.3+。 - 已构建捆绑包镜像并推送到支持 Docker v2-2 的 registry。
流程
启动一个新的索引:
$ opm index add \ --bundles <registry>/<namespace>/<bundle_image_name>:<tag> \1 --tag <registry>/<namespace>/<index_image_name>:<tag> \2 [--binary-image <registry_base_image>] 3
将索引镜像推送到 registry。
如果需要,与目标 registry 进行身份验证:
$ podman login <registry>
推送索引镜像:
$ podman push <registry>/<namespace>/<index_image_name>:<tag>
4.7.3.2. 更新基于 SQLite 的索引镜像
在将 OperatorHub 配置为使用引用自定义索引镜像的目录源后,具有 dedicated-admin
角色的管理员可以通过将捆绑包镜像添加到索引镜像来使集群中的可用 Operator 保持最新状态。
您可以使用 opm index add
命令来更新存在的索引镜像。
先决条件
-
已安装
opm
CLI。 -
您有
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
。 <updated_tag>
-
指定要应用到更新的索引镜像的镜像标签,如
4.1
。
示例命令
$ opm index add \ --bundles quay.io/ocs-dev/ocs-operator@sha256:c7f11097a628f092d8bad148406aa0e0951094a03445fd4bc0775431ef683a41 \ --from-index mirror.example.com/abc/abc-redhat-operator-index:4 \ --tag mirror.example.com/abc/abc-redhat-operator-index:4.1 \ --pull-tool podman
推送更新的索引镜像:
$ podman push <registry>/<namespace>/<existing_index_image>:<updated_tag>
Operator Lifecycle Manager(OLM)会在常规时间段内自动轮询目录源中引用的索引镜像,验证是否已成功添加新软件包:
$ oc get packagemanifests -n openshift-marketplace
4.7.3.3. 过滤基于 SQLite 的索引镜像
基于 Operator Bundle Format 的索引镜像是 Operator 目录的容器化快照。您可以过滤或 prune(修剪)除指定的软件包列表以外的所有索引,创建只包含您想要的 Operator 的源索引副本。
先决条件
-
您有
podman
版本 1.9.3+。 -
grpcurl
(第三方命令行工具) -
已安装
opm
CLI。 - 访问支持 Docker v2-2 的 registry
流程
通过目标 registry 进行身份验证:
$ podman login <target_registry>
确定您要包括在您的修剪索引中的软件包列表。
运行您要修剪容器中的源索引镜像。例如:
$ podman run -p50051:50051 \ -it registry.redhat.io/redhat/redhat-operator-index:v4
输出示例
Trying to pull registry.redhat.io/redhat/redhat-operator-index:v4... 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 \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 4
运行以下命令将新索引镜像推送到目标 registry:
$ podman push <target_registry>:<port>/<namespace>/redhat-operator-index:v4
其中
<namespace>
是 registry 上的任何现有命名空间。
4.7.4. 目录源和 pod 安全准入
OpenShift Dedicated 4.11 中引入了 Pod 安全准入,以确保 pod 安全标准。使用基于 SQLite 的目录格式构建的目录源以及在 OpenShift Dedicated 4.11 无法运行受限 pod 安全强制前发布的 opm
CLI 工具版本。
在 OpenShift Dedicated 4 中,命名空间默认没有限制 pod 安全强制,默认目录源安全模式设置为 legacy
。
计划在以后的 OpenShift Dedicated 发行版本中包括所有命名空间的默认限制强制。当发生受限强制时,目录源 pod 规格的安全上下文必须与受限 pod 安全标准匹配。如果您的目录源镜像需要不同的 pod 安全标准,则必须明确设置命名空间的 pod 安全准入标签。
如果您不想以受限方式运行基于 SQLite 的目录源 pod,则不需要在 OpenShift Dedicated 4 中更新目录源。
但是,建议您采取措施来确保目录源在受限 pod 安全强制下运行。如果您不采取措施来确保目录源在受限 pod 安全强制下运行,您的目录源可能不会在以后的 OpenShift Dedicated 版本中运行。
作为目录作者,您可以通过完成以下任一操作来启用与受限 pod 安全强制的兼容性:
- 将您的目录迁移到基于文件的目录格式。
-
使用 OpenShift Dedicated 4.11 或更高版本发布的
opm
CLI 工具版本更新您的目录镜像。
SQLite 数据库目录格式已弃用,但仍然被红帽支持。在以后的发行版本中,不支持 SQLite 数据库格式,目录将需要迁移到基于文件的目录格式。从 OpenShift Dedicated 4.11 开始,默认的红帽提供的 Operator 目录以基于文件的目录格式发布。基于文件的目录与受限 pod 安全强制兼容。
如果您不想更新 SQLite 数据库目录镜像,或将目录迁移到基于文件的目录格式,您可以将目录配置为使用升级的权限运行。
其他资源
4.7.4.1. 将 SQLite 数据库目录迁移到基于文件的目录格式
您可以将已弃用的 SQLite 数据库格式目录更新为基于文件的目录格式。
先决条件
- SQLite 数据库目录源
-
您可以使用具有
dedicated-admin
角色的用户访问集群。 -
您有工作站上 OpenShift Dedicated 4 发布的
opm
CLI 工具的最新版本。
流程
运行以下命令,将 SQLite 数据库目录迁移到基于文件的目录:
$ opm migrate <registry_image> <fbc_directory>
运行以下命令,为您的基于文件的目录生成 Dockerfile:
$ opm generate dockerfile <fbc_directory> \ --binary-image \ registry.redhat.io/openshift4/ose-operator-registry:v4
后续步骤
- 生成的 Dockerfile 可以构建、标记并推送到 registry。
其他资源
4.7.4.2. 重建 SQLite 数据库目录镜像
您可以使用 OpenShift Dedicated 版本发布的 opm
CLI 工具的最新版本重建 SQLite 数据库目录镜像。
先决条件
- SQLite 数据库目录源
-
您可以使用具有
dedicated-admin
角色的用户访问集群。 -
您有工作站上 OpenShift Dedicated 4 发布的
opm
CLI 工具的最新版本。
流程
运行以下命令,使用
opm
CLI 工具的最新版本重建目录:$ opm index add --binary-image \ registry.redhat.io/openshift4/ose-operator-registry:v4 \ --from-index <your_registry_image> \ --bundles "" -t \<your_registry_image>
4.7.4.3. 配置目录以使用升级的权限运行
如果您不想更新 SQLite 数据库目录镜像,或将目录迁移到基于文件的目录格式,您可以执行以下操作以确保目录源在默认 pod 安全强制更改为受限时运行:
- 在目录源定义中手动将目录安全模式设置为 legacy。此操作可确保您的目录使用旧权限运行,即使默认目录安全模式更改为 restricted。
- 为基准或特权 pod 安全强制标记目录源命名空间。
SQLite 数据库目录格式已弃用,但仍然被红帽支持。在以后的发行版本中,不支持 SQLite 数据库格式,目录将需要迁移到基于文件的目录格式。基于文件的目录与受限 pod 安全强制兼容。
先决条件
- SQLite 数据库目录源
-
您可以使用具有
dedicated-admin
角色的用户访问集群。 -
支持运行带有升级 pod 安全准入标准
baseline
或privileged
的 pod 的目标命名空间
流程
通过将
spec.grpcPodConfig.securityContextConfig
标签设置为legacy
来编辑CatalogSource
定义,如下例所示:CatalogSource
定义示例apiVersion: operators.coreos.com/v1alpha1 kind: CatalogSource metadata: name: my-catsrc namespace: my-ns spec: sourceType: grpc grpcPodConfig: securityContextConfig: legacy image: my-image:latest
提示在 OpenShift Dedicated 4 中,
spec.grpcPodConfig.securityContextConfig
字段默认设置为legacy
。在以后的 OpenShift Dedicated 发行版本中,计划默认设置将更改为restricted
。如果您的目录无法在受限强制下运行,建议您手动将此字段设置为legacy
。编辑
<namespace>.yaml
文件,将升级的 pod 安全准入标准添加到目录源命名空间中,如下例所示:<namespace>.yaml
文件示例apiVersion: v1 kind: Namespace metadata: ... labels: security.openshift.io/scc.podSecurityLabelSync: "false" 1 openshift.io/cluster-monitoring: "true" pod-security.kubernetes.io/enforce: baseline 2 name: "<namespace_name>"
4.7.5. 在集群中添加目录源
将目录源添加到 OpenShift Dedicated 集群可为用户发现和安装 Operator。具有 dedicated-admin
角色的管理员可以创建一个 CatalogSource
对象来引用索引镜像。OperatorHub 使用目录源来填充用户界面。
或者,您可以使用 Web 控制台管理目录源。在 Home CatalogSource
。您可以创建、更新、删除、禁用和启用单独的源。
先决条件
- 构建并推送索引镜像到 registry。
-
您可以使用具有
dedicated-admin
角色的用户访问集群。
流程
创建一个
CatalogSource
对象来引用索引镜像。根据您的规格修改以下内容,并将它保存为
catalogSource.yaml
文件:apiVersion: operators.coreos.com/v1alpha1 kind: CatalogSource metadata: name: my-operator-catalog namespace: openshift-marketplace 1 annotations: olm.catalogImageTemplate: 2 "<registry>/<namespace>/<index_image_name>:v{kube_major_version}.{kube_minor_version}.{kube_patch_version}" spec: sourceType: grpc grpcPodConfig: securityContextConfig: <security_mode> 3 image: <registry>/<namespace>/<index_image_name>:<tag> 4 displayName: My Operator Catalog publisher: <publisher_name> 5 updateStrategy: registryPoll: 6 interval: 30m
- 1
- 如果您希望目录源对所有命名空间中的用户全局可用,请指定
openshift-marketplace
命名空间。否则,您可以指定一个不同的命名空间来对目录进行作用域并只对该命名空间可用。 - 2
- 可选:将
olm.catalogImageTemplate
注解设置为索引镜像名称,并使用一个或多个 Kubernetes 集群版本变量,如为镜像标签构建模板时所示。 - 3
- 指定
legacy
或restricted
的值。如果没有设置该字段,则默认值为legacy
。在以后的 OpenShift Dedicated 发行版本中,计划默认值为restricted
。如果您的目录无法使用restricted
权限运行,建议您手动将此字段设置为legacy
。 - 4
- 指定索引镜像。如果您在镜像名称后指定了标签,如
:v4
,则目录源 Pod 会使用镜像 pull 策略Always
,这意味着 pod 始终在启动容器前拉取镜像。如果您指定了摘要,如@sha256:<id>
,则镜像拉取策略为IfNotPresent
,这意味着仅在节点上不存在的镜像时才拉取镜像。 - 5
- 指定发布目录的名称或机构名称。
- 6
- 目录源可以自动检查新版本以保持最新。
使用该文件创建
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 Dedicated Web 控制台中通过 OperatorHub 安装 Operator。
4.7.6. 删除自定义目录
作为具有 dedicated-admin
角色的管理员,您可以通过删除相关的目录源来删除之前添加到集群中的自定义 Operator 目录。
先决条件
-
您可以使用具有
dedicated-admin
角色的用户访问集群。
流程
-
在 Web 控制台的 Administrator 视角中,进入到 Home
Search。 - 从 Project: 列表中选择一个项目。
- 从 Resources 列表中选择 CatalogSource。
- 选择您要删除的目录的 Options 菜单 ,然后点 Delete CatalogSource。