$ mkdir <catalog_dir>
拥有dedicated-admin
角色的管理员和 Operator 目录维护者可以在 OpenShift Dedicated 中的 Operator 生命周期管理器 (OLM) 上创建和管理使用bundle 格式打包的自定义目录。
Kubernetes 定期弃用某些 API,这些 API 会在后续版本中删除。因此,Operator 将无法从使用删除了该 API 的 Kubernetes 版本的 OpenShift Dedicated 版本开始使用已删除的 API。 如果您的集群正在使用自定义目录,请参阅控制 Operator 与 OpenShift Dedicated 版本的兼容性,了解 Operator 作者如何更新其项目以帮助避免工作负载问题并防止不兼容的升级。 |
您已安装opm
CLI。
基于文件的目录是 Operator 生命周期管理器 (OLM) 中目录格式的最新迭代。它是早期 SQLite 数据库格式的基于纯文本(JSON 或 YAML)且声明式的配置演变,并且完全向后兼容。
从 OpenShift Dedicated 4.11 开始,默认的 Red Hat 提供的 Operator 目录以基于文件的目录格式发布。OpenShift Dedicated 4.6 到 4.10 的默认 Red Hat 提供的 Operator 目录以已弃用的 SQLite 数据库格式发布。 与 SQLite 数据库格式相关的 许多用于处理 SQLite 数据库格式的 |
您可以使用opm
CLI 创建一个使用纯文本基于文件的目录格式(JSON 或 YAML)的目录镜像,该格式取代了已弃用的 SQLite 数据库格式。
您已安装opm
CLI。
您的podman
版本为 1.9.3+。
已构建 bundle 镜像并将其推送到支持Docker v2-2的注册表。
初始化目录
通过运行以下命令创建目录的目录
$ mkdir <catalog_dir>
生成一个Dockerfile,可以通过运行opm generate dockerfile
命令来构建目录镜像。
$ opm generate dockerfile <catalog_dir> \
-i registry.redhat.io/openshift4/ose-operator-registry-rhel9:v (1)
1 | 使用-i 标志指定官方的Red Hat基础镜像,否则Dockerfile将使用默认的上游镜像。 |
Dockerfile必须与您在先前步骤中创建的目录目录位于同一个父目录下。
. (1)
├── <catalog_dir> (2)
└── <catalog_dir>.Dockerfile (3)
1 | 父目录 |
2 | 目录目录 |
3 | 由opm generate dockerfile 命令生成的Dockerfile |
通过运行opm init
命令,使用包定义填充您的操作符目录。
$ 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)
1 | 操作符(或包)名称 |
2 | 如果未指定,订阅默认使用的通道 |
3 | 操作符README.md 或其他文档的路径 |
4 | 操作符图标的路径 |
5 | 输出格式:JSON或YAML |
6 | 创建目录配置文件的路径 |
此命令在指定的目录配置文件中生成一个olm.package
声明式配置块。
通过运行opm render
命令将bundle添加到目录中。
$ opm render <registry>/<namespace>/<bundle_image_name>:<tag> \ (1)
--output=yaml \
>> <catalog_dir>/index.yaml (2)
1 | bundle镜像的拉取规范 |
2 | 目录配置文件的路径 |
通道必须至少包含一个bundle。 |
添加bundle的通道条目。例如,根据您的具体情况修改以下示例,并将其添加到您的<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>
将目录镜像推送到注册表。
如果需要,通过运行podman login
命令对目标注册表进行身份验证。
$ podman login <registry>
通过运行podman push
命令推送目录镜像。
$ podman push <registry>/<namespace>/<catalog_image_name>:<tag>
您可以使用opm
CLI 更新或过滤使用基于文件目录格式的目录镜像。通过提取现有目录镜像的内容,您可以根据需要修改目录,例如:
添加包
删除包
更新现有包条目
详细说明每个包、通道和bundle的弃用消息
然后,您可以将镜像重新构建为目录的更新版本。
您的工作站上有以下内容:
opm
CLI。
podman
版本 1.9.3+。
基于文件的目录镜像。
您工作站上最近初始化的与该目录相关的目录结构。
如果您没有初始化的目录目录,请创建该目录并生成Dockerfile。有关更多信息,请参阅“创建基于文件的目录镜像”过程中的“初始化目录”步骤。
将目录镜像的内容以YAML格式提取到目录目录中的index.yaml
文件。
$ opm render <registry>/<namespace>/<catalog_image_name>:<tag> \
-o yaml > <catalog_dir>/index.yaml
或者,您可以使用 |
根据您的规范修改生成的index.yaml
文件的内容。
假设在目录中发布bundle后,您的用户之一已安装它。请确保目录中所有以前发布的bundle都具有更新路径到当前或更新的通道头,以避免使安装了该版本的使用者陷入困境。 |
要添加操作符,请按照“创建基于文件的目录镜像”过程中创建包、bundle和通道条目的步骤操作。
要删除操作符,请删除与该包相关的olm.package
、olm.channel
和olm.bundle
blob 集。以下示例显示必须删除的一组内容,以便从目录中删除example-operator
包。
---
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
---
要添加或更新操作符的弃用消息,请确保在与包的index.yaml
文件相同的目录中存在deprecations.yaml
文件。有关deprecations.yaml
文件格式的信息,请参阅“olm.deprecations 模式”。
保存您的更改。
验证目录
$ opm validate <catalog_dir>
重新构建目录
$ podman build . \
-f <catalog_dir>.Dockerfile \
-t <registry>/<namespace>/<catalog_image_name>:<tag>
将更新的目录镜像推送到注册表
$ podman push <registry>/<namespace>/<catalog_image_name>:<tag>
在 Web 控制台中,导航到**管理**→**集群设置**→**配置**页面中的 OperatorHub 配置资源。
添加目录源或更新现有目录源以使用更新的目录镜像的拉取规范。
有关更多信息,请参阅本节“其他资源”中的“将目录源添加到集群”。
目录源处于**就绪**状态后,导航到**操作符**→**OperatorHub**页面,并检查您所做的更改是否反映在操作符列表中。
操作符目录的SQLite数据库格式是一个已弃用的功能。已弃用的功能仍在 OpenShift Dedicated 中包含,并继续得到支持;但是,它将在该产品的未来版本中删除,并且不建议用于新的部署。 有关 OpenShift Dedicated 中已弃用或删除的主要功能的最新列表,请参阅 OpenShift Dedicated 发行说明的“已弃用和删除的功能”部分。 |
您可以使用opm
CLI 创建基于SQLite数据库格式的索引镜像。
您已安装opm
CLI。
您的podman
版本为 1.9.3+。
已构建 bundle 镜像并将其推送到支持Docker v2-2的注册表。
启动一个新的索引
$ 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)
1 | 要添加到索引的bundle镜像的逗号分隔列表。 |
2 | 您希望索引镜像具有的镜像标签。 |
3 | 可选:用于提供目录的替代注册表基础镜像。 |
将索引镜像推送到注册表。
如果需要,请对目标注册表进行身份验证
$ podman login <registry>
推送索引镜像
$ podman push <registry>/<namespace>/<index_image_name>:<tag>
在将 OperatorHub 配置为使用引用自定义索引镜像的目录源后,具有dedicated-admin
角色的管理员可以通过向索引镜像添加bundle镜像来保持集群上可用的操作符最新。
您可以使用opm index add
命令更新现有的索引镜像。
您已安装opm
CLI。
您的podman
版本为 1.9.3+。
将构建索引镜像并推送到注册表。
您有一个引用索引镜像的现有目录源。
通过添加bundle镜像来更新现有索引
$ 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)
1 | --bundles 标志指定要添加到索引的其他bundle镜像的逗号分隔列表。 |
2 | --from-index 标志指定先前推送的索引。 |
3 | --tag 标志指定要应用于更新的索引镜像的镜像标签。 |
4 | --pull-tool 标志指定用于拉取容器镜像的工具。 |
其中
<registry>
指定注册表的 hostname,例如quay.io
或mirror.example.com
。
<namespace>
指定注册表的命名空间,例如ocs-dev
或abc
。
<new_bundle_image>
指定要添加到注册表的新的bundle镜像,例如ocs-operator
。
<digest>
指定bundle镜像的 SHA 镜像 ID 或摘要,例如c7f11097a628f092d8bad148406aa0e0951094a03445fd4bc0775431ef683a41
。
<existing_index_image>
指定先前推送的镜像,例如abc-redhat-operator-index
。
<existing_tag>
指定先前推送的镜像标签,例如。
<updated_tag>
指定要应用于更新的索引镜像的镜像标签,例如.1
。
$ opm index add \
--bundles quay.io/ocs-dev/ocs-operator@sha256:c7f11097a628f092d8bad148406aa0e0951094a03445fd4bc0775431ef683a41 \
--from-index mirror.example.com/abc/abc-redhat-operator-index: \
--tag mirror.example.com/abc/abc-redhat-operator-index:.1 \
--pull-tool podman
推送更新的索引镜像
$ podman push <registry>/<namespace>/<existing_index_image>:<updated_tag>
在操作符生命周期管理器 (OLM) 自动轮询目录源中引用的索引镜像在其定期间隔后,请验证新包是否已成功添加。
$ oc get packagemanifests -n openshift-marketplace
索引镜像基于 Operator bundle 格式,是 Operator 目录的容器化快照。您可以过滤或 *修剪* 索引,只保留指定的软件包列表,从而创建一个只包含所需 Operator 的源索引副本。
您的podman
版本为 1.9.3+。
您已拥有 grpcurl
(第三方命令行工具)。
您已安装opm
CLI。
您可以访问支持 Docker v2-2 的注册表。
使用目标注册表进行身份验证。
$ podman login <target_registry>
确定要包含在修剪后的索引中的软件包列表。
在一个容器中运行要修剪的源索引镜像。例如:
$ podman run -p50051:50051 \
-it registry.redhat.io/redhat/redhat-operator-index:v
Trying to pull registry.redhat.io/redhat/redhat-operator-index:v...
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
检查 packages.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:v \(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:v (4)
1 | 要修剪的索引。 |
2 | 要保留的软件包的逗号分隔列表。 |
3 | 仅适用于 IBM Power® 和 IBM Z® 镜像:与目标 OpenShift Dedicated 集群主次版本匹配的标签的 Operator 注册表基础镜像。 |
4 | 正在构建的新索引镜像的自定义标签。 |
运行以下命令将新的索引镜像推送到目标注册表:
$ podman push <target_registry>:<port>/<namespace>/redhat-operator-index:v
其中 <namespace>
是注册表上任何现有的命名空间。
Pod 安全准入 在 OpenShift Dedicated 4.11 中引入,以确保 Pod 安全标准。使用基于 SQLite 的目录格式和 OpenShift Dedicated 4.11 之前发布的 opm
CLI 工具版本的目录源无法在受限的 Pod 安全执行下运行。
在 OpenShift Dedicated 中,命名空间默认情况下没有受限的 Pod 安全执行,并且默认目录源安全模式设置为 legacy
。
计划在未来的 OpenShift Dedicated 版本中包含所有命名空间的默认受限执行。当发生受限执行时,目录源 Pod 的 Pod 规范的安全上下文必须与受限 Pod 安全标准匹配。如果您的目录源镜像需要不同的 Pod 安全标准,则必须显式设置命名空间的 Pod 安全准入标签。
如果您不想将基于 SQLite 的目录源 Pod 作为受限 Pod 运行,则无需更新 OpenShift Dedicated 中的目录源。 但是,建议您立即采取措施以确保您的目录源在受限 Pod 安全执行下运行。如果您不采取措施以确保您的目录源在受限 Pod 安全执行下运行,您的目录源可能无法在未来的 OpenShift Dedicated 版本中运行。 |
作为目录作者,您可以通过完成以下任一操作来启用与受限 Pod 安全执行的兼容性:
将您的目录迁移到基于文件的目录格式。
使用 OpenShift Dedicated 4.11 或更高版本发布的 opm
CLI 工具版本更新您的目录镜像。
SQLite 数据库目录格式已弃用,但 Red Hat 仍然支持。在未来的版本中,将不支持 SQLite 数据库格式,目录将需要迁移到基于文件的目录格式。从 OpenShift Dedicated 4.11 开始,默认的 Red Hat 提供的 Operator 目录以基于文件的目录格式发布。基于文件的目录与受限 Pod 安全执行兼容。 |
如果您不想更新 SQLite 数据库目录镜像或将目录迁移到基于文件的目录格式,您可以配置您的目录以提升权限运行。
您可以将已弃用的 SQLite 数据库格式目录更新为基于文件的目录格式。
您有一个 SQLite 数据库目录源。
您可以作为具有 dedicated-admin
角色的用户访问集群。
您的工作站上有 OpenShift Dedicated 发布的最新版本 opm
CLI 工具。
通过运行以下命令将 SQLite 数据库目录迁移到基于文件的目录:
$ opm migrate <registry_image> <fbc_directory>
通过运行以下命令为基于文件的目录生成 Dockerfile:
$ opm generate dockerfile <fbc_directory> \
--binary-image \
registry.redhat.io/openshift4/ose-operator-registry:v
生成的 Dockerfile 可以构建、标记并推送到您的注册表。
您可以使用与您的 OpenShift Dedicated 版本一起发布的最新版本的 opm
CLI 工具重新构建您的 SQLite 数据库目录镜像。
您有一个 SQLite 数据库目录源。
您可以作为具有 dedicated-admin
角色的用户访问集群。
您的工作站上有 OpenShift Dedicated 发布的最新版本 opm
CLI 工具。
运行以下命令使用更新版本的 opm
CLI 工具重新构建您的目录:
$ opm index add --binary-image \
registry.redhat.io/openshift4/ose-operator-registry:v \
--from-index <your_registry_image> \
--bundles "" -t \<your_registry_image>
如果您不想更新 SQLite 数据库目录镜像或将目录迁移到基于文件的目录格式,您可以执行以下操作以确保在默认 Pod 安全执行更改为受限时目录源运行:
在您的目录源定义中手动将目录安全模式设置为 legacy。此操作可确保您的目录即使在默认目录安全模式更改为受限后也能使用旧版权限运行。
为基线或特权 Pod 安全执行标记目录源命名空间。
SQLite 数据库目录格式已弃用,但 Red Hat 仍然支持。在未来的版本中,将不支持 SQLite 数据库格式,目录将需要迁移到基于文件的目录格式。基于文件的目录与受限 Pod 安全执行兼容。 |
您有一个 SQLite 数据库目录源。
您可以作为具有 dedicated-admin
角色的用户访问集群。
您有一个目标命名空间,支持运行具有 baseline
或 privileged
提升的 Pod 安全准入标准的 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 中, |
编辑您的 <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>"
1 | 通过向命名空间添加 security.openshift.io/scc.podSecurityLabelSync=false 标签来关闭 Pod 安全标签同步。 |
2 | 应用 Pod 安全准入 pod-security.kubernetes.io/enforce 标签。将标签设置为 baseline 或 privileged 。除非命名空间中的其他工作负载需要 privileged 配置文件,否则请使用 baseline Pod 安全配置文件。 |
将目录源添加到 OpenShift Dedicated 集群中,可以使用户能够发现和安装 Operators。拥有 `dedicated-admin` 角色的管理员可以创建引用索引镜像的 `CatalogSource` 对象。OperatorHub 使用目录源来填充用户界面。
或者,您可以使用 Web 控制台管理目录源。在 **首页** → **搜索** 页面中,选择一个项目,单击 **资源** 下拉菜单并搜索 `CatalogSource`。您可以创建、更新、删除、禁用和启用各个源。 |
您已构建并向注册表推送了索引镜像。
您可以作为具有 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 | 指定您的索引镜像。如果您在镜像名称后指定了一个标签,例如 `:v`,则目录源 Pod 将使用 `Always` 的镜像拉取策略,这意味着 Pod 始终会在启动容器之前拉取镜像。如果您指定了一个摘要,例如 `@sha256: |
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** 页面安装 Operators 了。