4.7. 管理自定义目录
具有 dedicated-admin
角色和 Operator 目录维护人员的管理员可以创建和管理使用 Red Hat OpenShift Service on AWS 的 Operator Lifecycle Manager (OLM)中 捆绑的自定义目录。
Kubernetes 定期弃用后续版本中删除的某些 API。因此,从使用删除 API 的 Kubernetes 版本的 Red Hat OpenShift Service on AWS 开始,Operator 无法使用删除的 API。
4.7.1. 先决条件 复制链接链接已复制到粘贴板!
4.7.2. 基于文件的目录 复制链接链接已复制到粘贴板!
基于文件的目录是 Operator Lifecycle Manager (OLM) 中目录格式的最新迭代。它是基于纯文本(JSON 或 YAML)和早期 SQLite 数据库格式的声明式配置演变,并且完全向后兼容。
从 Red Hat OpenShift Service on AWS 4.11 开始,默认的红帽提供的 Operator 目录以基于文件的目录格式发布。通过以过时的 SQLite 数据库格式发布的 4.10,Red Hat OpenShift Service on AWS 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>
$ mkdir <catalog_dir>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行
opm generate dockerfile
命令生成可构建目录镜像的 Dockerfile:opm generate dockerfile <catalog_dir> \ -i registry.redhat.io/openshift4/ose-operator-registry-rhel9:v4 -i registry.redhat.io/openshift4/ose-operator-registry-rhel9:v4
$ opm generate dockerfile <catalog_dir> \ -i registry.redhat.io/openshift4/ose-operator-registry-rhel9:v4
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 使用
-i
标志指定官方红帽基础镜像,否则 Dockerfile 使用默认的上游镜像。
Dockerfile 必须与您在上一步中创建的目录目录位于相同的父目录中:
目录结构示例
. ├── <catalog_dir> └── <catalog_dir>.Dockerfile
.
1 ├── <catalog_dir>
2 └── <catalog_dir>.Dockerfile
3 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行
opm init
命令,使用 Operator 的软件包定义填充目录:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 此命令在指定的目录配置文件中生成
olm.package
声明性配置 blob。
运行
opm render
命令向目录添加捆绑包:opm render <registry>/<namespace>/<bundle_image_name>:<tag> \ --output=yaml \ >> <catalog_dir>/index.yaml
$ opm render <registry>/<namespace>/<bundle_image_name>:<tag> \
1 --output=yaml \ >> <catalog_dir>/index.yaml
2 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意频道必须至少包含一个捆绑包。
为捆绑包添加频道条目。例如,根据您的规格修改以下示例,并将其添加到
<catalog_dir>/index.yaml
文件中:频道条目示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 确定在
<operator_name>
之后、版本v
中包含句点 (.
)。否则,条目无法传递opm validate
命令。
验证基于文件的目录:
针对目录目录运行
opm validate
命令:opm validate <catalog_dir>
$ opm validate <catalog_dir>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查错误代码是否为
0
:echo $?
$ echo $?
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
0
0
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
运行
podman build
命令构建目录镜像:podman build . \ -f <catalog_dir>.Dockerfile \ -t <registry>/<namespace>/<catalog_image_name>:<tag>
$ podman build . \ -f <catalog_dir>.Dockerfile \ -t <registry>/<namespace>/<catalog_image_name>:<tag>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将目录镜像推送到 registry:
如果需要,运行
podman login
命令与目标 registry 进行身份验证:podman login <registry>
$ podman login <registry>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行
podman push
命令来推送目录镜像:podman push <registry>/<namespace>/<catalog_image_name>:<tag>
$ podman push <registry>/<namespace>/<catalog_image_name>:<tag>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.7.3. 基于 SQLite 的目录 复制链接链接已复制到粘贴板!
Operator 目录的 SQLite 数据库格式是一个弃用的功能。弃用的功能仍然包含在 Red Hat OpenShift Service on AWS 中,并且仍然被支持。但是,弃用的功能可能会在以后的发行版本中被删除,且不建议在新的部署中使用。
有关 Red Hat OpenShift Service on AWS 中已弃用或删除的主要功能的最新列表,请参阅 Red Hat OpenShift Service on AWS 发行注记中已弃用和删除的功能 部分。
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> \ --tag <registry>/<namespace>/<index_image_name>:<tag> \ [--binary-image <registry_base_image>]
$ 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 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 将索引镜像推送到 registry。
如果需要,与目标 registry 进行身份验证:
podman login <registry>
$ podman login <registry>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 推送索引镜像:
podman push <registry>/<namespace>/<index_image_name>:<tag>
$ podman push <registry>/<namespace>/<index_image_name>:<tag>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.7.3.2. 更新基于 SQLite 的索引镜像 复制链接链接已复制到粘贴板!
在将 OperatorHub 配置为使用引用自定义索引镜像的目录源后,集群管理员可通过将捆绑包镜像添加到索引镜像来保持其集群上的可用 Operator 最新状态。
您可以使用 opm index add
命令来更新存在的索引镜像。
前提条件
-
已安装
opm
CLI。 -
您有
podman
版本 1.9.3+。 - 构建并推送到 registry 的索引镜像。
- 您有一个引用索引镜像的现有目录源。
流程
通过添加捆绑包镜像来更新现有索引:
opm index add \ --bundles <registry>/<namespace>/<new_bundle_image>@sha256:<digest> \ --from-index <registry>/<namespace>/<existing_index_image>:<existing_tag> \ --tag <registry>/<namespace>/<existing_index_image>:<updated_tag> \ --pull-tool podman
$ 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 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中:
<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
$ 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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 推送更新的索引镜像:
podman push <registry>/<namespace>/<existing_index_image>:<updated_tag>
$ podman push <registry>/<namespace>/<existing_index_image>:<updated_tag>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow Operator Lifecycle Manager(OLM)会在常规时间段内自动轮询目录源中引用的索引镜像,验证是否已成功添加新软件包:
oc get packagemanifests -n openshift-marketplace
$ oc get packagemanifests -n openshift-marketplace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
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 login <target_registry>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 确定您要包括在您的修剪索引中的软件包列表。
运行您要修剪容器中的源索引镜像。例如:
podman run -p50051:50051 \ -it registry.redhat.io/redhat/redhat-operator-index:v4
$ podman run -p50051:50051 \ -it registry.redhat.io/redhat/redhat-operator-index:v4
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
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
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
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在一个单独的终端会话中,使用
grpcurl
命令获取由索引提供的软件包列表:grpcurl -plaintext localhost:50051 api.Registry/ListPackages > packages.out
$ grpcurl -plaintext localhost:50051 api.Registry/ListPackages > packages.out
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查
package.out
文件,确定要保留在此列表中的哪个软件包名称。例如:软件包列表片断示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow -
在您执行
podman run
命令的终端会话中,按 Ctrl 和 C 停止容器进程。
运行以下命令来修剪指定软件包以外的所有源索引:
opm index prune \ -f registry.redhat.io/redhat/redhat-operator-index:v4 \ -p advanced-cluster-management,jaeger-product,quay-operator \ [-i registry.redhat.io/openshift4/ose-operator-registry-rhel9:v4] \ -t <target_registry>:<port>/<namespace>/redhat-operator-index:v4
$ 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-rhel9:v4] \
3 -t <target_registry>:<port>/<namespace>/redhat-operator-index:v4
4 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 运行以下命令将新索引镜像推送到目标 registry:
podman push <target_registry>:<port>/<namespace>/redhat-operator-index:v4
$ podman push <target_registry>:<port>/<namespace>/redhat-operator-index:v4
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 其中
<namespace>
是 registry 上的任何现有命名空间。
4.7.4. 目录源和 pod 安全准入 复制链接链接已复制到粘贴板!
Red Hat OpenShift Service on AWS 4.11 中引入了 Pod 安全准入,以确保 pod 安全标准。使用基于 SQLite 的目录格式构建的目录源,并在 Red Hat OpenShift Service on AWS 4.11 无法在受限 pod 安全强制下运行 opm
CLI 工具的版本。
在 Red Hat OpenShift Service on AWS 4 中,命名空间默认没有受限 pod 安全强制,默认的目录源安全模式设置为 legacy
。
计划在以后的 Red Hat OpenShift Service on AWS 发行版本中包括所有命名空间的默认限制强制。当发生受限强制时,目录源 pod 规格的安全上下文必须与受限 pod 安全标准匹配。如果您的目录源镜像需要不同的 pod 安全标准,则必须明确设置命名空间的 pod 安全准入标签。
如果您不想以受限方式运行基于 SQLite 的目录源 pod,则不需要更新 Red Hat OpenShift Service on AWS 4 中的目录源。
但是,建议您采取措施来确保目录源在受限 pod 安全强制下运行。如果您不采取措施来确保目录源在受限 pod 安全强制下运行,您的目录源可能不会在以后的 Red Hat OpenShift Service on AWS 版本中运行。
作为目录作者,您可以通过完成以下任一操作来启用与受限 pod 安全强制的兼容性:
- 将您的目录迁移到基于文件的目录格式。
-
使用 Red Hat OpenShift Service on AWS 4.11 或更高版本的
opm
CLI 工具版本更新您的目录镜像。
SQLite 数据库目录格式已弃用,但仍然被红帽支持。在以后的发行版本中,不支持 SQLite 数据库格式,目录将需要迁移到基于文件的目录格式。从 Red Hat OpenShift Service on AWS 4.11 开始,默认的红帽提供的 Operator 目录以基于文件的目录格式发布。基于文件的目录与受限 pod 安全强制兼容。
如果您不想更新 SQLite 数据库目录镜像,或将目录迁移到基于文件的目录格式,您可以将目录配置为使用升级的权限运行。
4.7.4.2. 重建 SQLite 数据库目录镜像 复制链接链接已复制到粘贴板!
您可以使用您的 Red Hat OpenShift Service on AWS 版本发布的 opm
CLI 工具的最新版本重建 SQLite 数据库目录镜像。
前提条件
- 您有一个 SQLite 数据库目录源。
-
您可以使用具有
cluster-admin
角色的用户访问集群。 -
您有工作站上 Red Hat OpenShift Service on AWS 4 发布的
opm
CLI 工具的最新版本。
流程
运行以下命令,使用
opm
CLI 工具的最新版本重建目录:opm index add --binary-image \ registry.redhat.io/openshift4/ose-operator-registry-rhel9:v4 \ --from-index <your_registry_image> \ --bundles "" -t \<your_registry_image>
$ opm index add --binary-image \ registry.redhat.io/openshift4/ose-operator-registry-rhel9:v4 \ --from-index <your_registry_image> \ --bundles "" -t \<your_registry_image>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.7.4.3. 配置目录以使用升级的权限运行 复制链接链接已复制到粘贴板!
如果您不想更新 SQLite 数据库目录镜像,或将目录迁移到基于文件的目录格式,您可以执行以下操作以确保目录源在默认 pod 安全强制更改为受限时运行:
- 在目录源定义中手动将目录安全模式设置为 legacy。此操作可确保您的目录使用旧权限运行,即使默认目录安全模式更改为 restricted。
- 为基准或特权 pod 安全强制标记目录源命名空间。
SQLite 数据库目录格式已弃用,但仍然被红帽支持。在以后的发行版本中,不支持 SQLite 数据库格式,目录将需要迁移到基于文件的目录格式。基于文件的目录与受限 pod 安全强制兼容。
前提条件
- 您有一个 SQLite 数据库目录源。
-
您可以使用具有
cluster-admin
角色的用户访问集群。 -
您有一个目标命名空间,它支持运行带有提升的 pod 安全准入标准
baseline
或privileged
的 pod。
流程
通过将
spec.grpcPodConfig.securityContextConfig
标签设置为legacy
来编辑CatalogSource
定义,如下例所示:CatalogSource
定义示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow 提示在 Red Hat OpenShift Service on AWS 4 中,
spec.grpcPodConfig.securityContextConfig
字段默认设置为legacy
。在以后的 Red Hat OpenShift Service on AWS 发行版本中,计划默认设置将更改为restricted
。如果您的目录无法在受限强制下运行,建议您手动将此字段设置为legacy
。编辑
<namespace>.yaml
文件,将升级的 pod 安全准入标准添加到目录源命名空间中,如下例所示:<namespace>.yaml
文件示例Copy to Clipboard Copied! Toggle word wrap Toggle overflow
4.7.5. 在集群中添加目录源 复制链接链接已复制到粘贴板!
在 Red Hat OpenShift Service on AWS 集群中添加目录源可为用户发现和安装 Operator。集群管理员可以创建一个 CatalogSource
对象来引用索引镜像。OperatorHub 使用目录源来填充用户界面。
或者,您可以使用 Web 控制台管理目录源。在 Administration
前提条件
- 构建并推送索引镜像到 registry。
-
您可以使用具有
cluster-admin
角色的用户访问集群。
流程
创建一个
CatalogSource
对象来引用索引镜像。根据您的规格修改以下内容,并将它保存为
catalogSource.yaml
文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 如果您希望目录源对所有命名空间中的用户全局可用,请指定
openshift-marketplace
命名空间。否则,您可以指定一个不同的命名空间来对目录进行作用域并只对该命名空间可用。 - 2
- 可选:将
olm.catalogImageTemplate
注解设置为索引镜像名称,并使用一个或多个 Kubernetes 集群版本变量,如为镜像标签构建模板时所示。 - 3
- 指定
legacy
或restricted
的值。如果没有设置该字段,则默认值为legacy
。在以后的 Red Hat OpenShift Service on AWS 发行版本中,计划默认值受到限制
。如果您的目录无法使用restricted
权限运行,建议您手动将此字段设置为legacy
。 - 4
- 指定索引镜像。如果您在镜像名称后指定了标签,如
:v4
,则目录源 Pod 会使用镜像 pull 策略Always
,这意味着 pod 始终在启动容器前拉取镜像。如果您指定了摘要,如@sha256:<id>
,则镜像拉取策略为IfNotPresent
,这意味着仅在节点上不存在的镜像时才拉取镜像。 - 5
- 指定发布目录的名称或机构名称。
- 6
- 目录源可以自动检查新版本以保持最新。
使用该文件创建
CatalogSource
对象:oc apply -f catalogSource.yaml
$ oc apply -f catalogSource.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
确定成功创建以下资源。
检查 pod:
oc get pods -n openshift-marketplace
$ oc get pods -n openshift-marketplace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME READY STATUS RESTARTS AGE my-operator-catalog-6njx6 1/1 Running 0 28s marketplace-operator-d9f549946-96sgr 1/1 Running 0 26h
NAME READY STATUS RESTARTS AGE my-operator-catalog-6njx6 1/1 Running 0 28s marketplace-operator-d9f549946-96sgr 1/1 Running 0 26h
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查目录源:
oc get catalogsource -n openshift-marketplace
$ oc get catalogsource -n openshift-marketplace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME DISPLAY TYPE PUBLISHER AGE my-operator-catalog My Operator Catalog grpc 5s
NAME DISPLAY TYPE PUBLISHER AGE my-operator-catalog My Operator Catalog grpc 5s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 检查软件包清单:
oc get packagemanifest -n openshift-marketplace
$ oc get packagemanifest -n openshift-marketplace
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
NAME CATALOG AGE jaeger-product My Operator Catalog 93s
NAME CATALOG AGE jaeger-product My Operator Catalog 93s
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
现在,您可以在 Red Hat OpenShift Service on AWS Web 控制台中通过 OperatorHub 安装 Operator。
4.7.6. 删除自定义目录 复制链接链接已复制到粘贴板!
作为具有 dedicated-admin
角色的管理员,您可以通过删除相关的目录源来删除之前添加到集群中的自定义 Operator 目录。
先决条件
-
您可以使用具有
dedicated-admin
角色的用户访问集群。
流程
-
在 Web 控制台的 Administrator 视角中,进入到 Home
Search。 - 从 Project: 列表中选择一个项目。
- 从 Resources 列表中选择 CatalogSource。
-
选择您要删除的目录的 Options 菜单
,然后点 Delete CatalogSource。