$ mkdir <catalog_dir>
拥有dedicated-admin
角色的管理员和 Operator 目录维护者可以在 AWS 上的 Red Hat OpenShift Service 中,使用bundle 格式创建和管理 Operator Lifecycle Manager (OLM) 打包的自定义目录。
Kubernetes 定期弃用某些 API,这些 API 会在后续版本中移除。结果是,从使用移除该 API 的 Kubernetes 版本的 AWS 上 Red Hat OpenShift Service 版本开始,Operator 将无法使用已移除的 API。 如果您的集群使用自定义目录,请参阅控制 Operator 与 AWS 上 Red Hat OpenShift Service 版本的兼容性,了解 Operator 作者如何更新其项目以帮助避免工作负载问题并防止不兼容的升级。 |
您已安装opm
CLI。
基于文件的目录是 Operator Lifecycle Manager (OLM) 中目录格式的最新迭代。它是早期 SQLite 数据库格式的基于纯文本(JSON 或 YAML)且声明式的配置演变,并且完全向后兼容。
从 AWS 上的 Red Hat OpenShift Service 4.11 开始,默认提供的 Red Hat Operator 目录以基于文件的目录格式发布。AWS 上 Red Hat OpenShift Service 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>
通过运行opm generate dockerfile
命令生成可以构建目录镜像的 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
命令使用您的 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)
1 | Operator 或包名称 |
2 | 如果未指定,则订阅默认使用的通道 |
3 | Operator 的README.md 或其他文档的路径 |
4 | Operator 图标的路径 |
5 | 输出格式:JSON 或 YAML |
6 | 创建目录配置文件的路径 |
此命令在指定的目录配置文件中生成olm.package
声明式配置 Blob。
通过运行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 更新或过滤使用基于文件的目录格式的目录镜像。通过提取现有目录镜像的内容,您可以根据需要修改目录,例如:
添加包
删除包
更新现有软件包条目
详细说明每个软件包、通道和捆绑包的弃用消息
然后,您可以将镜像重建为目录的更新版本。
您的工作站上有以下内容:
opm
命令行界面。
podman
版本 1.9.3+。
基于文件的目录镜像。
最近在您的工作站上初始化的与该目录相关的目录结构。
如果您没有初始化的目录,请创建目录并生成 Dockerfile。有关更多信息,请参阅“创建基于文件的目录镜像”过程中的“初始化目录”步骤。
将目录镜像的内容以 YAML 格式提取到目录中的 index.yaml
文件中
$ opm render <registry>/<namespace>/<catalog_image_name>:<tag> \
-o yaml > <catalog_dir>/index.yaml
或者,您可以使用 |
根据您的规范修改生成的 index.yaml
文件的内容
在目录中发布捆绑包后,假设您的一个用户已安装它。确保目录中所有先前发布的捆绑包都具有到当前或更新的通道头的更新路径,以避免使已安装该版本的用户的资源搁浅。 |
要添加 Operator,请按照“创建基于文件的目录镜像”过程中创建软件包、捆绑包和通道条目的步骤操作。
要删除 Operator,请删除与软件包相关的 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
---
要添加或更新 Operator 的弃用消息,请确保在与软件包的 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 配置资源。
添加目录源或更新现有目录源以使用更新的目录镜像的拉取规范。
有关更多信息,请参阅本节“其他资源”中的“向集群添加目录源”。
目录源处于**就绪**状态后,导航到**Operators**→**OperatorHub**页面,并检查您所做的更改是否反映在 Operators 列表中。
Operator 目录的 SQLite 数据库格式是一个已弃用的功能。已弃用的功能仍然包含在 Red Hat OpenShift Service on AWS 中,并继续得到支持;但是,它将在该产品的未来版本中删除,不建议用于新部署。 有关 Red Hat OpenShift Service on AWS 中已弃用或删除的主要功能的最新列表,请参阅 Red Hat OpenShift Service on AWS 发行说明中的已弃用和已删除的功能部分。 |
您可以使用 opm
命令行界面创建基于 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 | 要添加到索引的捆绑镜像的逗号分隔列表。 |
2 | 您希望索引镜像具有的镜像标签。 |
3 | 可选:用于提供目录的替代注册表基础镜像。 |
将索引镜像推送到注册表。
如果需要,请使用目标注册表进行身份验证
$ podman login <registry>
推送索引镜像
$ podman push <registry>/<namespace>/<index_image_name>:<tag>
在将 OperatorHub 配置为使用引用自定义索引镜像的目录源后,具有 dedicated-admin
角色的管理员可以通过向索引镜像添加捆绑镜像来保持集群上可用的 Operators 最新。
您可以使用 opm index add
命令更新现有的索引镜像。
您已安装opm
CLI。
您的podman
版本为 1.9.3+。
索引镜像被构建并推送到注册表。
您有一个现有的目录源引用索引镜像。
通过添加捆绑镜像来更新现有索引
$ 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 标志指定要添加到索引的附加捆绑镜像的逗号分隔列表。 |
2 | --from-index 标志指定先前推送的索引。 |
3 | --tag 标志指定要应用于更新的索引镜像的镜像标签。 |
4 | --pull-tool 标志指定用于拉取容器镜像的工具。 |
其中
<registry>
指定注册表的 hostname,例如 quay.io
或 mirror.example.com
。
<namespace>
指定注册表的命名空间,例如 ocs-dev
或 abc
。
<new_bundle_image>
指定要添加到注册表的新的捆绑镜像,例如 ocs-operator
。
<digest>
指定捆绑镜像的 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>
在 Operator 生命周期管理器 (OLM) 自动轮询目录源中引用的索引镜像时,请验证新软件包是否已成功添加。
$ oc get packagemanifests -n openshift-marketplace
基于 Operator 捆绑包格式的索引镜像是 Operator 目录的容器化快照。您可以过滤或修剪除指定软件包列表之外的所有索引,这将创建仅包含所需 Operators 的源索引的副本。
您的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® 镜像需要:与目标 Red Hat OpenShift Service on AWS 集群主版本和次版本匹配的标签的 Operator 注册表基础镜像。 |
4 | 正在构建的新索引镜像的自定义标签。 |
运行以下命令将新的索引镜像推送到目标注册表
$ podman push <target_registry>:<port>/<namespace>/redhat-operator-index:v
其中 <namespace>
是注册表上的任何现有命名空间。
在 Red Hat OpenShift Service on AWS 4.11 中引入了Pod 安全准入,以确保 Pod 安全标准。使用基于 SQLite 的目录格式和在 Red Hat OpenShift Service on AWS 4.11 之前发布的 opm
CLI 工具版本的目录源无法在受限制的 Pod 安全强制执行下运行。
在 AWS 上的 Red Hat OpenShift Service 中,命名空间默认情况下没有受限的 Pod 安全强制执行,并且默认的目录源安全模式设置为legacy
。
计划在未来的 AWS 上的 Red Hat OpenShift Service 版本中包含所有命名空间的默认受限强制执行。当发生受限强制执行时,目录源 Pod 的 Pod 规范的安全上下文必须与受限 Pod 安全标准匹配。如果您的目录源镜像需要不同的 Pod 安全标准,则必须显式设置命名空间的 Pod 安全准入标签。
如果您不想将基于 SQLite 的目录源 Pod 作为受限运行,则无需更新您在 AWS 上的 Red Hat OpenShift Service 中的目录源。 但是,建议您立即采取措施以确保您的目录源在受限 Pod 安全强制执行下运行。如果您不采取措施确保您的目录源在受限 Pod 安全强制执行下运行,则您的目录源可能无法在未来的 AWS 上的 Red Hat OpenShift Service 版本中运行。 |
作为目录作者,您可以通过完成以下任一操作来启用与受限 Pod 安全强制执行的兼容性
将您的目录迁移到基于文件的目录格式。
使用 AWS 上的 Red Hat OpenShift Service 4.11 或更高版本随附的opm
CLI 工具版本更新您的目录镜像。
SQLite 数据库目录格式已弃用,但 Red Hat 仍支持。在将来的版本中,将不支持 SQLite 数据库格式,目录将需要迁移到基于文件的目录格式。从 AWS 上的 Red Hat OpenShift Service 4.11 开始,默认的 Red Hat 提供的 Operator 目录以基于文件的目录格式发布。基于文件的目录与受限 Pod 安全强制执行兼容。 |
如果您不想更新您的 SQLite 数据库目录镜像或将您的目录迁移到基于文件的目录格式,您可以配置您的目录以提升权限运行。
您可以将已弃用的 SQLite 数据库格式目录更新为基于文件的目录格式。
您有一个 SQLite 数据库目录源。
您可以作为具有dedicated-admin
角色的用户访问集群。
您的工作站上有 AWS 上的 Red Hat OpenShift Service 发布的最新版本的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 可以构建、标记并推送到您的注册表。
您可以使用 AWS 上的 Red Hat OpenShift Service 版本随附的最新版本的opm
CLI 工具重建您的 SQLite 数据库目录镜像。
您有一个 SQLite 数据库目录源。
您可以作为具有dedicated-admin
角色的用户访问集群。
您的工作站上有 AWS 上的 Red Hat OpenShift Service 发布的最新版本的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
在 AWS 上的 Red Hat OpenShift Service 中, |
编辑您的<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 安全配置文件。 |
将目录源添加到 AWS 上的 Red Hat OpenShift Service 集群中,可以使用户发现和安装 Operator。具有dedicated-admin
角色的管理员可以创建引用索引镜像的CatalogSource
对象。OperatorHub 使用目录源来填充用户界面。
或者,您可以使用 Web 控制台来管理目录源。在**主页**→**搜索**页面中,选择一个项目,单击**资源**下拉菜单并搜索 |
您已构建并向注册表推送了索引镜像。
您可以作为具有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 。在 AWS 上的 Red Hat OpenShift Service 的未来版本中,计划将默认值更改为restricted 。如果您的目录无法使用restricted 权限运行,建议您手动将此字段设置为legacy 。 |
4 | 指定您的索引镜像。如果您在镜像名称后指定一个标签,例如:v ,则目录源 Pod 使用Always 的镜像拉取策略,这意味着 Pod 始终会在启动容器之前拉取镜像。如果您指定一个摘要,例如@sha256:<id> ,则镜像拉取策略为IfNotPresent ,这意味着 Pod 只有在节点上不存在该镜像时才会拉取它。 |
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
您现在可以从 AWS Web 控制台上的 Red Hat OpenShift Service 的**OperatorHub**页面安装 Operator。