2.2. Operator Lifecycle Manager 依赖项解析
该指南概述了 OpenShift Container Platform 中 Operator Lifecycle Manager (OLM) 内的依赖项解析和自定义资源定义 (CRD) 升级生命周期。
2.2.1. 关于依赖项解析
OLM 管理运行 Operator 的依赖项解析和升级生命周期。在很多方面,OLM 的问题与其他操作系统软件包管理程序类似,比如 yum
和 rpm
。
但其中有一个限制是相似系统一般不存在而 OLM 存在的,那就是:因为 Operator 始终在运行,所以 OLM 会努力确保您所接触的 Operator 组始终相互兼容。
这意味着,OLM 绝不会:
- 安装一组系统无法提供其所需 API 的 Operator,或
- 更新某个 Operator 之时导致依赖该 Operator 的另一 Operator 中断。
2.2.2. 升级自定义资源定义 (CRD)
如果自定义资源定义 (CRD) 属于单一 ClusterServiceVersion (CSV),OLM 会立即对其升级。如果某个 CRD 被多个 CSV 拥有,则当该 CRD 满足以下所有向后兼容条件时才会升级:
- 所有已存在于当前 CRD 中的服务版本都包括在新 CRD 中。
- 在对照新 CRD 验证模式进行验证时,与 CRD 的服务版本相关联的所有现有实例或自定义资源 (CR) 均有效。
2.2.2.1. 添加新版 CRD
流程
要添加新版 CRD:
在
versions
部分的 CRD 资源中新增一个条目。例如:如果当前 CRD 有一个
v1alpha1
版本,而您想新增v1beta1
版本,并将其标记为新存储版本:versions: - name: v1alpha1 served: true storage: false - name: v1beta1 1 served: true storage: true
- 1
- 新增
v1beta1
条目。
如果 CSV 打算使用新版本,请确保已更新您的 CSV
owned
部分中的 CRD 引用版本:customresourcedefinitions: owned: - name: cluster.example.com version: v1beta1 1 kind: cluster displayName: Cluster
- 1
- 更新
version
。
- 将更新的 CRD 和 CSV 推送至您的捆绑包中。
2.2.2.2. 弃用或删除 CRD 版本
OLM 不允许立即删除 CRD 的服务版本。弃用的 CRD 版本应首先通过将 CRD 的 served
字段设置为 false
来禁用。随后在升级 CRD 时便可将非服务版本删除。
流程
要弃用和删除特定 CRD 版本:
将弃用版本标记为非服务版本,表明该版本已不再使用且后续升级时可删除。例如:
versions: - name: v1alpha1 served: false 1 storage: true
- 1
- 设置为
false
。
如果要弃用的版本目前为
storage
版本,则将该storage
版本切换至服务版本。例如:versions: - name: v1alpha1 served: false storage: false 1 - name: v1beta1 served: true storage: true 2
注意要从 CRD 中删除曾是或现在是
storage
的特定版本,该版本必须从 CRD 状态下的storedVersion
中删除。OLM 一旦检测到某个已存储版本在新 CRD 中不再存在,OLM 将尝试执行这一操作。- 使用以上更改来升级 CRD。
在后续升级周期中,非服务版本可从 CRD 中完全删除。例如:
versions: - name: v1beta1 served: true storage: true
-
如果该版本已从 CSV 中删除,请确保您的 CSV
owned
部分中的 CRD 引用版本会相应更新。
2.2.3. 依赖项解析方案示例
在以下示例中,provider 是指“拥有”某个 CRD 或 APIService 的 Operator。
示例:弃用从属 API
A 和 B 均为 API(如 CRD):
- A 的供应商依赖 B。
- B 的供应商有 Subscription。
- B 的供应商会更新以提供 C,但弃用 B。
结果:
- B 不再有供应商。
- A 不再工作。
这是 OLM 通过升级策略阻止的一个案例。
示例:版本死锁
A 和 B 均为 API:
- A 的供应商需要 B。
- B 的供应商需要 A。
- A 的供应商更新至(提供 A2,需要 B2)并弃用 A。
- B 的供应商更新至(提供 B2,需要 A2)并弃用 B。
如果 OLM 试图在更新 A 的同时不更新 B,或更新 B 的同时不更新 A,则无法升级到新版 Operator,即使可找到新的兼容集也无法更新。
这是 OLM 通过升级策略阻止的另一案例。