第 2 章 了解 Operator Lifecycle Manager (OLM)
2.1. Operator Lifecycle Manager 工作流和架构
该指南概述了 OpenShift Container Platform 中 Operator Lifecycle Manager (OLM) 的概念和架构。
2.1.1. Operator Lifecycle Manager 概述
在 OpenShift Container Platform 4.3 中,Operator Lifecycle Manager (OLM) 可帮助用户安装、更新和管理所有 Operator 以及在用户集群中运行的关联服务的生命周期。Operator Lifecycle Manager 是 Operator Framework 的一部分,后者是一个开源工具包,用于以有效、自动化且可扩展的方式管理 Kubernetes 原生应用程序 (Operator)。
图 2.1. Operator Lifecycle Manager 工作流
OLM 默认在 OpenShift Container Platform 4.3 中运行,辅助集群管理员对集群上运行的 Operator 进行安装、升级和授予访问权。OpenShift Container Platform Web 控制台提供一些管理界面,供集群管理员安装 Operator,以及为特定项目授权以便使用集群上的可用 Operator 目录。
开发人员通过自助服务体验,无需成为相关问题的专家也可自由置备和配置数据库、监控和大数据服务的实例,因为 Operator 已将相关知识融入其中。
2.1.2. ClusterServiceVersions (CSV)
ClusterServiceVersion (CSV) 是一个利用 Operator 元数据创建的 YAML 清单,可辅助 Operator Lifecycle Manager (OLM) 在集群中运行 Operator。
CSV 是 Operator 容器镜像附带的元数据,用于在用户界面填充徽标、描述和版本等信息。此外,CSV 还是运行 Operator 所需的技术信息来源,类似于其需要的 RBAC 规则及其管理或依赖的自定义资源 (CR)。
CSV 包含以下内容:
- 元数据
应用程序元数据:
- 名称、描述、版本(符合 semver)、链接、标签、图标等。
- 安装策略
类型:部署
- 服务账户和所需权限集
- 部署集。
- CRD
- 类型
- 自有:由该服务管理
- 必需:集群中必须存在,该服务才可运行
- 资源:Operator 与之交互的资源列表
- 描述符:注解 CRD 规格和状态字段以提供语义信息
2.1.3. OLM 中的 Operator 安装和升级工作流
在 Operator Lifecycle Manager (OLM) 生态系统中,以下资源用于解决 Operator 的安装和升级问题:
- ClusterServiceVersion (CSV)
- CatalogSource
- Subscription
CSV 中定义的 Operator 元数据可保存在一个名为 CatalogSource 的集合中。CatalogSource 使用 Operator Registry API,OLM 又使用 CatalogSource 来查询是否有可用的 Operator 及已安装 Operator 是否有升级版本。
图 2.2. CatalogSource 概述
在 CatalogSource 中,Operator 被整合为更新软件包和更新流,我们称为频道,这应是 OpenShift Container Platform 或其他软件(如 Web 浏览器)在持续发行周期中的常见更新模式。
图 2.3. CatalogSource 中的软件包和频道
用户在 Subscription 中的特定 CatalogSource 中指示特定软件包和频道,如 etcd
包及其 alpha
频道。如果订阅了命名空间中尚未安装的软件包,则会安装该软件包的最新 Operator。
OLM 会刻意避免版本比较,因此给定 catalog
每个 CSV 均有一个 replaces
参数,指明所替换的是哪个 Operator。这样便构建了一个可通过 OLM 查询的 CSV 图,且不同频道之间可共享更新。可将频道视为更新图表的入口点:
图 2.4. OLM 的可用频道更新图表
例如:
软件包中的频道
packageName: example channels: - name: alpha currentCSV: example.v0.1.2 - name: beta currentCSV: example.v0.1.3 defaultChannel: alpha
为了让 OLM 成功查询更新、给定 CatalogSource、软件包、频道和 CSV,目录必须能够明确无误地返回替换
输入 CSV 的单个 CSV。
2.1.3.1. 升级路径示例
对于示例升级场景,假设安装的 Operator 对应于 0.1.1
版 CSV。OLM 查询 CatalogSource,并在订阅的频道中检测升级包,新的 0.1.3
版 CSV 取代了旧的但未安装的 0.1.2
版 CSV,后者又取代了更旧的已安装的 0.1.1
版 CSV。
OLM 通过 CSV 中指定的 replaces
字段从频道头倒退至之前的版本,以确定升级路径为 0.1.3
0.1.2
0.1.1
,其中箭头代表前者取代后者。OLM 一次仅升级一个 Operator 版本,直至到达频道头。
对于该给定场景,OLM 会安装 0.1.2
版 Operator 来取代现有的 0.1.1
版 Operator。然后再安装 0.1.3
版 Operator 来取代之前安装的 0.1.2
版 Operator。至此,所安装的 0.1.3
版 Operator 与频道头相匹配,意味着升级已完成。
2.1.3.2. 跳过升级
OLM 的基本升级路径如下:
- 通过对 Operator 的一个或多个更新来更新 CatalogSource。
- OLM 会遍历 Operator 的所有版本,直到到达 CatalogSource 包含的最新版本。
但有时这不是一种安全操作。某些情况下,已发布但尚未就绪的 Operator 版本不可安装至集群中,如版本中存在严重漏洞。
这种情况下,OLM 必须考虑两个集群状态,并提供支持这两个状态的更新图:
- 集群发现并安装了“不良”中间 Operator。
- “不良”中间 Operator 尚未安装至集群中。
通过发送新目录并添加跳过的发行版本,可保证无论集群状态如何以及是否发现了不良更新,OLM 总能获得单个唯一更新。
例如:
带有跳过发行版本的 CSV
apiVersion: operators.coreos.com/v1alpha1 kind: ClusterServiceVersion metadata: name: etcdoperator.v0.9.2 namespace: placeholder annotations: spec: displayName: etcd description: Etcd Operator replaces: etcdoperator.v0.9.0 skips: - etcdoperator.v0.9.1
考虑以下 Old CatalogSource 和 New CatalogSource 示例:
图 2.5. 跳过更新
该图表明:
- Old CatalogSource 中的任何 Operator 在 New CatalogSource 中均有单一替换项。
- New CatalogSource 中的任何 Operator 在 New CatalogSource 中均有单一替换项。
- 如果未曾安装不良更新,将来也绝不会安装。
2.1.3.3. 替换多个 Operator
按照描述创建 New CatalogSource 需要发布 CSV 来替换
单个 Operator,但可跳过
多个。该操作可通过 skipRange
注解来完成:
olm.skipRange: <semver_range>
其中 <semver_range>
具有 semver library 所支持的版本范围格式。
当在目录中搜索更新时,如果某个频道头提供一个 skipRange
注解,且当前安装的 Operator 的版本字段在该范围内,则 OLM 会更新至该频道中的最新条目。
先后顺序:
-
Subscription 上由
sourceName
指定的源中的频道头(满足其他跳过条件的情况下)。 -
在
sourceName
指定的源中替换当前 Operator 的下一 Operator。 - 对 Subscription 可见的另一个源中的频道头(满足其他跳过条件的情况下)。
- 在对 Subscription 可见的任何源中替换当前 Operator 的下一 Operator。
例如:
附带 skipRange 的 CSV
apiVersion: operators.coreos.com/v1alpha1 kind: ClusterServiceVersion metadata: name: elasticsearch-operator.v4.1.2 namespace: <namespace> annotations: olm.skipRange: '>=4.1.0 <4.1.2'
2.1.3.4. Z-stream 支持
对于相同从版本,z-stream 或补丁版本必须取代所有先前 z-stream 版本。OLM 不关注主版本、从版本或补丁版本,只需要在目录中构建正确图表。
换句话说,OLM 必须能够像在 Old CatalogSource 中一样获取一个图表,像在 New CatalogSource 中一样生成一个图表:
图 2.6. 替换多个 Operator
该图表明:
- Old CatalogSource 中的任何 Operator 在 New CatalogSource 中均有单一替换项。
- New CatalogSource 中的任何 Operator 在 New CatalogSource 中均有单一替换项。
- Old CatalogSource 中的所有 z-stream 版本均会更新至 New CatalogSource 中最新 z-stream 版本。
- 不可用版本可被视为“虚拟”图表节点;它们的内容无需存在,注册表只需像图表看上去这样响应即可。
2.1.4. Operator Lifecycle Manager 架构
Operator Lifecycle Manager 由两个 Operator 组成,分别为:OLM Operator 和 Catalog Operator。
每个 Operator 均负责管理 CRD,而 CRD 是 OLM 的框架基础:
资源 | 短名称 | 所有者 | 描述 |
---|---|---|---|
ClusterServiceVersion |
| OLM | 应用程序元数据:名称、版本、图标、所需资源、安装等。 |
InstallPlan |
| Catalog | 为自动安装或升级 CSV 而需创建的资源的计算列表。 |
CatalogSource |
| Catalog | 定义应用程序的 CSV、CRD 和软件包存储库。 |
Subscription |
| Catalog | 用于通过跟踪软件包中的频道来保持 CSV 最新。 |
OperatorGroup |
| OLM | 用于对多个命名空间进行分组,并准备好供 Operator 使用。 |
每个 Operator 还要负责创建资源:
资源 | 所有者 |
---|---|
部署 | OLM |
ServiceAccounts | |
(Cluster)Roles | |
(Cluster)RoleBindings | |
自定义资源定义 (CRD) | Catalog |
ClusterServiceVersions (CSV) |
2.1.4.1. OLM Operator
集群中存在 CSV 中指定需要的资源后,OLM Operator 将负责部署由 CSV 资源定义的应用程序。
OLM Operator 不负责创建所需资源;用户可选择使用 CLI 手动创建这些资源,也可选择使用 Catalog Operator 来创建这些资源。这种关注点分离的机制可以使得用户逐渐增加他们选择用于其应用程序的 OLM 框架量。
虽然 OLM Operator 通常被配置为监视所有命名空间,但也可与其他 OLM Operator 一同使用,只要所管理的命名空间不同即可。
OLM Operator 工作流
监视命名空间中的 ClusterServiceVersion (CSV),并检查是否满足要求。如果满足,则运行 CSV 的安装策略。
注意CSV 必须为 OperatorGroup 的活跃成员才可运行该安装策略。
2.1.4.2. Catalog Operator
Catalog Operator 负责解析和安装 CSV 及其指定的所需资源。另外还负责监视频道中的 CatalogSource 中是否有软件包更新,并将其升级(可选择自动)至最新可用版本。
希望跟踪频道中软件包的用户可创建 Subscription 资源,该资源将配置所需软件包、频道和 CatalogSource,以便从中拉取更新。找到更新后,便会代表用户将适当 InstallPlan 写入命名空间。
用户也可直接创建 InstallPlan 资源,其中包含所需 CSV 和批准策略的名称,而 Catalog Operator 会为创建所有所需资源创建一个执行计划。批准后,Catalog Operator 将在 InstallPlan 中创建所有资源;然后单独满足 OLM Operator 的要求,从而继续安装 CSV。
Catalog Operator 工作流
- 拥有 CRD 和 CSV 缓存,按名称索引。
监视是否有用户创建的未解析 InstallPlan:
- 查找与请求名称相匹配的 CSV,并将其添加为已解析的资源。
- 对于每个受管或所需 CRD,将其添加为已解析的资源。
- 对于每个所需 CRD,找到管理相应 CRD 的 CSV。
- 监视是否有已解析的 InstallPlan 并为其创建已发现的所有资源(用户批准或自动)。
- 监视 CatalogSource 和 Subscription,并根据它们创建 InstallPlan。
2.1.4.3. Catalog Registry
Catalog Registry 存储 CSV 和 CRD 以便在集群中创建,并存储有关软件包和频道的元数据。
package manifest 是 Catalog Registry 中的一个条目,用于将软件包标识与 CSV 集相关联。在软件包中,频道指向特定 CSV。因为 CSV 明确引用了所替换的 CSV,软件包清单向 Catalog Operator 提供了将 CSV 更新至频道中最新版本所需的信息,逐步安装和替换每个中间版本。
2.1.5. 公开的指标
Operator Lifecycle Manager (OLM) 会公开某些 OLM 特定资源,供基于 Prometheus 的 OpenShift Container Platform 集群监控堆栈使用。
名称 | 描述 |
---|---|
| CatalogSource 的数量。 |
|
在协调 ClusterServiceVersion(CSV)时,每当 CSV 版本处于 |
| 成功注册的 CSV 数量。 |
|
在协调 CSV 时,代表 CSV 版本处于 |
| CSV 升级的 Monotonic 计数。 |
| InstallPlan 的数量。 |
| Subscription 数。 |
|
订阅同步的 Monotonic 计数。包括 |