扩展
使用 Operator Lifecycle Manager (OLM) v1 在 OpenShift Container Platform 中使用扩展。OLM v1 只是一个技术预览功能。
摘要
第 1 章 扩展概述
Operator Lifecycle Manager (OLM) v1 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
扩展可让集群管理员在其 OpenShift Container Platform 集群上为用户扩展功能。
自 OpenShift Container Platform 4 初始发行以来,Operator Lifecycle Manager (OLM) 已包含在 OpenShift Container Platform 4 中。OpenShift Container Platform 4.17 包括了一个面向下一代 OLM 操作的组件,作为正式发行 (GA)功能,在此阶段被称为 OLM v1。此更新的框架改变了很多属于以前版本的 OLM 的概念,并添加了新功能。
1.1. 亮点
管理员可以探索以下亮点:
- 支持 GitOps 工作流的全声明性模型
OLM v1 通过两个关键 API 简化扩展管理:
新的
ClusterExtension
API 简化了已安装的扩展的管理,其中包括通过registry+v1
捆绑包格式的 Operator,通过将面向用户的 API 整合到单个对象中。此 API 由新的 Operator Controller 组件作为clusterextension.olm.operatorframework.io
提供。管理员和 SRE 可使用 API 自动进程并使用 GitOps 原则定义所需状态。注意OLM v1 的早期技术预览阶段引入了一个新的
Operator
API;此 API 在 OpenShift Container Platform 4.16 中被重命名为ClusterExtension
,以解决以下改进:- 更准确地反映了扩展集群功能的简化功能
- 准确地代表了一个更灵活的打包格式
-
Cluster
前缀明确表示ClusterExtension
对象是集群范围的。这与现有的 OLM 不同,其中 Operator 可以是命名空间范围的或集群范围的
-
Catalog
API 由新 catalogd 组件提供,作为 OLM v1 的基础,为 on-cluster 客户端解包目录,以便用户可以发现可安装的内容,如 Kubernetes 扩展和 Operator。这可让您提高所有可用 Operator 捆绑包版本的可见性,包括它们的详情、频道和更新边缘。
重要目前,Operator Lifecycle Manager (OLM) v1 无法验证私有 registry,如红帽提供的 Operator 目录。这是个已知问题。因此,依赖 Red Hat Operator 目录的 OLM v1 流程无法正常工作。(OCPBUGS-36364)
如需更多信息,请参阅 Operator Controller 和 Catalogd。
- 改进了对扩展更新的控制
- 通过改进对目录内容的了解,管理员可以指定用于安装和更新的目标版本。这样,管理员可以更好地控制扩展更新的目标版本。如需更多信息,请参阅更新集群扩展。
- 灵活的扩展打包格式
管理员可以使用基于文件的目录来安装和管理扩展,如基于 OLM 的 Operator,与现有 OLM 经验类似。
另外,捆绑包大小不再受 etcd 值大小限制。如需更多信息,请参阅安装扩展。
- 安全目录通信
- OLM v1 使用 HTTPS 加密进行目录服务器响应。
1.2. 用途
Operator Lifecycle Manager (OLM) 的任务是集中管理集群扩展的生命周期,并在 Kubernetes 集群上以声明性的方式管理。其目的是在整个基础集群生命周期中,对集群管理员和平台即服务(PaaS)管理员的安装、运行和更新功能扩展变得简单、安全且可重复生成。
由 OpenShift Container Platform 4 启动的 OLM 的初始版本,默认包含在内,专注于为特定类型的集群扩展(称为 Operator)提供特殊支持。Operator 被归类为一个或多个 Kubernetes 控制器,与一个或多个 API 扩展(CustomResourceDefinition
(CRD)一起提供,以为集群提供额外的功能。
在生产环境集群中运行了多个版本后,OLM 的下一代产品旨在管理集群扩展(不仅限于 Operator)的生命周期。
第 2 章 架构
2.1. OLM v1 组件概述
Operator Lifecycle Manager (OLM) v1 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
Operator Lifecycle Manager (OLM) v1 由以下组件项目组成:
- Operator 控制器
- Operator Controller 是 OLM v1 的核心组件,它通过 API 扩展 Kubernetes,用户可以安装和管理 Operator 和扩展的生命周期。它消耗来自 catalogd 的信息。
- Catalogd
- Catalogd 是一个 Kubernetes 扩展,它解包基于文件的目录(FBC)内容,由容器镜像打包并提供,供集群客户端使用。作为 OLM v1 微服务架构的组件,用于由扩展作者打包的 Kubernetes 扩展的目录主机元数据,因此可帮助用户发现可安装的内容。
2.2. Operator 控制器
Operator Lifecycle Manager (OLM) v1 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
Operator Controller 是 Operator Lifecycle Manager (OLM) v1 的中央组件,它消耗其他 OLM v1 组件 catalogd。它使用一个 API 扩展 Kubernetes,用户可以安装 Operator 和扩展。
2.2.1. ClusterExtension API
Operator Controller 提供了一个新的 ClusterExtension
API 对象,它是一个代表安装扩展实例的单个资源,其中包括通过 registry+v1
捆绑包格式的 Operator。此 clusterextension.olm.operatorframework.io
API 通过将面向用户的 API 整合到单个对象来简化安装的扩展管理。
在 OLM v1 中,ClusterExtension
对象是集群范围的。这与现有 OLM 不同,根据相关 Subscription
和 OperatorGroup
对象的配置,Operator 可以是命名空间范围的或集群范围的。
如需有关之前行为的更多信息,请参阅多租户和 Operator 共处。
ClusterExtension
对象示例
apiVersion: olm.operatorframework.io/v1alpha1 kind: ClusterExtension metadata: name: <operator_name> spec: packageName: <package_name> installNamespace: <namespace_name> channel: <channel_name> version: <version_number>
2.2.1.1. 指定目标版本的自定义资源(CR)示例
在 Operator Lifecycle Manager (OLM) v1 中,集群管理员可以在自定义资源(CR)中声明性地设置 Operator 或扩展的目标版本。
您可以通过指定以下字段来定义目标版本:
- Channel
- 版本号
- 版本范围
如果您在 CR 中指定频道,OLM v1 会安装可在指定频道中解析的 Operator 或扩展的最新版本。当向指定的频道发布更新时,OLM v1 会自动更新至可以从频道解析的最新发行版本。
带有指定频道的 CR 示例
apiVersion: olm.operatorframework.io/v1alpha1
kind: ClusterExtension
metadata:
name: pipelines-operator
spec:
packageName: openshift-pipelines-operator-rh
installNamespace: <namespace_name>
serviceAccount:
name: <service_account>
channel: latest 1
- 1
- 安装可从指定频道解析的最新版本。对频道的更新会自动安装。
如果在 CR 中指定 Operator 或扩展的目标版本,OLM v1 将安装指定的版本。当在 CR 中指定目标版本时,OLM v1 在向目录发布更新时不会更改目标版本。
如果要更新集群中安装的 Operator 版本,您必须手动编辑 Operator 的 CR。指定 Operator 的目标版本将 Operator 的版本固定到指定的发行版本。
指定了目标版本的 CR 示例
apiVersion: olm.operatorframework.io/v1alpha1
kind: ClusterExtension
metadata:
name: pipelines-operator
spec:
packageName: openshift-pipelines-operator-rh
installNamespace: <namespace_name>
serviceAccount:
name: <service_account>
version: "1.11.1" 1
- 1
- 指定目标版本。如果要更新安装的 Operator 或扩展版本,您必须手动将 CR 更新至所需的目标版本。
如果要为 Operator 或扩展定义可接受的版本范围,您可以使用比较字符串指定版本范围。当您指定版本范围时,OLM v1 会安装可由 Operator Controller 解析的 Operator 或扩展的最新版本。
指定了版本范围的 CR 示例
apiVersion: olm.operatorframework.io/v1alpha1
kind: ClusterExtension
metadata:
name: pipelines-operator
spec:
packageName: openshift-pipelines-operator-rh
installNamespace: <namespace_name>
serviceAccount:
name: <service_account>
version: ">1.11.1" 1
- 1
- 指定所需的版本范围大于
1.11.1
版本。如需更多信息,请参阅"支持版本范围"。
创建或更新 CR 后,运行以下命令来应用配置文件:
命令语法
$ oc apply -f <extension_name>.yaml
2.2.2. 集群扩展的对象所有权
在 Operator Lifecycle Manager (OLM) v1 中,Kubernetes 对象一次只能由单个 ClusterExtension
对象所有。这样可确保 OpenShift Container Platform 集群中的对象一致管理,并防止尝试控制同一对象的多个集群扩展冲突。
2.2.2.1. 单个所有权
OLM v1 强制的核心所有权原则是每个对象只能有一个集群扩展作为其所有者。这可防止多个集群扩展重叠或冲突管理,确保每个对象仅与一个捆绑包关联。
单个所有权的影响
提供
CustomResourceDefinition
(CRD) 对象的捆绑包只能安装一次。捆绑包提供 CRD,它们是
ClusterExtension
对象的一部分。这意味着您只能在集群中安装捆绑包一次。尝试安装提供相同 CRD 的另一个捆绑包会导致失败,因为每个自定义资源只能有一个集群扩展作为其所有者。集群扩展无法共享对象。
OLM v1 的单所有者策略意味着集群扩展无法共享任何对象的所有权。如果一个集群扩展管理特定对象,如
Deployment
、CustomResourceDefinition
或Service
对象,则另一个集群扩展无法声明同一对象的所有权。尝试这样做会被 OLM v1 阻止。
2.2.2.2. 错误消息
当因为多个集群扩展试图管理同一对象而发生冲突时,Operator Controller 会返回一个错误消息,表示所有权冲突,如下所示:
错误信息示例
CustomResourceDefinition 'logfilemetricexporters.logging.kubernetes.io' already exists in namespace 'kubernetes-logging' and cannot be managed by operator-controller
错误消息表示对象已经由另一个集群扩展管理,且无法重新分配或共享。
2.2.2.3. 注意事项
作为集群或扩展管理员,请查看以下注意事项:
- 捆绑包的唯一性
- 确保提供相同 CRD 的 Operator 捆绑包不会多次安装。这可以防止因为所有权冲突造成潜在的安装失败。
- 避免对象共享
- 如果您需要不同的集群扩展才能与类似的资源交互,请确保它们管理单独的对象。由于单所有者强制,集群扩展无法共同管理同一对象。
2.3. Catalogd
Operator Lifecycle Manager (OLM) v1 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
Operator Lifecycle Manager (OLM) v1 使用 catalogd 组件及其资源来管理 Operator 和扩展目录。
目前,Operator Lifecycle Manager (OLM) v1 无法验证私有 registry,如红帽提供的 Operator 目录。这是个已知问题。因此,依赖 Red Hat Operator 目录的 OLM v1 流程无法正常工作。(OCPBUGS-36364)
2.3.1. 关于 OLM v1 中的目录
您可以使用 catalogd 组件查询 Kubernetes 扩展的目录,如 Operator 和控制器,从而发现可安装的内容。Catalogd 是一个 Kubernetes 扩展,为集群客户端解包目录内容,并是微服务的 Operator Lifecycle Manager (OLM) v1 套件的一部分。目前,catalogd 解包要打包并分发为容器镜像的目录内容。
如果您尝试安装没有唯一名称的 Operator 或扩展,则安装可能会失败,或者导致无法预计的结果。这是因为以下原因:
- 如果在集群中安装 mulitple 目录,Operator Lifecycle Manager (OLM) v1 不包含在安装 Operator 或扩展时指定目录的机制。
- OLM v1 要求在集群中安装的所有 Operator 和扩展都使用其捆绑包和软件包的唯一名称。
第 3 章 Operator Framework 常用术语表
Operator Lifecycle Manager (OLM) v1 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
以下与 Operator Framework 相关的术语,包括 Operator Lifecycle Manager (OLM) v1。
3.1. 常见 Operator Framework 术语
3.1.1. 捆绑包(Bundle)
在 Bundle Format 中,捆绑包是 Operator CSV、清单和元数据的集合。它们一起构成了可在集群中安装的 Operator 的唯一版本。
3.1.2. 捆绑包镜像
在 Bundle Format 中, 捆绑包镜像是一个从 Operator 清单中构建的容器镜像,其中包含一个捆绑包。捆绑包镜像由 Open Container Initiative (OCI) spec 容器 registry 存储和发布,如 Quay.io 或 DockerHub。
3.1.3. 目录源
目录源 catalog source 代表 OLM 可查询的元数据存储,以发现和安装 Operator 及其依赖项。
3.1.4. Channel
频道为 Operator 定义更新流,用于为订阅者推出更新。频道头指向该频道的最新版本。例如,stable
频道中会包含 Operator 的所有稳定版本,按由旧到新的顺序排列。
Operator 可以有几个频道,与特定频道绑定的订阅只会在该频道中查找更新。
3.1.5. 频道头
频道头是指特定频道中最新已知的更新。
3.1.6. 集群服务版本
集群服务版本(cluster service version,简称 CSV 是一个利用 Operator 元数据创建的 YAML 清单,可辅助 OLM 在集群中运行 Operator。它是 Operator 容器镜像附带的元数据,用于在用户界面填充徽标、描述和版本等信息。
此外,CSV 还是运行 Operator 所需的技术信息来源,类似于其需要的 RBAC 规则及其管理或依赖的自定义资源 (CR)。
3.1.7. 依赖项
Operator 可能会依赖于集群中存在的另一个 Operator。例如,Vault Operator 依赖于 etcd Operator 的数据持久性层。
OLM 通过确保在安装过程中在集群中安装 Operator 和 CRD 的所有指定版本来解决依赖关系。通过在目录中查找并安装满足所需 CRD API 且与软件包或捆绑包不相关的 Operator,解决这个依赖关系。
3.1.8. 索引镜像
在 Bundle Format 中, 索引镜像是一种数据库(数据库快照)镜像,其中包含关于 Operator 捆绑包(包括所有版本的 CSV 和 CRD)的信息。此索引可以托管集群中 Operator 的历史记录,并可使用 opm
CLI 工具添加或删除 Operator 来加以维护。
3.1.9. 安装计划
安装计划(install plan)是一个列出了为自动安装或升级 CSV 而需创建的资源的计算列表。
3.1.10. 多租户
OpenShift Container Platform 中的 租户 是为一组部署的工作负载(通常由命名空间或项目表示)共享共同访问权限和特权的用户或组。您可以使用租户在不同的组或团队之间提供一定程度的隔离。
当集群由多个用户或组共享时,它被视为 多租户 集群。
3.1.11. operator 组
Operator 组将部署在同一命名空间中的所有 Operator 配置为 OperatorGroup
对象,以便在一系列命名空间或集群范围内监视其 CR。
3.1.12. 软件包
在 Bundle Format 中,软件包是一个目录,其中包含每个版本的 Operator 的发布历史记录。CSV 清单中描述了发布的 Operator 版本和 CRD。
3.1.13. 容器镜像仓库(Registry)
Registry 是一个存储了 Operator 捆绑包镜像的数据库,每个都包含所有频道的最新和历史版本。
3.1.14. Subscription
订阅(subscription) 通过跟踪软件包中的频道来保持 CSV 最新。
3.1.15. 更新图表
更新图表将 CSV 的版本关联到一起,与其他打包软件的更新图表类似。可以依次安装 Operator,也可以跳过某些版本。只有在添加新版本时,更新图表才会在频道头上扩大。
第 4 章 目录
4.1. 基于文件的目录
Operator Lifecycle Manager (OLM) v1 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
OpenShift Container Platform 中的 Operator Lifecycle Manager (OLM) v1 支持 基于文件的目录来发现和源集群扩展,包括集群中的 Operator。
目前,Operator Lifecycle Manager (OLM) v1 无法验证私有 registry,如红帽提供的 Operator 目录。这是个已知问题。因此,依赖 Red Hat Operator 目录的 OLM v1 流程无法正常工作。(OCPBUGS-36364)
4.1.1. 亮点
基于文件的目录是 Operator Lifecycle Manager (OLM) 中目录格式的最新迭代。它是基于纯文本(JSON 或 YAML)和早期 SQLite 数据库格式的声明式配置演变,并且完全向后兼容。此格式的目标是启用 Operator 目录编辑、可组合性和可扩展性。
- 编辑
使用基于文件的目录,与目录内容交互的用户可以对格式进行直接更改,并验证其更改是否有效。由于这种格式是纯文本 JSON 或 YAML,因此目录维护人员可以通过手动或广泛支持的 JSON 或 YAML 工具(如
jq
CLI)轻松操作目录元数据。此可编辑功能启用以下功能和用户定义的扩展:
- 将现有捆绑包提升到新频道
- 更改软件包的默认频道
- 用于添加、更新和删除升级边缘的自定义算法
- Composability
基于文件的目录存储在任意目录层次结构中,从而启用目录组成。例如,考虑两个单独的基于文件的目录目录:
catalogA
和catalogB
。目录维护人员可以通过生成新目录catalogC
并将catalogA
和catalogB
复制到其中来创建新的组合目录。这种可组合性支持分散的目录。格式允许 Operator 作者维护特定于 Operator 的目录,它允许维护人员轻松构建由单个 Operator 目录组成的目录。基于文件的目录可以通过组合多个其他目录、提取一个目录的子集或两者的组合来组成。
注意不允许软件包中重复软件包和重复捆绑包。如果找到任何重复项,
opm validate
命令将返回错误。因为 Operator 作者最熟悉其 Operator、其依赖项及其升级兼容性,所以他们可以维护自己的 Operator 目录并直接控制其内容。对于基于文件的目录,Operator 作者负责在目录中构建和维护其软件包的任务。但是,复合目录维护者仅拥有在其目录中管理软件包并将目录发布到用户的任务。
- 可扩展性
基于文件的目录规格是目录的一个低级别表示。虽然目录维护器可以直接以低级形式维护,但目录维护人员可以在其自己的自定义工具上构建有趣的扩展,以供其自身的自定义工具用于实现任意数量的变异。
例如,工具可以将一个高级 API (如
(mode=semver)
) 转换为升级边缘基于文件的低级别目录格式。或目录维护人员可能需要通过添加新属性到符合特定标准的捆绑包来自定义所有捆绑包元数据。虽然这种可扩展性允许在低级别 API 上开发额外的官方工具,用于将来的 OpenShift Container Platform 版本,但目录维护人员也具有此功能。
4.1.2. 目录结构
基于文件的目录可从基于目录的文件系统进行存储和加载。opm
CLI 通过遍历根目录并递归到子目录来加载目录。CLI 尝试加载它找到的每个文件,如果发生错误,则会失败。
可以使用 .indexignore
文件忽略非目录文件,这些文件对模式和优先级与 .gitignore
文件具有相同的规则。
示例 .indexignore
文件
# Ignore everything except non-object .json and .yaml files **/* !*.json !*.yaml **/objects/*.json **/objects/*.yaml
目录维护人员具有选择所需的布局的灵活性,但建议将每个软件包基于文件的目录 Blob 存储在单独的子目录中。每个单独的文件可以是 JSON 或 YAML;目录中的每一文件并不需要使用相同的格式。
基本推荐结构
catalog ├── packageA │ └── index.yaml ├── packageB │ ├── .indexignore │ ├── index.yaml │ └── objects │ └── packageB.v0.1.0.clusterserviceversion.yaml └── packageC └── index.json └── deprecations.yaml
此推荐结构具有目录层次结构中的每个子目录都是自包含目录的属性,它使得目录组成、发现和导航简单文件系统操作。通过将目录复制到父目录的根目录,目录也可以包含在父目录中。
4.1.3. 模式
基于文件的目录使用基于 CUE 语言规范 的格式,该格式可使用任意模式进行扩展。以下 _Meta
CUE 模式定义了所有基于文件的目录 Blob 必须遵循的格式:
_Meta
架构
_Meta: { // schema is required and must be a non-empty string schema: string & !="" // package is optional, but if it's defined, it must be a non-empty string package?: string & !="" // properties is optional, but if it's defined, it must be a list of 0 or more properties properties?: [... #Property] } #Property: { // type is required type: string & !="" // value is required, and it must not be null value: !=null }
此规格中列出的 CUE 模式不可被视为详尽模式。opm validate
命令具有额外的验证,很难或不可能在 CUE 中简洁地表达。
Operator Lifecycle Manager (OLM) 目录目前使用三种模式(olm.package
、olm.channel
和 olm.bundle
),它们对应于 OLM 的现有软件包和捆绑包概念。
目录中的每个 Operator 软件包都需要一个 olm.package
blob、至少一个 olm.channel
blob 以及一个或多个 olm.bundle
blob。
所有 olm.*
模式都为 OLM 定义的模式保留。自定义模式必须使用唯一前缀,如您拥有的域。
4.1.3.1. olm.package schema
olm.package
模式为 Operator 定义软件包级别的元数据。这包括其名称、描述、默认频道和图标。
例 4.1. olm.package
schema
#Package: { schema: "olm.package" // Package name name: string & !="" // A description of the package description?: string // The package's default channel defaultChannel: string & !="" // An optional icon icon?: { base64data: string mediatype: string } }
4.1.3.2. olm.channel schema
olm.channel
模式在软件包中定义频道、属于频道成员的捆绑包条目,以及这些捆绑包的升级边缘。
如果捆绑包条目代表多个 olm.channel
blob 中的边缘,则每个频道只能显示一次。
它对条目的 replaces
值有效,以引用无法在此目录或其他目录中找到的另一捆绑包名称。但是,所有其他频道变量都必须为 true,比如频道没有多个磁头。
例 4.2. olm.channel
schema
#Channel: { schema: "olm.channel" package: string & !="" name: string & !="" entries: [...#ChannelEntry] } #ChannelEntry: { // name is required. It is the name of an `olm.bundle` that // is present in the channel. name: string & !="" // replaces is optional. It is the name of bundle that is replaced // by this entry. It does not have to be present in the entry list. replaces?: string & !="" // skips is optional. It is a list of bundle names that are skipped by // this entry. The skipped bundles do not have to be present in the // entry list. skips?: [...string & !=""] // skipRange is optional. It is the semver range of bundle versions // that are skipped by this entry. skipRange?: string & !="" }
在使用 skipRange
字段时,跳过的 Operator 版本会从更新图中删除,因此不再可以被带有 Subscription
对象的 spec.startingCSV
属性的用户安装。
您可以使用 skipRange
和 replaces
字段以递增方式更新 Operator,同时保留以前安装的版本供用户使用。确保 replaces
字段指向相关的 Operator 版本前一个版本。
4.1.3.3. olm.bundle schema
例 4.3. olm.bundle
schema
#Bundle: { schema: "olm.bundle" package: string & !="" name: string & !="" image: string & !="" properties: [...#Property] relatedImages?: [...#RelatedImage] } #Property: { // type is required type: string & !="" // value is required, and it must not be null value: !=null } #RelatedImage: { // image is the image reference image: string & !="" // name is an optional descriptive name for an image that // helps identify its purpose in the context of the bundle name?: string & !="" }
4.1.3.4. olm.deprecations schema
可选的 olm.deprecations
模式定义了目录中软件包、捆绑包和频道的弃用信息。Operator 作者可使用此模式向从目录运行这些 Operator 的用户提供与 Operator 相关的信息,如支持状态和推荐的升级路径。
当定义此模式时,OpenShift Container Platform Web 控制台会在 OperatorHub 的预安装页面上为 Operator 受影响元素显示警告徽标,包括任何自定义弃用信息。
olm.deprecations
schema 条目包含一个或多个 reference
类型,这表示弃用范围。安装 Operator 后,可以在相关的 Subscription
对象上查看任何指定的信息作为状态条件。
类型 | 影响范围 | 状态条件 |
---|---|---|
| 代表整个软件包 |
|
| 代表一个频道 |
|
| 表示一个捆绑包版本 |
|
每个 reference
类型都有自己的要求,如下例所示。
例 4.4. 带有每个 reference
类型的 olm.deprecations
模式示例
schema: olm.deprecations package: my-operator 1 entries: - reference: schema: olm.package 2 message: | 3 The 'my-operator' package is end of life. Please use the 'my-operator-new' package for support. - reference: schema: olm.channel name: alpha 4 message: | The 'alpha' channel is no longer supported. Please switch to the 'stable' channel. - reference: schema: olm.bundle name: my-operator.v1.68.0 5 message: | my-operator.v1.68.0 is deprecated. Uninstall my-operator.v1.68.0 and install my-operator.v1.72.0 for support.
弃用功能没有考虑重叠的弃用,例如,软件包与频道与捆绑包的比较。
Operator 作者可在与软件包的 index.yaml
文件相同的目录中将 olm.deprecations
schema 条目保存为 deprecations.yaml
文件:
带有弃用的目录的目录结构示例
my-catalog └── my-operator ├── index.yaml └── deprecations.yaml
其他资源
4.1.4. Properties
属性是可附加到基于文件的目录方案的任意元数据片段。type
字段是一个有效指定 value
字段语义和语法含义的字符串。该值可以是任意 JSON 或 YAML。
OLM 定义几个属性类型,再次使用保留的 olm.*
前缀。
4.1.4.1. olm.package 属性
olm.package
属性定义软件包名称和版本。这是捆绑包上的必要属性,必须正好有一个这些属性。packageName
字段必须与捆绑包的 first-class package
字段匹配,并且 version
字段必须是有效的语义版本。
例 4.5. olm.package
属性
#PropertyPackage: { type: "olm.package" value: { packageName: string & !="" version: string & !="" } }
4.1.4.2. olm.gvk 属性
olm.gvk
属性定义此捆绑包提供的 Kubernetes API 的 group/version/kind (GVK)。OLM 使用此属性解析捆绑包,作为列出与所需 API 相同的 GVK 的其他捆绑包的依赖项。GVK 必须遵循 Kubernetes GVK 验证。
例 4.6. olm.gvk
属性
#PropertyGVK: { type: "olm.gvk" value: { group: string & !="" version: string & !="" kind: string & !="" } }
4.1.4.3. olm.package.required
olm.package.required
属性定义此捆绑包需要的另一软件包的软件包名称和版本范围。对于捆绑包列表的每个所需软件包属性,OLM 确保集群中为列出的软件包和所需版本范围安装了一个 Operator。versionRange
字段必须是有效的语义版本(模拟)范围。
例 4.7. olm.package.required
属性
#PropertyPackageRequired: { type: "olm.package.required" value: { packageName: string & !="" versionRange: string & !="" } }
4.1.4.4. olm.gvk.required
olm.gvk.required
属性定义此捆绑包需要的 Kubernetes API 的 group/version/kind (GVK)。对于捆绑包列表的每个必需的 GVK 属性,OLM 确保集群中安装了提供它的 Operator。GVK 必须遵循 Kubernetes GVK 验证。
例 4.8. olm.gvk.required
属性
#PropertyGVKRequired: { type: "olm.gvk.required" value: { group: string & !="" version: string & !="" kind: string & !="" } }
4.1.5. 目录示例
对于基于文件的目录,目录维护人员可以专注于 Operator 策展和兼容性。由于 Operator 作者已为其 Operator 创建了特定于 Operator 的目录,因此目录维护人员可以通过将每个 Operator 目录渲染到目录根目录的子目录来构建其目录。
构建基于文件的目录的方法有很多;以下步骤概述了一个简单的方法:
为目录维护一个配置文件,其中包含目录中每个 Operator 的镜像引用:
目录配置文件示例
name: community-operators repo: quay.io/community-operators/catalog tag: latest references: - name: etcd-operator image: quay.io/etcd-operator/index@sha256:5891b5b522d5df086d0ff0b110fbd9d21bb4fc7163af34d08286a2e846f6be03 - name: prometheus-operator image: quay.io/prometheus-operator/index@sha256:e258d248fda94c63753607f7c4494ee0fcbe92f1a76bfdac795c9d84101eb317
运行一个脚本,该脚本将解析配置文件并从其引用中创建新目录:
脚本示例
name=$(yq eval '.name' catalog.yaml) mkdir "$name" yq eval '.name + "/" + .references[].name' catalog.yaml | xargs mkdir for l in $(yq e '.name as $catalog | .references[] | .image + "|" + $catalog + "/" + .name + "/index.yaml"' catalog.yaml); do image=$(echo $l | cut -d'|' -f1) file=$(echo $l | cut -d'|' -f2) opm render "$image" > "$file" done opm generate dockerfile "$name" indexImage=$(yq eval '.repo + ":" + .tag' catalog.yaml) docker build -t "$indexImage" -f "$name.Dockerfile" . docker push "$indexImage"
4.1.6. 指南
在维护基于文件的目录时,请考虑以下准则。
4.1.6.1. 不可变捆绑包
Operator Lifecycle Manager (OLM) 的常规建议是捆绑包镜像及其元数据应视为不可变。
如果一个错误的捆绑包被推送到目录,您必须假设至少有一个用户已升级到该捆绑包。基于这种假设,您必须从损坏的捆绑包中发布另一个带有升级边缘的捆绑包,以确保安装了有问题的捆绑包的用户收到升级。如果目录中更新了该捆绑包的内容,OLM 将不会重新安装已安装的捆绑包。
然而,在某些情况下首选更改目录元数据:
-
频道升级:如果您已发布了捆绑包,且之后决定将其添加到另一个频道,您可以在另一个
olm.channel
blob 中添加捆绑包条目。 -
新的升级边缘:如果您发布一个新的
1.2.z
捆绑包版本,如1.2.4
,但1.3.0
已发布,您可以更新1.3.0
的目录元数据以跳过1.2.4
。
4.1.6.2. 源控制
目录元数据应存储在源控制中,并被视为事实来源。目录镜像的更新应包括以下步骤:
- 使用新的提交来更新源控制的目录目录。
-
构建并推送目录镜像。使用一致的标记分类,如
:latest
或:<target_cluster_version>
,以便用户可以在目录可用时接收到更新。
4.1.7. CLI 用法
有关使用 opm
CLI 创建基于文件的目录的说明,请参阅管理自定义目录。
有关管理基于文件的目录的 opm
CLI 命令的参考文档,请参阅 CLI 工具。
4.1.8. 自动化
建议 Operator 作者和目录维护人员使用 CI/CD 工作流自动化其目录维护。目录维护人员可通过构建 GitOps 自动化以完成以下任务来进一步改进:
- 检查是否允许拉取请求 (PR) 作者进行请求的更改,例如更新其软件包的镜像引用。
-
检查目录更新是否通过
opm validate
命令。 - 检查是否有更新的捆绑包或目录镜像引用,目录镜像在集群中成功运行,来自该软件包的 Operator 可以成功安装。
- 自动合并通过之前检查的 PR。
- 自动重新构建和重新发布目录镜像。
4.2. 红帽提供的目录
Operator Lifecycle Manager (OLM) v1 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
红帽提供了一些默认包含在 OpenShift Container Platform 中的 Operator 目录。
目前,Operator Lifecycle Manager (OLM) v1 无法验证私有 registry,如红帽提供的 Operator 目录。这是个已知问题。因此,依赖 Red Hat Operator 目录的 OLM v1 流程无法正常工作。(OCPBUGS-36364)
4.2.1. 关于红帽提供的 Operator 目录
在 openshift-marketplace
命名空间中默认安装红帽提供的目录源,从而使目录在所有命名空间中都可用。
以下 Operator 目录由红帽发布:
目录 | 索引镜像 | 描述 |
---|---|---|
|
| 已由红帽打包并提供的红帽产品。受红帽支持。 |
|
| 来自主要独立软件供应商 (ISV) 的产品。红帽与 ISV 合作打包并提供。受 ISV 支持。 |
|
| 可通过 Red Hat Marketplace 购买认证的软件。 |
|
| 由 redhat-openshift-ecosystem/community-operators-prod/operators GitHub 仓库中相关代表维护的软件。无官方支持。 |
在集群升级过程中,默认红帽提供的目录源的索引镜像标签由 Cluster Version Operator (CVO) 自动更新,以便 Operator Lifecycle Manager (OLM) 拉取目录的更新版本。例如,在从 OpenShift Container Platform 4.8 升级到 4.9 过程中,redhat-operators
目录的 CatalogSource
对象中的 spec.image
字段被更新:
registry.redhat.io/redhat/redhat-operator-index:v4.8
改为:
registry.redhat.io/redhat/redhat-operator-index:v4.9
4.3. 管理目录
Operator Lifecycle Manager (OLM) v1 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
集群管理员可向其集群添加 目录、或策展 Operator 和 Kubernetes 扩展集合。Operator 作者将其产品发布到这些目录中。当您向集群添加目录时,您可以访问发布到目录中的 Operator 和扩展的版本、补丁和无线更新。
您可以使用自定义资源 (CR) 从 CLI 中声明性管理目录和扩展。
基于文件的目录是 Operator Lifecycle Manager (OLM) 中目录格式的最新迭代。它是基于纯文本(JSON 或 YAML)和早期 SQLite 数据库格式的声明式配置演变,并且完全向后兼容。
Kubernetes 定期弃用后续版本中删除的某些 API。因此,从使用删除 API 的 Kubernetes 版本的 OpenShift Container Platform 版本开始,Operator 无法使用删除 API 的 API。
如果您的集群使用自定义目录,请参阅控制 Operator 与 OpenShift Container Platform 版本的兼容性,以了解更多有关 Operator 作者如何更新其项目的详细信息,以帮助避免工作负载问题并防止不兼容的升级。
4.3.1. 关于 OLM v1 中的目录
您可以使用 catalogd 组件查询 Kubernetes 扩展的目录,如 Operator 和控制器,从而发现可安装的内容。Catalogd 是一个 Kubernetes 扩展,为集群客户端解包目录内容,并是微服务的 Operator Lifecycle Manager (OLM) v1 套件的一部分。目前,catalogd 解包要打包并分发为容器镜像的目录内容。
如果您尝试安装没有唯一名称的 Operator 或扩展,则安装可能会失败,或者导致无法预计的结果。这是因为以下原因:
- 如果在集群中安装 mulitple 目录,Operator Lifecycle Manager (OLM) v1 不包含在安装 Operator 或扩展时指定目录的机制。
- OLM v1 要求在集群中安装的所有 Operator 和扩展都使用其捆绑包和软件包的唯一名称。
其他资源
4.3.2. OLM v1 中红帽提供的 Operator 目录
Operator Lifecycle Manager (OLM) v1 默认不包括红帽提供的 Operator 目录。如果要在集群中添加红帽提供的目录,请为目录创建一个自定义资源 (CR),并将其应用到集群。以下自定义资源 (CR) 示例演示了如何为 OLM v1 创建目录资源。
目前,Operator Lifecycle Manager (OLM) v1 无法验证私有 registry,如红帽提供的 Operator 目录。这是个已知问题。因此,依赖 Red Hat Operator 目录的 OLM v1 流程无法正常工作。(OCPBUGS-36364)
如果要使用托管在一个私有 registry 上的目录,如来自
registry.redhat.io
的红帽提供的 Operator 目录,则必须有一个范围到openshift-catalogd
命名空间的 pull secret。如需更多信息,请参阅"为在安全 registry 上托管的目录创建 pull secret"。
Red Hat Operator 目录示例
apiVersion: catalogd.operatorframework.io/v1alpha1
kind: ClusterCatalog
metadata:
name: redhat-operators
spec:
source:
type: image
image:
ref: registry.redhat.io/redhat/redhat-operator-index:v4.17
pullSecret: <pull_secret_name>
pollInterval: <poll_interval_duration> 1
- 1
- 指定轮询远程 registry 以获取较新的镜像摘要的时间间隔。默认值为
24h
。有效单位包括秒 (s
)、分钟 (m
) 和小时 (h
)。要禁用轮询,请设置零值,如0s
。
认证的 Operator 目录示例
apiVersion: catalogd.operatorframework.io/v1alpha1 kind: ClusterCatalog metadata: name: certified-operators spec: source: type: image image: ref: registry.redhat.io/redhat/certified-operator-index:v4.17 pullSecret: <pull_secret_name> pollInterval: 24h
Community Operators 目录示例
apiVersion: catalogd.operatorframework.io/v1alpha1 kind: ClusterCatalog metadata: name: community-operators spec: source: type: image image: ref: registry.redhat.io/redhat/community-operator-index:v4.17 pullSecret: <pull_secret_name> pollInterval: 24h
以下命令在集群中添加目录:
命令语法
$ oc apply -f <catalog_name>.yaml 1
- 1
- 指定目录 CR,如
redhat-operators.yaml
。
4.3.3. 为私有 registry 上托管的目录创建 pull secret
如果要使用托管在一个私有 registry 上的目录,如来自 registry.redhat.io
的红帽提供的 Operator 目录,则必须有一个范围到 openshift-catalogd
命名空间的 pull secret。
Catalogd 无法从 OpenShift Container Platform 集群读取全局 pull secret。Catalogd 只能读取对部署它的命名空间中的 secret 的引用。
目前,Operator Lifecycle Manager (OLM) v1 无法验证私有 registry,如红帽提供的 Operator 目录。这是个已知问题。因此,依赖 Red Hat Operator 目录的 OLM v1 流程无法正常工作。(OCPBUGS-36364)
先决条件
- 安全 registry 的登录凭证
- 工作站上安装的 Docker 或 Podman
流程
如果您已经有一个带有安全 registry 的登录凭证的
.dockercfg
文件,请运行以下命令创建一个 pull secret:$ oc create secret generic <pull_secret_name> \ --from-file=.dockercfg=<file_path>/.dockercfg \ --type=kubernetes.io/dockercfg \ --namespace=openshift-catalogd
例 4.9. 示例命令
$ oc create secret generic redhat-cred \ --from-file=.dockercfg=/home/<username>/.dockercfg \ --type=kubernetes.io/dockercfg \ --namespace=openshift-catalogd
如果您已经有一个带有安全 registry 的登录凭证的
$HOME/.docker/config.json
文件,请运行以下命令创建一个 pull secret:$ oc create secret generic <pull_secret_name> \ --from-file=.dockerconfigjson=<file_path>/.docker/config.json \ --type=kubernetes.io/dockerconfigjson \ --namespace=openshift-catalogd
例 4.10. 示例命令
$ oc create secret generic redhat-cred \ --from-file=.dockerconfigjson=/home/<username>/.docker/config.json \ --type=kubernetes.io/dockerconfigjson \ --namespace=openshift-catalogd
如果您没有安全 registry 的登录凭证的 Docker 配置文件,请运行以下命令来创建 pull secret:
$ oc create secret docker-registry <pull_secret_name> \ --docker-server=<registry_server> \ --docker-username=<username> \ --docker-password=<password> \ --docker-email=<email> \ --namespace=openshift-catalogd
例 4.11. 示例命令
$ oc create secret docker-registry redhat-cred \ --docker-server=registry.redhat.io \ --docker-username=username \ --docker-password=password \ --docker-email=user@example.com \ --namespace=openshift-catalogd
4.3.4. 在集群中添加目录
要在集群中添加目录,请创建一个目录自定义资源(CR)并将其应用到集群。
目前,Operator Lifecycle Manager (OLM) v1 无法验证私有 registry,如红帽提供的 Operator 目录。这是个已知问题。因此,依赖 Red Hat Operator 目录的 OLM v1 流程无法正常工作。(OCPBUGS-36364)
先决条件
如果要使用托管在一个私有 registry 上的目录,如来自
registry.redhat.io
的红帽提供的 Operator 目录,则必须有一个范围到openshift-catalogd
命名空间的 pull secret。Catalogd 无法从 OpenShift Container Platform 集群读取全局 pull secret。Catalogd 只能读取对部署它的命名空间中的 secret 的引用。
流程
创建目录自定义资源(CR),如下例所示:
redhat-operators.yaml
示例apiVersion: catalogd.operatorframework.io/v1alpha1 kind: ClusterCatalog metadata: name: redhat-operators spec: source: type: image image: ref: registry.redhat.io/redhat/redhat-operator-index:v4.17 1 pullSecret: <pull_secret_name> 2 pollInterval: <poll_interval_duration> 3
运行以下命令在集群中添加目录:
$ oc apply -f redhat-operators.yaml
输出示例
catalog.catalogd.operatorframework.io/redhat-operators created
验证
运行以下命令以验证目录的状态:
运行以下命令检查目录是否可用:
$ oc get clustercatalog
输出示例
NAME AGE redhat-operators 20s
运行以下命令,检查目录的状态:
$ oc describe clustercatalog
输出示例
Name: redhat-operators Namespace: Labels: <none> Annotations: <none> API Version: catalogd.operatorframework.io/v1alpha1 Kind: ClusterCatalog Metadata: Creation Timestamp: 2024-06-10T17:34:53Z Finalizers: catalogd.operatorframework.io/delete-server-cache Generation: 1 Resource Version: 46075 UID: 83c0db3c-a553-41da-b279-9b3cddaa117d Spec: Source: Image: Pull Secret: redhat-cred Ref: registry.redhat.io/redhat/redhat-operator-index:v4.17 Type: image Status: 1 Conditions: Last Transition Time: 2024-06-10T17:35:15Z Message: Reason: UnpackSuccessful 2 Status: True Type: Unpacked Content URL: https://catalogd-catalogserver.openshift-catalogd.svc/catalogs/redhat-operators/all.json Observed Generation: 1 Phase: Unpacked 3 Resolved Source: Image: Last Poll Attempt: 2024-06-10T17:35:10Z Ref: registry.redhat.io/redhat/redhat-operator-index:v4.17 Resolved Ref: registry.redhat.io/redhat/redhat-operator-index@sha256:f2ccc079b5e490a50db532d1dc38fd659322594dcf3e653d650ead0e862029d9 4 Type: image Events: <none>
4.3.5. 删除目录
您可以通过删除其自定义资源 (CR) 来删除目录。
先决条件
- 已安装目录。
流程
运行以下命令来删除目录:
$ oc delete clustercatalog <catalog_name>
输出示例
catalog.catalogd.operatorframework.io "my-catalog" deleted
验证
运行以下命令验证目录是否已删除:
$ oc get clustercatalog
4.4. 创建目录
Operator Lifecycle Manager (OLM) v1 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
目录维护人员可以使用基于文件的目录格式创建新目录,以用于 OpenShift Container Platform 上的 Operator Lifecycle Manager (OLM) v1。
目前,Operator Lifecycle Manager (OLM) v1 无法验证私有 registry,如红帽提供的 Operator 目录。这是个已知问题。因此,依赖 Red Hat Operator 目录的 OLM v1 流程无法正常工作。(OCPBUGS-36364)
4.4.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.17 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.4.2. 更新或过滤基于文件的目录镜像
您可以使用 opm
CLI 更新或过滤使用基于文件的目录格式的目录镜像。通过提取现有目录镜像的内容,您可以根据需要修改目录,例如:
- 添加软件包
- 删除软件包
- 更新现有软件包条目
- 详细说明每个软件包、频道和捆绑包的弃用信息
然后,您可以将镜像重新构建为目录的更新版本。
或者,如果您已在镜像 registry 上已有目录镜像,您可以使用 oc-mirror CLI 插件在将其镜像到目标 registry 时自动从该目录镜像更新的源版本中修剪任何删除的镜像。
有关 oc-mirror 插件和此用例的更多信息,请参阅"更新您的镜像 registry 内容"部分,特别是"使用 oc-mirror 插件为断开连接的安装镜像镜像"部分。
先决条件
在您的工作站上有以下内容:
-
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.12. 删除条目示例
--- 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 列表中。
第 5 章 集群扩展
5.1. 管理集群扩展
Operator Lifecycle Manager (OLM) v1 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
将一个目录被添加到集群后,您可以访问发布到目录的扩展和 Operator 版本、补丁和无线更新。
您可以使用自定义资源 (CR) 从 CLI 中声明性管理扩展。
目前,Operator Lifecycle Manager (OLM) v1 无法验证私有 registry,如红帽提供的 Operator 目录。这是个已知问题。因此,依赖 Red Hat Operator 目录的 OLM v1 流程无法正常工作。(OCPBUGS-36364)
5.1.1. 支持的扩展
目前,Operator Lifecycle Manager (OLM) v1 支持安装满足以下所有条件的集群扩展:
-
扩展必须使用现有 OLM 中引入的
registry+v1
捆绑包格式。 -
扩展必须通过
AllNamespaces
安装模式支持安装。 - 扩展不能使用 Webhook。
扩展不能使用以下基于文件的目录属性声明依赖项:
-
olm.gvk.required
-
olm.package.required
-
olm.constraint
-
OLM v1 检查您要安装的扩展是否满足这些限制。如果要安装的扩展不符合这些限制,会在集群扩展条件中输出错误消息。
Operator Lifecycle Manager (OLM) v1 不支持现有 OLM 中引入的 OperatorConditions
API。
如果扩展依赖于 OperatorConditions
API 管理更新,扩展可能无法正确安装。大多数依赖此 API 的扩展都会在启动时失败,但在协调过程中可能会失败。
作为临时解决方案,您可以将扩展固定到特定的版本。当您想更新扩展时,请查阅扩展文档来查找何时安全将扩展固定到新版本。
其他资源
5.1.2. 从目录查找 Operator
在集群中添加目录后,您可以查询目录以查找要安装的 Operator 和扩展。在查询目录前,您必须端口转发目录服务器服务。
先决条件
- 您已在集群中添加目录。
-
已安装
jq
CLI 工具。
流程
运行以下命令,在
openshift-catalogd
命名空间中转发目录服务器服务:$ oc -n openshift-catalogd port-forward svc/catalogd-catalogserver 8080:443
在新的终端窗口中或标签页中,运行以下命令来在本地下载目录的 JSON 文件:
$ curl -L -k https://localhost:8080/catalogs/<catalog_name>/all.json \ -C - -o /<path>/<catalog_name>.json
例 5.1. 示例命令
$ curl -L -k https://localhost:8080/catalogs/redhat-operators/all.json \ -C - -o /home/username/catalogs/rhoc.json
运行以下命令之一返回目录中的 Operator 和扩展列表。
重要目前,Operator Lifecycle Manager (OLM) v1 支持安装满足以下所有条件的集群扩展:
-
扩展必须使用现有 OLM 中引入的
registry+v1
捆绑包格式。 -
扩展必须通过
AllNamespaces
安装模式支持安装。 - 扩展不能使用 Webhook。
扩展不能使用以下基于文件的目录属性声明依赖项:
-
olm.gvk.required
-
olm.package.required
-
olm.constraint
-
OLM v1 检查您要安装的扩展是否满足这些限制。如果要安装的扩展不符合这些限制,会在集群扩展条件中输出错误消息。
运行以下命令,从本地目录文件获取 Operator 和扩展列表:
$ jq -s '.[] | select(.schema == "olm.package") | .name' \ /<path>/<filename>.json
例 5.2. 示例命令
$ jq -s '.[] | select(.schema == "olm.package") | .name' \ /home/username/catalogs/rhoc.json
例 5.3. 输出示例
NAME AGE "3scale-operator" "advanced-cluster-management" "amq-broker-rhel8" "amq-online" "amq-streams" "amq7-interconnect-operator" "ansible-automation-platform-operator" "ansible-cloud-addons-operator" "apicast-operator" "aws-efs-csi-driver-operator" "aws-load-balancer-operator" "bamoe-businessautomation-operator" "bamoe-kogito-operator" "bare-metal-event-relay" "businessautomation-operator" ...
运行以下命令,获取支持
AllNamespaces
安装模式的软件包列表,且不从本地目录文件中使用 webhook:$ jq -c 'select(.schema == "olm.bundle") | \ {"package":.package, "version":.properties[] | \ select(.type == "olm.bundle.object").value.data | @base64d | fromjson | \ select(.kind == "ClusterServiceVersion" and (.spec.installModes[] | \ select(.type == "AllNamespaces" and .supported == true) != null) \ and .spec.webhookdefinitions == null).spec.version}' \ /<path>/<catalog_name>.json
例 5.4. 输出示例
{"package":"3scale-operator","version":"0.10.0-mas"} {"package":"3scale-operator","version":"0.10.5"} {"package":"3scale-operator","version":"0.11.0-mas"} {"package":"3scale-operator","version":"0.11.1-mas"} {"package":"3scale-operator","version":"0.11.2-mas"} {"package":"3scale-operator","version":"0.11.3-mas"} {"package":"3scale-operator","version":"0.11.5-mas"} {"package":"3scale-operator","version":"0.11.6-mas"} {"package":"3scale-operator","version":"0.11.7-mas"} {"package":"3scale-operator","version":"0.11.8-mas"} {"package":"amq-broker-rhel8","version":"7.10.0-opr-1"} {"package":"amq-broker-rhel8","version":"7.10.0-opr-2"} {"package":"amq-broker-rhel8","version":"7.10.0-opr-3"} {"package":"amq-broker-rhel8","version":"7.10.0-opr-4"} {"package":"amq-broker-rhel8","version":"7.10.1-opr-1"} {"package":"amq-broker-rhel8","version":"7.10.1-opr-2"} {"package":"amq-broker-rhel8","version":"7.10.2-opr-1"} {"package":"amq-broker-rhel8","version":"7.10.2-opr-2"} ...
-
扩展必须使用现有 OLM 中引入的
运行以下命令,检查 Operator 或扩展的元数据的内容:
$ jq -s '.[] | select( .schema == "olm.package") | \ select( .name == "<package_name>")' /<path>/<catalog_name>.json
例 5.5. 示例命令
$ jq -s '.[] | select( .schema == "olm.package") | \ select( .name == "openshift-pipelines-operator-rh")' \ /home/username/rhoc.json
例 5.6. 输出示例
{ "defaultChannel": "stable", "icon": { "base64data": "PHN2ZyB4bWxu..." "mediatype": "image/png" }, "name": "openshift-pipelines-operator-rh", "schema": "olm.package" }
5.1.2.1. 常见目录查询
您可以使用 jq
CLI 工具查询目录。
查询 | Request(请求) |
---|---|
目录中的可用软件包 |
$ jq -s '.[] | select( .schema == "olm.package") | \ .name' <catalog_name>.json |
支持 |
$ jq -c 'select(.schema == "olm.bundle") | \ {"package":.package, "version":.properties[] | \ select(.type == "olm.bundle.object").value.data | \ @base64d | fromjson | \ select(.kind == "ClusterServiceVersion" and (.spec.installModes[] | \ select(.type == "AllNamespaces" and .supported == true) != null) \ and .spec.webhookdefinitions == null).spec.version}' \ <catalog_name>.json |
软件包元数据 |
$ jq -s '.[] | select( .schema == "olm.package") | \ select( .name == "<package_name>")' <catalog_name>.json |
软件包中的目录 Blob |
$ jq -s '.[] | select( .package == "<package_name>")' \ <catalog_name>.json |
查询 | Request(请求) |
---|---|
软件包中的频道 |
$ jq -s '.[] | select( .schema == "olm.channel" ) | \ select( .package == "<package_name>") | .name' \ <catalog_name>.json |
频道中的版本 |
$ jq -s '.[] | select( .package == "<package_name>" ) | \ select( .schema == "olm.channel" ) | \ select( .name == "<channel_name>" ) | \ .entries | .[] | .name' <catalog_name>.json |
|
$ jq -s '.[] | select( .schema == "olm.channel" ) | \ select ( .name == "<channel>") | \ select( .package == "<package_name>")' \ <catalog_name>.json |
查询 | Request(请求) |
---|---|
软件包中的捆绑包 |
$ jq -s '.[] | select( .schema == "olm.bundle" ) | \ select( .package == "<package_name>") | .name' \ <catalog_name>.json |
|
$ jq -s '.[] | select( .schema == "olm.bundle" ) | \ select ( .name == "<bundle_name>") | \ select( .package == "<package_name>")' \ <catalog_name>.json |
5.1.3. 创建服务帐户以管理集群扩展
与现有的 Operator Lifecycle Manager (OLM) 不同,OLM v1 没有安装、更新和管理集群扩展的权限。集群管理员必须创建服务帐户,并分配安装、更新和管理集群扩展所需的基于角色的访问控制 (RBAC)。
OLM v1 中存在一个已知问题。如果您没有为扩展的服务帐户分配正确的基于角色的访问控制 (RBAC),OLM v1 会卡住,协调会停止。
目前,OLM v1 没有帮助扩展管理员为服务帐户找到正确的 RBAC 的工具。
因为 OLM v1 是一个技术预览功能,且不应在生产环境中使用,您可以使用文档中的更宽松的 RBAC 来避免此问题。
此 RBAC 仅用于测试目的。不要在生产环境集群中使用它。
先决条件
-
使用具有
cluster-admin
权限的账户访问 OpenShift Container Platform 集群。
流程
创建服务帐户,类似以下示例:
apiVersion: v1 kind: ServiceAccount metadata: name: <extension>-installer namespace: <namespace>
例 5.7.
extension-service-account.yaml
文件示例apiVersion: v1 kind: ServiceAccount metadata: name: pipelines-installer namespace: pipelines
运行以下命令来应用服务帐户:
$ oc apply -f extension-service-account.yaml
创建集群角色并分配 RBAC,如下例所示:
警告以下集群角色没有遵循最小特权的原则。此集群角色仅用于测试目的。不要在生产环境集群中使用它。
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: <extension>-installer-clusterrole rules: - apiGroups: ["*"] resources: ["*"] verbs: ["*"]
例 5.8.
pipelines-cluster-role.yaml
文件示例apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: pipelines-installer-clusterrole rules: - apiGroups: ["*"] resources: ["*"] verbs: ["*"]
运行以下命令在集群中添加集群角色:
$ oc apply -f pipelines-role.yaml
通过创建集群角色绑定将集群角色授予的权限绑定到服务帐户,如下例所示:
apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: <extension>-installer-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: <extension>-installer-clusterrole subjects: - kind: ServiceAccount name: <extension>-installer namespace: <namespace>
例 5.9.
pipelines-cluster-role-binding.yaml
文件示例apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRoleBinding metadata: name: pipelines-installer-binding roleRef: apiGroup: rbac.authorization.k8s.io kind: ClusterRole name: pipelines-installer-clusterrole subjects: - kind: ServiceAccount name: pipelines-installer namespace: pipelines
运行以下命令来应用集群角色绑定:
$ oc apply -f pipelines-cluster-role-binding.yaml
5.1.4. 从目录安装集群扩展
您可以通过创建自定义资源 (CR) 并将其应用到集群来从目录安装扩展。Operator Lifecycle Manager (OLM) v1 支持安装集群扩展,包括通过 registry+v1
捆绑包格式(用于集群的现有 OLM Operator)。如需更多信息,请参阅支持的扩展。
目前,Operator Lifecycle Manager (OLM) v1 无法验证私有 registry,如红帽提供的 Operator 目录。这是个已知问题。因此,依赖 Red Hat Operator 目录的 OLM v1 流程无法正常工作。(OCPBUGS-36364)
先决条件
- 您已在集群中添加目录。
- 您已下载了目录文件的本地副本。
-
已安装
jq
CLI 工具。 - 您已创建了服务帐户,并分配了足够的基于角色的访问控制 (RBAC) 来安装、更新和管理您要安装的扩展。如需更多信息,请参阅创建服务帐户。
流程
通过完成以下步骤,检查目录文件本地副本中的频道和版本信息:
运行以下命令,从所选软件包中获取频道列表:
$ jq -s '.[] | select( .schema == "olm.channel" ) | \ select( .package == "<package_name>") | \ .name' /<path>/<catalog_name>.json
例 5.10. 示例命令
$ jq -s '.[] | select( .schema == "olm.channel" ) | \ select( .package == "openshift-pipelines-operator-rh") | \ .name' /home/username/rhoc.json
例 5.11. 输出示例
"latest" "pipelines-1.11" "pipelines-1.12" "pipelines-1.13" "pipelines-1.14"
运行以下命令,获取频道中发布的版本列表:
$ jq -s '.[] | select( .package == "<package_name>" ) | \ select( .schema == "olm.channel" ) | \ select( .name == "<channel_name>" ) | .entries | \ .[] | .name' /<path>/<catalog_name>.json
例 5.12. 示例命令
$ jq -s '.[] | select( .package == "openshift-pipelines-operator-rh" ) | \ select( .schema == "olm.channel" ) | select( .name == "latest" ) | \ .entries | .[] | .name' /home/username/rhoc.json
例 5.13. 输出示例
"openshift-pipelines-operator-rh.v1.12.0" "openshift-pipelines-operator-rh.v1.12.1" "openshift-pipelines-operator-rh.v1.12.2" "openshift-pipelines-operator-rh.v1.13.0" "openshift-pipelines-operator-rh.v1.13.1" "openshift-pipelines-operator-rh.v1.11.1" "openshift-pipelines-operator-rh.v1.12.0" "openshift-pipelines-operator-rh.v1.12.1" "openshift-pipelines-operator-rh.v1.12.2" "openshift-pipelines-operator-rh.v1.13.0" "openshift-pipelines-operator-rh.v1.14.1" "openshift-pipelines-operator-rh.v1.14.2" "openshift-pipelines-operator-rh.v1.14.3" "openshift-pipelines-operator-rh.v1.14.4"
如果要将扩展安装到新命名空间中,请运行以下命令:
$ oc adm new-project <new_namespace>
创建一个类似以下示例的 CR:
pipelines-operator.yaml
CR 示例apiVersion: olm.operatorframework.io/v1alpha1 kind: ClusterExtension metadata: name: pipelines-operator spec: packageName: openshift-pipelines-operator-rh installNamespace: <namespace> serviceAccount: name: <service_account> channel: <channel> version: "<version>"
其中:
<namespace>
-
指定您要安装捆绑包的命名空间,如
pipelines
或my-extension
。扩展仍然是集群范围的,可能包含在不同命名空间中安装的资源。 <service_account>
- 指定您为安装、更新和管理扩展创建的服务帐户的名称。
<channel>
-
可选:为您要安装或更新的软件包指定频道,如
pipelines-1.11
或latest
。 <version>
可选:指定您要安装或更新的软件包的版本或版本范围,如
1.11.1
、1.12.x
或>=1.12.1
。如需更多信息,请参阅"示例自定义资源(CR)指定目标版本"和"支持版本范围"。重要如果您尝试安装没有唯一名称的 Operator 或扩展,则安装可能会失败,或者导致无法预计的结果。这是因为以下原因:
- 如果在集群中安装 mulitple 目录,Operator Lifecycle Manager (OLM) v1 不包含在安装 Operator 或扩展时指定目录的机制。
- OLM v1 要求在集群中安装的所有 Operator 和扩展都使用其捆绑包和软件包的唯一名称。
运行以下命令,将 CR 应用到集群:
$ oc apply -f pipeline-operator.yaml
输出示例
clusterextension.olm.operatorframework.io/pipelines-operator created
验证
运行以下命令,以 YAML 格式查看 Operator 或扩展 CR:
$ oc get clusterextension pipelines-operator -o yaml
例 5.14. 输出示例
apiVersion: v1 items: - apiVersion: olm.operatorframework.io/v1alpha1 kind: ClusterExtension metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"olm.operatorframework.io/v1alpha1","kind":"ClusterExtension","metadata":{"annotations":{},"name":"pipelines-operator"},"spec":{"channel":"latest","installNamespace":"pipelines","packageName":"openshift-pipelines-operator-rh","serviceAccount":{"name":"pipelines-installer"},"pollInterval":"30m"}} creationTimestamp: "2024-06-10T17:50:51Z" finalizers: - olm.operatorframework.io/cleanup-unpack-cache generation: 1 name: pipelines-operator resourceVersion: "53324" uid: c54237be-cde4-46d4-9b31-d0ec6acc19bf spec: channel: latest installNamespace: pipelines packageName: openshift-pipelines-operator-rh serviceAccount: name: pipelines-installer upgradeConstraintPolicy: Enforce status: conditions: - lastTransitionTime: "2024-06-10T17:50:58Z" message: resolved to "registry.redhat.io/openshift-pipelines/pipelines-operator-bundle@sha256:dd3d18367da2be42539e5dde8e484dac3df33ba3ce1d5bcf896838954f3864ec" observedGeneration: 1 reason: Success status: "True" type: Resolved - lastTransitionTime: "2024-06-10T17:51:11Z" message: installed from "registry.redhat.io/openshift-pipelines/pipelines-operator-bundle@sha256:dd3d18367da2be42539e5dde8e484dac3df33ba3ce1d5bcf896838954f3864ec" observedGeneration: 1 reason: Success status: "True" type: Installed - lastTransitionTime: "2024-06-10T17:50:58Z" message: "" observedGeneration: 1 reason: Deprecated status: "False" type: Deprecated - lastTransitionTime: "2024-06-10T17:50:58Z" message: "" observedGeneration: 1 reason: Deprecated status: "False" type: PackageDeprecated - lastTransitionTime: "2024-06-10T17:50:58Z" message: "" observedGeneration: 1 reason: Deprecated status: "False" type: ChannelDeprecated - lastTransitionTime: "2024-06-10T17:50:58Z" message: "" observedGeneration: 1 reason: Deprecated status: "False" type: BundleDeprecated - lastTransitionTime: "2024-06-10T17:50:58Z" message: 'unpack successful: observedGeneration: 1 reason: UnpackSuccess status: "True" type: Unpacked installedBundle: name: openshift-pipelines-operator-rh.v1.14.4 version: 1.14.4 resolvedBundle: name: openshift-pipelines-operator-rh.v1.14.4 version: 1.14.4
其中:
spec.channel
- 显示扩展 CR 中定义的频道。
spec.version
- 显示扩展 CR 中定义的版本或版本范围。
status.conditions
- 显示扩展状态和健康的信息。
type: Deprecated
显示以下一个或多个是否已弃用:
type: PackageDeprecated
- 显示解析的软件包是否已弃用。
type: ChannelDeprecated
- 显示解析的频道是否已弃用。
type: BundleDeprecated
- 显示解析捆绑包是否已弃用。
status
字段中的False
值表示reason: Deprecated
条件已弃用。status
字段中的True
值表示reason: Deprecated
条件已被弃用。installedBundle.name
- 显示安装的捆绑包的名称。
installedBundle.version
- 显示安装的捆绑包的版本。
resolvedBundle.name
- 显示解析捆绑包的名称。
resolvedBundle.version
- 显示解析捆绑包的版本。
5.1.5. 更新集群扩展
您可以通过手动编辑自定义资源 (CR) 并应用更改来更新集群扩展或 Operator。
先决条件
- 已安装目录。
- 您已下载了目录文件的本地副本。
- 已安装 Operator 或扩展。
-
已安装
jq
CLI 工具。
流程
通过完成以下步骤,检查目录文件本地副本中的频道和版本信息:
运行以下命令,从所选软件包中获取频道列表:
$ jq -s '.[] | select( .schema == "olm.channel" ) | \ select( .package == "<package_name>") | \ .name' /<path>/<catalog_name>.json
例 5.15. 示例命令
$ jq -s '.[] | select( .schema == "olm.channel" ) | \ select( .package == "openshift-pipelines-operator-rh") | \ .name' /home/username/rhoc.json
例 5.16. 输出示例
"latest" "pipelines-1.11" "pipelines-1.12" "pipelines-1.13" "pipelines-1.14"
运行以下命令,获取频道中发布的版本列表:
$ jq -s '.[] | select( .package == "<package_name>" ) | \ select( .schema == "olm.channel" ) | \ select( .name == "<channel_name>" ) | .entries | \ .[] | .name' /<path>/<catalog_name>.json
例 5.17. 示例命令
$ jq -s '.[] | select( .package == "openshift-pipelines-operator-rh" ) | \ select( .schema == "olm.channel" ) | select( .name == "latest" ) | \ .entries | .[] | .name' /home/username/rhoc.json
例 5.18. 输出示例
"openshift-pipelines-operator-rh.v1.11.1" "openshift-pipelines-operator-rh.v1.12.0" "openshift-pipelines-operator-rh.v1.12.1" "openshift-pipelines-operator-rh.v1.12.2" "openshift-pipelines-operator-rh.v1.13.0" "openshift-pipelines-operator-rh.v1.14.1" "openshift-pipelines-operator-rh.v1.14.2" "openshift-pipelines-operator-rh.v1.14.3" "openshift-pipelines-operator-rh.v1.14.4"
运行以下命令,查找在 Operator 或扩展 CR 中指定哪个版本或频道:
$ oc get clusterextension <operator_name> -o yaml
示例命令
$ oc get clusterextension pipelines-operator -o yaml
例 5.19. 输出示例
apiVersion: olm.operatorframework.io/v1alpha1 kind: ClusterExtension metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"olm.operatorframework.io/v1alpha1","kind":"ClusterExtension","metadata":{"annotations":{},"name":"pipelines-operator"},"spec":{"channel":"latest","installNamespace":"openshift-operators","packageName":"openshift-pipelines-operator-rh","pollInterval":"30m","version":"\u003c1.12"}} creationTimestamp: "2024-06-11T15:55:37Z" generation: 1 name: pipelines-operator resourceVersion: "69776" uid: 6a11dff3-bfa3-42b8-9e5f-d8babbd6486f spec: channel: latest installNamespace: openshift-operators packageName: openshift-pipelines-operator-rh upgradeConstraintPolicy: Enforce version: <1.12 status: conditions: - lastTransitionTime: "2024-06-11T15:56:09Z" message: installed from "registry.redhat.io/openshift-pipelines/pipelines-operator-bundle@sha256:e09d37bb1e754db42324fd18c1cb3e7ce77e7b7fcbf4932d0535391579938280" observedGeneration: 1 reason: Success status: "True" type: Installed - lastTransitionTime: "2024-06-11T15:55:50Z" message: resolved to "registry.redhat.io/openshift-pipelines/pipelines-operator-bundle@sha256:e09d37bb1e754db42324fd18c1cb3e7ce77e7b7fcbf4932d0535391579938280" observedGeneration: 1 reason: Success status: "True" type: Resolved - lastTransitionTime: "2024-06-11T15:55:50Z" message: "" observedGeneration: 1 reason: Deprecated status: "False" type: Deprecated - lastTransitionTime: "2024-06-11T15:55:50Z" message: "" observedGeneration: 1 reason: Deprecated status: "False" type: PackageDeprecated - lastTransitionTime: "2024-06-11T15:55:50Z" message: "" observedGeneration: 1 reason: Deprecated status: "False" type: ChannelDeprecated - lastTransitionTime: "2024-06-11T15:55:50Z" message: "" observedGeneration: 1 reason: Deprecated status: "False" type: BundleDeprecated installedBundle: name: openshift-pipelines-operator-rh.v1.11.1 version: 1.11.1 resolvedBundle: name: openshift-pipelines-operator-rh.v1.11.1 version: 1.11.1
使用以下方法之一编辑 CR:
如果要将 Operator 或扩展固定到特定版本,如
1.12.1
,请编辑类似以下示例的 CR:pipelines-operator.yaml
CR 示例apiVersion: olm.operatorframework.io/v1alpha1 kind: ClusterExtension metadata: name: pipelines-operator spec: packageName: openshift-pipelines-operator-rh installNamespace: <namespace> version: "1.12.1" 1
- 1
- 将版本从
1.11.1
更新至1.12.1
如果要定义可接受的更新版本范围,请编辑类似以下示例的 CR:
指定了版本范围的 CR 示例
apiVersion: olm.operatorframework.io/v1alpha1 kind: ClusterExtension metadata: name: pipelines-operator spec: packageName: openshift-pipelines-operator-rh installNamespace: <namespace> version: ">1.11.1, <1.13" 1
- 1
- 指定所需的版本范围大于
1.11.1
版本,且小于1.13
。如需更多信息,请参阅"支持版本范围"和"Version 比较字符串"。
如果要更新到可以从频道解析的最新版本,请编辑类似以下示例的 CR:
带有指定频道的 CR 示例
apiVersion: olm.operatorframework.io/v1alpha1 kind: ClusterExtension metadata: name: pipelines-operator spec: packageName: openshift-pipelines-operator-rh installNamespace: <namespace> channel: pipelines-1.13 1
- 1
- 安装可从指定频道解析的最新版本。对频道的更新会自动安装。
如果要指定频道和版本范围,请编辑类似以下示例的 CR:
带有指定频道和版本范围的 CR 示例
apiVersion: olm.operatorframework.io/v1alpha1 kind: ClusterExtension metadata: name: pipelines-operator spec: packageName: openshift-pipelines-operator-rh installNamespace: <namespace> channel: latest version: "<1.13"
如需更多信息,请参阅"指定目标版本的示例自定义资源(CR) "。
运行以下命令,将更新应用到集群:
$ oc apply -f pipelines-operator.yaml
输出示例
clusterextension.olm.operatorframework.io/pipelines-operator configured
提示您可以运行以下命令来通过 CLI 对 CR 进行补丁并应用更改:
$ oc patch clusterextension/pipelines-operator -p \ '{"spec":{"version":"<1.13"}}' \ --type=merge
输出示例
clusterextension.olm.operatorframework.io/pipelines-operator patched
验证
运行以下命令验证频道和版本更新是否已应用:
$ oc get clusterextension pipelines-operator -o yaml
例 5.20. 输出示例
apiVersion: olm.operatorframework.io/v1alpha1 kind: ClusterExtension metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"olm.operatorframework.io/v1alpha1","kind":"ClusterExtension","metadata":{"annotations":{},"name":"pipelines-operator"},"spec":{"channel":"latest","installNamespace":"openshift-operators","packageName":"openshift-pipelines-operator-rh","pollInterval":"30m","version":"\u003c1.13"}} creationTimestamp: "2024-06-11T18:23:26Z" generation: 2 name: pipelines-operator resourceVersion: "66310" uid: ce0416ba-13ea-4069-a6c8-e5efcbc47537 spec: channel: latest installNamespace: openshift-operators packageName: openshift-pipelines-operator-rh upgradeConstraintPolicy: Enforce version: <1.13 status: conditions: - lastTransitionTime: "2024-06-11T18:23:33Z" message: resolved to "registry.redhat.io/openshift-pipelines/pipelines-operator-bundle@sha256:814742c8a7cc7e2662598e114c35c13993a7b423cfe92548124e43ea5d469f82" observedGeneration: 2 reason: Success status: "True" type: Resolved - lastTransitionTime: "2024-06-11T18:23:52Z" message: installed from "registry.redhat.io/openshift-pipelines/pipelines-operator-bundle@sha256:814742c8a7cc7e2662598e114c35c13993a7b423cfe92548124e43ea5d469f82" observedGeneration: 2 reason: Success status: "True" type: Installed - lastTransitionTime: "2024-06-11T18:23:33Z" message: "" observedGeneration: 2 reason: Deprecated status: "False" type: Deprecated - lastTransitionTime: "2024-06-11T18:23:33Z" message: "" observedGeneration: 2 reason: Deprecated status: "False" type: PackageDeprecated - lastTransitionTime: "2024-06-11T18:23:33Z" message: "" observedGeneration: 2 reason: Deprecated status: "False" type: ChannelDeprecated - lastTransitionTime: "2024-06-11T18:23:33Z" message: "" observedGeneration: 2 reason: Deprecated status: "False" type: BundleDeprecated installedBundle: name: openshift-pipelines-operator-rh.v1.12.2 version: 1.12.2 resolvedBundle: name: openshift-pipelines-operator-rh.v1.12.2 version: 1.12.2
故障排除
如果您指定已弃用或不存在的目标版本或频道,您可以运行以下命令来检查扩展的状态:
$ oc get clusterextension <operator_name> -o yaml
例 5.21. 不存在版本的输出示例
apiVersion: olm.operatorframework.io/v1alpha1 kind: ClusterExtension metadata: annotations: kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"olm.operatorframework.io/v1alpha1","kind":"ClusterExtension","metadata":{"annotations":{},"name":"pipelines-operator"},"spec":{"channel":"latest","installNamespace":"openshift-operators","packageName":"openshift-pipelines-operator-rh","pollInterval":"30m","version":"3.0"}} creationTimestamp: "2024-06-11T18:23:26Z" generation: 3 name: pipelines-operator resourceVersion: "71852" uid: ce0416ba-13ea-4069-a6c8-e5efcbc47537 spec: channel: latest installNamespace: openshift-operators packageName: openshift-pipelines-operator-rh upgradeConstraintPolicy: Enforce version: "3.0" status: conditions: - lastTransitionTime: "2024-06-11T18:29:02Z" message: 'error upgrading from currently installed version "1.12.2": no package "openshift-pipelines-operator-rh" matching version "3.0" found in channel "latest"' observedGeneration: 3 reason: ResolutionFailed status: "False" type: Resolved - lastTransitionTime: "2024-06-11T18:29:02Z" message: installation has not been attempted as resolution failed observedGeneration: 3 reason: InstallationStatusUnknown status: Unknown type: Installed - lastTransitionTime: "2024-06-11T18:29:02Z" message: deprecation checks have not been attempted as resolution failed observedGeneration: 3 reason: Deprecated status: Unknown type: Deprecated - lastTransitionTime: "2024-06-11T18:29:02Z" message: deprecation checks have not been attempted as resolution failed observedGeneration: 3 reason: Deprecated status: Unknown type: PackageDeprecated - lastTransitionTime: "2024-06-11T18:29:02Z" message: deprecation checks have not been attempted as resolution failed observedGeneration: 3 reason: Deprecated status: Unknown type: ChannelDeprecated - lastTransitionTime: "2024-06-11T18:29:02Z" message: deprecation checks have not been attempted as resolution failed observedGeneration: 3 reason: Deprecated status: Unknown type: BundleDeprecated
其他资源
5.1.6. 删除 Operator
您可以通过删除 ClusterExtension
自定义资源 (CR) 来删除 Operator 及其自定义资源定义 (CRD)。
先决条件
- 已安装目录。
- 已安装 Operator。
流程
运行以下命令来删除 Operator 及其 CRD:
$ oc delete clusterextension <operator_name>
输出示例
clusterextension.olm.operatorframework.io "<operator_name>" deleted
验证
运行以下命令验证您的 Operator 及其资源已被删除:
运行以下命令验证 Operator 已被删除:
$ oc get clusterextensions
输出示例
No resources found
运行以下命令验证 Operator 的系统命名空间是否已删除:
$ oc get ns <operator_name>-system
输出示例
Error from server (NotFound): namespaces "<operator_name>-system" not found
5.2. 升级边缘
Operator Lifecycle Manager (OLM) v1 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
在决定升级边缘(也称为升级路径或升级限制)时,对于已安装的集群扩展,Operator Lifecycle Manager (OLM) v1 支持从 OpenShift Container Platform 4.16 开始的现有 OLM 语义。这个支持遵循现有 OLM 的行为,包括 replaces
、skips
、和 skipRange
指令,但有以下一些区别。
通过支持现有的 OLM 语义,OLM v1 现在从目录中准确遵循升级图表。
目前,Operator Lifecycle Manager (OLM) v1 无法验证私有 registry,如红帽提供的 Operator 目录。这是个已知问题。因此,依赖 Red Hat Operator 目录的 OLM v1 流程无法正常工作。(OCPBUGS-36364)
与原始现有 OLM 实现的不同
如果有多个可能的后续者,OLM v1 行为有所不同:
- 在现有的 OLM 中,选择与频道头最接近的后续者。
- 在 OLM v1 中,选择具有最高语义版本的后续版本(semver)。
考虑以下基于文件的目录 (FBC) 频道条目:
# ... - name: example.v3.0.0 skips: ["example.v2.0.0"] - name: example.v2.0.0 skipRange: >=1.0.0 <2.0.0
如果安装了
1.0.0
,OLM v1 行为如下:-
现有 OLM 不会检测
v2.0.0
的升级边缘,因为v2.0.0
被跳过,而不是在replaces
链中。 -
OLM v1 将检测升级边缘,因为 OLM v1 没有
replaces
链的概念。OLM v1 找到所有带有replace
、skip
或skipRange
值的条目,它们涵盖当前安装的版本。
-
现有 OLM 不会检测
其他资源
5.2.1. 支持版本范围
在 Operator Lifecycle Manager (OLM) v1 中,您可以使用 Operator 或扩展的自定义资源(CR)中的比较字符串来指定版本范围。如果您在 CR 中指定版本范围,OLM v1 会安装或升级到可以在版本范围内解析的 Operator 的最新版本。
解析的版本工作流
- 解析的版本是满足 Operator 和环境限制的 Operator 的最新版本。
- 如果成功解决,则会自动安装指定范围内的 Operator 更新。
- 当更新在指定的范围之外,或者无法成功解决,则不会安装更新。
5.2.2. 版本比较字符串
您可以通过在 Operator 或扩展的自定义资源(CR)的 spec.version
字段中添加比较字符串来定义版本范围。比较字符串是一个空格或以逗号分隔的值列表,以及以双引号括起的一个或多个比较运算符("
)。您可以通过包括 OR
、或双垂直栏(||
)来添加另一个比较字符串,比较字符串之间的运算符。
比较运算符 | 定义 |
---|---|
| 等于 |
| 不等于 |
| 大于 |
| 小于 |
| 大于或等于 |
| 小于或等于 |
您可以使用类似以下示例的范围比较在 Operator 或扩展 CR 中指定版本范围:
版本范围比较示例
apiVersion: olm.operatorframework.io/v1alpha1 kind: ClusterExtension metadata: name: pipelines-operator spec: packageName: openshift-pipelines-operator-rh installNamespace: <namespace_name> version: ">=1.11, <1.13"
您可以在所有类型的比较字符串中使用通配符字符。OLM v1 接受 x
、X
和星号 (*
) 作为通配符字符。您可以在等号 (=
) 比较运算符中使用通配符,代表在补丁或次版本级别上定义比较。
通配符比较 | 匹配字符串 |
---|---|
|
|
|
|
|
|
|
|
您可以使用波形符 (~
) 比较运算符进行补丁版本比较。补丁版本比较指定最高为下一个主版本的次版本。
补丁版本比较 | 匹配字符串 |
---|---|
|
|
|
|
|
|
|
|
|
|
您可以使用 caret (^
) 比较运算符来比较主版本。如果您在第一个稳定版本发布前进行主发行版本比较,次版本定义了 API 的稳定性级别。在语义版本 (semver) 规格中,第一个稳定版本被发布为 1.0.0
版本。
主发行版本比较 | 匹配字符串 |
---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
5.2.3. 指定目标版本的自定义资源(CR)示例
在 Operator Lifecycle Manager (OLM) v1 中,集群管理员可以在自定义资源(CR)中声明性地设置 Operator 或扩展的目标版本。
您可以通过指定以下字段来定义目标版本:
- Channel
- 版本号
- 版本范围
如果您在 CR 中指定频道,OLM v1 会安装可在指定频道中解析的 Operator 或扩展的最新版本。当向指定的频道发布更新时,OLM v1 会自动更新至可以从频道解析的最新发行版本。
带有指定频道的 CR 示例
apiVersion: olm.operatorframework.io/v1alpha1
kind: ClusterExtension
metadata:
name: pipelines-operator
spec:
packageName: openshift-pipelines-operator-rh
installNamespace: <namespace_name>
serviceAccount:
name: <service_account>
channel: latest 1
- 1
- 安装可从指定频道解析的最新版本。对频道的更新会自动安装。
如果在 CR 中指定 Operator 或扩展的目标版本,OLM v1 将安装指定的版本。当在 CR 中指定目标版本时,OLM v1 在向目录发布更新时不会更改目标版本。
如果要更新集群中安装的 Operator 版本,您必须手动编辑 Operator 的 CR。指定 Operator 的目标版本将 Operator 的版本固定到指定的发行版本。
指定了目标版本的 CR 示例
apiVersion: olm.operatorframework.io/v1alpha1
kind: ClusterExtension
metadata:
name: pipelines-operator
spec:
packageName: openshift-pipelines-operator-rh
installNamespace: <namespace_name>
serviceAccount:
name: <service_account>
version: "1.11.1" 1
- 1
- 指定目标版本。如果要更新安装的 Operator 或扩展版本,您必须手动将 CR 更新至所需的目标版本。
如果要为 Operator 或扩展定义可接受的版本范围,您可以使用比较字符串指定版本范围。当您指定版本范围时,OLM v1 会安装可由 Operator Controller 解析的 Operator 或扩展的最新版本。
指定了版本范围的 CR 示例
apiVersion: olm.operatorframework.io/v1alpha1
kind: ClusterExtension
metadata:
name: pipelines-operator
spec:
packageName: openshift-pipelines-operator-rh
installNamespace: <namespace_name>
serviceAccount:
name: <service_account>
version: ">1.11.1" 1
- 1
- 指定所需的版本范围大于
1.11.1
版本。如需更多信息,请参阅"支持版本范围"。
创建或更新 CR 后,运行以下命令来应用配置文件:
命令语法
$ oc apply -f <extension_name>.yaml
5.2.4. 强制更新或回滚
OLM v1 不支持对下一个主版本的自动更新,或回滚到较早的版本。如果要执行主版本更新或回滚,您必须验证并强制更新。
您必须验证强制进行手动更新或回滚的结果。验证强制更新或回滚失败可能会产生灾难性后果,如数据丢失。
先决条件
- 已安装目录。
- 已安装 Operator 或扩展。
- 您已创建了服务帐户,并分配了足够的基于角色的访问控制 (RBAC) 来安装、更新和管理您要安装的扩展。如需更多信息,请参阅创建服务帐户。
流程
编辑 Operator 或扩展的自定义资源 (CR),如下例所示:
CR 示例
apiVersion: olm.operatorframework.io/v1alpha1 kind: Operator metadata: name: <operator_name> 1 spec: packageName: <package_name> 2 installNamespace: <namespace_name> serviceAccount: name: <service_account> version: <version> 3 upgradeConstraintPolicy: Ignore 4
运行以下命令,对 Operator 或 extensions CR 应用更改:
$ oc apply -f <extension_name>.yaml
其他资源
5.3. 自定义资源定义 (CRD) 升级安全
Operator Lifecycle Manager (OLM) v1 只是一个技术预览功能。技术预览功能不受红帽产品服务等级协议(SLA)支持,且功能可能并不完整。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。
有关红帽技术预览功能支持范围的更多信息,请参阅技术预览功能支持范围。
当您更新由集群扩展提供的自定义资源定义(CRD)时,Operator Lifecycle Manager (OLM) v1 运行 CRD 升级安全 preflight 检查,以确保与 CRD 的早期版本向后兼容。在允许更改在集群中进行前,CRD 更新必须通过验证检查。
其他资源
5.3.1. 禁止 CRD 升级更改
CRD 升级安全 preflight 检查会发现对现有自定义资源定义 (CRD) 的以下更改,并阻止升级:
- 将新的必填字段添加到 CRD 的现有版本中
- 现有字段已从现有 CRD 版本中删除
- 在 CRD 的现有版本中更改现有字段类型
- 在之前没有默认值的字段中添加一个新的默认值
- 字段的默认值被改变
- 字段的现有默认值被删除
- 在之前没有 enum 限制的现有字段中添加了新的 enum 限制
- 现有字段中的现有 enum 值会被删除
- 现有字段的最小值会在现有版本中增加
- 在现有版本中现有字段的最大值会减少
- 在之前没有限制的字段中添加最小或最大字段限制
对最小和最大值的更改规则适用于 minimum
, minLength
, minProperties
, minItems
, maximum
, maxLength
, maxProperties
, 和 maxItems
约束。
CRD 升级安全 preflight 检查会报告对现有 CRD 的以下更改,并防止升级,尽管 Kubernetes API 服务器在技术上处理操作:
-
范围从
Cluster
改为Namespace
或从Namespace
改为Cluster
- 删除现存已存储的 CRD 的现有版本
如果 CRD 升级安全 preflight 检查遇到禁止的升级更改之一,它会记录 CRD 升级过程中检测到的每个禁止更改的错误。
如果对 CRD 的更改没有属于被禁止更改类别之一,但也无法正确地探测到允许的 CRD 升级安全 preflight 检查,则 CRD 升级安全 preflight 检查将阻止升级并记录"未知更改"的错误。
5.3.2. 允许 CRD 升级更改
对现有自定义资源定义 (CRD) 的以下更改可以安全地向后兼容,且不会导致 CRD 升级安全 preflight 检查停止升级:
- 在字段中允许枚举值列表中添加新的 enum 值
- 在现有版本中将现有必填字段更改为 optional
- 在现有版本中现有字段的最小值会减少
- 在现有版本中增加现有字段的最大值
- 在不对现有版本进行任何修改的情况下,会添加 CRD 的新版本
5.3.3. 禁用 CRD 升级安全 preflight 检查
通过在提供 CRD 的 ClusterExtension
对象中为 preflight.crdUpgradeSafety.disabled
字段添加 true
来禁用自定义资源定义 (CRD) 升级安全 preflight 检查。
禁用 CRD 升级安全 preflight 检查可能会破坏与 CRD 存储版本的向后兼容性,并在集群中造成其他意外后果。
您无法禁用单个字段验证器。如果您禁用 CRD 升级安全 preflight 检查,则会禁用所有字段验证器。
以下检查由 Kubernetes API 服务器处理:
-
范围从
Cluster
改为Namespace
或从Namespace
改为Cluster
- 删除现存已存储的 CRD 的现有版本
在通过 Operator Lifecycle Manager (OLM) v1 禁用 CRD 升级安全 preflight 检查后,Kubernetes 仍然会阻止这两个操作。
先决条件
- 已安装集群扩展。
流程
编辑 CRD 的
ClusterExtension
对象:$ oc edit clusterextension <clusterextension_name>
将
preflight.crdUpgradeSafety.disabled
字段设置为true
:例 5.22.
ClusterExtension
对象示例apiVersion: olm.operatorframework.io/v1alpha1 kind: ClusterExtension metadata: name: clusterextension-sample spec: installNamespace: default packageName: argocd-operator version: 0.6.0 preflight: crdUpgradeSafety: disabled: true 1
- 1
- 设置为
true
。
5.3.4. 不安全的 CRD 更改示例
以下示例演示了 CRD 升级安全 preflight 检查示例自定义资源定义 (CRD) 中的具体更改。
对于以下示例,请考虑以下开始状态的 CRD 对象:
例 5.23. CRD 对象示例
apiVersion: apiextensions.k8s.io/v1 kind: CustomResourceDefinition metadata: annotations: controller-gen.kubebuilder.io/version: v0.13.0 name: example.test.example.com spec: group: test.example.com names: kind: Sample listKind: SampleList plural: samples singular: sample scope: Namespaced versions: - name: v1alpha1 schema: openAPIV3Schema: properties: apiVersion: type: string kind: type: string metadata: type: object spec: type: object status: type: object pollInterval: type: string type: object served: true storage: true subresources: status: {}
5.3.4.1. 范围更改
在以下自定义资源定义 (CRD) 示例中,scope
字段从 Namespaced
改为 Cluster
:
例 5.24. CRD 中的范围更改示例
spec: group: test.example.com names: kind: Sample listKind: SampleList plural: samples singular: sample scope: Cluster versions: - name: v1alpha1
例 5.25. 错误输出示例
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "NoScopeChange" validation failed: scope changed from "Namespaced" to "Cluster"
5.3.4.2. 删除存储的版本
在以下自定义资源定义 (CRD) 示例中,现有存储版本 v1alpha1
已被删除:
例 5.26. 在 CRD 中删除存储版本示例
versions: - name: v1alpha2 schema: openAPIV3Schema: properties: apiVersion: type: string kind: type: string metadata: type: object spec: type: object status: type: object pollInterval: type: string type: object
例 5.27. 错误输出示例
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "NoStoredVersionRemoved" validation failed: stored version "v1alpha1" removed
5.3.4.3. 删除现有字段
在以下自定义资源定义 (CRD) 示例中,pollInterval
属性字段已从 v1alpha1
模式中删除:
例 5.28. 在 CRD 中删除现有字段示例
versions: - name: v1alpha1 schema: openAPIV3Schema: properties: apiVersion: type: string kind: type: string metadata: type: object spec: type: object status: type: object type: object
例 5.29. 错误输出示例
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "NoExistingFieldRemoved" validation failed: crd/test.example.com version/v1alpha1 field/^.spec.pollInterval may not be removed
5.3.4.4. 添加必填字段
在以下自定义资源定义 (CRD) 示例中,pollInterval
属性已改为必填字段:
例 5.30. 在 CRD 中添加必填字段的示例
versions: - name: v1alpha2 schema: openAPIV3Schema: properties: apiVersion: type: string kind: type: string metadata: type: object spec: type: object status: type: object pollInterval: type: string type: object required: - pollInterval
例 5.31. 错误输出示例
validating upgrade for CRD "test.example.com" failed: CustomResourceDefinition test.example.com failed upgrade safety validation. "ChangeValidator" validation failed: version "v1alpha1", field "^": new required fields added: [pollInterval]
Legal Notice
Copyright © 2024 Red Hat, Inc.
OpenShift documentation is licensed under the Apache License 2.0 (https://www.apache.org/licenses/LICENSE-2.0).
Modified versions must remove all Red Hat trademarks.
Portions adapted from https://github.com/kubernetes-incubator/service-catalog/ with modifications by Red Hat.
Red Hat, Red Hat Enterprise Linux, the Red Hat logo, the Shadowman logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat Software Collections is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation’s permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.