OLM
Operator Lifecycle Manager
(OLM)它旨在简化 Operator 的安装、更新和管理。OLM 为 Operator 提供了一个标准化的部署和生命周期管理机制。Operator SDK 既支持为 OLM 部署创建清单,也支持在启用了 OLM 的 Kubernetes 集群上测试 Operator。
官方文档:https://olm.operatorframework.io/docs/
功能
- Operator 部署和安装:
- OLM 提供了一个 Operator 注册中心,开发者可以将自己的 Operator 上传到这个中心。
- 用户可以通过 OLM 轻松地从注册中心安装和部署所需的 Operator。
- 版本管理和升级:
- OLM 能够管理 Operator 的版本信息,并提供自动升级功能。
- 当有新版本的 Operator 可用时,OLM 会自动将现有的 Operator 升级到新版本。
- 依赖管理:
- OLM 可以管理 Operator 之间的依赖关系,确保在部署 Operator 时,所有必需的依赖都能够被正确安装。
- 权限管理:
- OLM 提供了一个基于角色的访问控制系统(RBAC),可以控制 Operator 对 Kubernetes 资源的访问权限。
- 监控和日志:
- OLM 可以收集和展示 Operator 的运行状态和指标数据,帮助用户监控 Operator 的健康状况。
- OLM 还能够收集和管理 Operator 的日志信息。
概念
ClusterServiceVersion
ClusterServiceVersion
(CSV) 表示集群上正在运行的 Operator 的特定版本。它包括元数据,例如名称、描述、版本、存储库链接、标签、图标等。它声明 owned 了 / required CRD、集群要求和安装策略,告诉 OLM 如何创建所需的资源并将 Operator 设置为 Deployment。
Deployment 就像可以从模板中注销 Pod 一样, ClusterServiceVersion
描述了 Operator Deployment 的模板并可以将它们注销。
OLM 要求您提供有关 Operator 的元数据,以确保它可以在集群上安全运行,并提供有关在发布 Operator 的新版本时应如何应用更新的信息。这与rpm,deb等打包软件类似。
示例
apiVersion: operators.coreos.com/v1alpha1
kind: ClusterServiceVersion
metadata:
annotations:
name: memcached-operator.v0.10.0
spec:
# 元数据
description: This is an operator for memcached.
displayName: Memcached Operator
keywords:
- memcached
- app
maintainers:
- email: corp@example.com
name: Some Corp
maturity: alpha
provider:
name: Example
url: www.example.com
version: 0.10.0
minKubeVersion: 1.16.0
# operator 作用域
installModes:
- supported: true
type: OwnNamespace
- supported: true
type: SingleNamespace
- supported: false
type: MultiNamespace
- supported: true
type: AllNamespaces
# 安装
install:
# 策略指示使用哪种类型部署项目
strategy: deployment
# 部署策略的spec是部署规范和所需权限的列表——类似于部署中使用的pod模板
spec:
permissions:
- serviceAccountName: memcached-operator
rules:
- apiGroups:
- ""
resources:
- pods
verbs:
- '*'
# the rest of the rules
# 集群范围所需的权限
clusterPermissions:
- serviceAccountName: memcached-operator
rules:
- apiGroups:
- ""
resources:
- serviceaccounts
verbs:
- '*'
# the rest of the rules
deployments:
- name: memcached-operator
spec:
replicas: 1
# the rest of a deployment spec
# operator提供的apis
customresourcedefinitions:
owned:
# operator拥有的crd列表
# name is the metadata.name of the CRD (which is of the form <plural>.<group>)
- name: memcacheds.cache.example.com
# version is the spec.versions[].name value defined in the CRD
version: v1alpha1
# kind is the CamelCased singular value defined in spec.names.kind of the CRD.
kind: Memcached
required:
# operator所需的crd列表
# see field descriptions above
- name: others.example.com
version: v1alpha1
kind: Other
CatalogSource
CatalogSource
表示 OLM 可以查询的元数据,以发现和安装 Operator 及其依赖项。
CatalogSource
主要有三种类型 spec.sourceType
:
- 带有 image 引用的 grpc :OLM 将拉取镜像并运行具有 api endpoint 的 pod,该 endpoint 可以查询存储中的元数据。
- 带有 address 字段的grpc:OLM 将尝试联系给定地址的 grpc api。在大多数情况下,不应使用此方法。
- internal 或者 configmap :OLM 将解析 configmap 的数据并启动一个 pod,该 pod 可以在其上提供 grpc api。
示例
apiVersion: operators.coreos.com/v1alpha1
kind: CatalogSource
metadata:
name: operatorhubio-catalog
namespace: olm
spec:
sourceType: grpc
image: quay.io/operatorhubio/catalog:latest
displayName: Community Operators
publisher: OperatorHub.io
上面的代码为 OperatorHub.io
定义了一个 CatalogSource
。它的名字用作 Subscription 的输入,它告诉 OLM 在哪里查找请求的操作符。
Subscription
订阅表示安装 Operator 的意图。它是将 Operator 与 CatalogSource
相关联的自定义资源。订阅描述要订阅的 Operator 包的哪个频道,以及是自动更新还是手动更新。如果设置为自动,则订阅将确保 OLM 将管理和升级 Operator,以确保在集群中运行的始终是最新版本。
示例
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
name: my-operator
namespace: olm
spec:
channel: stable
name: my-operator
source: operatorhubio-catalog
Subscription 定义了 Operator 的名称和命名空间,以及可从中找到 Operator 数据的目录。通道(如 alpha、beta 或 stable)有助于确定应从 CatalogSource
安装 Operator 的哪个流。
手动升级
默认情况下,当新版本通过 CatalogSource
可用时,OLM 将自动批准对 Operator 的更新。创建订阅时,可以通过将 installPlanApproval
字段设置为 Manual 如下所示来禁用自动更新。InstallPlan
定义了要创建的一组资源,以便安装或升级到 CSV 定义的 ClusterService
的特定版本。
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
name: my-operator
namespace: operators
spec:
channel: stable
name: my-operator
source: my-catalog
sourceNamespace: operators
installPlanApproval: Manual
手动审批
使用patch命令。
kubectl -n operators get installplans
NAME CSV APPROVAL APPROVED
install-bfmxd my-operator.v0.1.0 Manual false
$ kubectl -n operators patch installplan install-bfmxd -p '{"spec":{"approved":true}}' --type merge
installplan.operators.coreos.com/install-bfmxd patched
$ kubectl -n operators get installplans
NAME CSV APPROVAL APPROVED
install-bfmxd my-operator.v0.1.0 Manual true
当有新版本时,将在对应的namespace中创建一个新的installplans
$ kubectl -n operators get installplans
NAME CSV APPROVAL APPROVED
install-bfmxd my-operator.v0.1.0 Manual true
install-svojy my-operator.v0.2.0 Manual false
当新的 installPlan 处于批准状态时, my-operator.v0.2.0
CSV 将部署到集群,如果 CSV 达到 Succeeded 状态,则将删除旧的 CSV。如果新的 CSV 无法达到 Succeeded 状态,则两个 CSV 将继续存在,由用户来解决故障。无论哪种情况,OLM 都不会删除旧的 installPlans
,因为它们作为集群上安装 CSV 的记录。
通过检查 Operator 的订阅状态,可以确定何时有较新版本的 Operator 可用。与 currentCSV
字段关联的值是 OLM 已知的最新版本,并且是 installedCSV
集群上安装的版本。
OperatorCondition
OperatorCondition
是一个 CRD,用于在 OLM 和它管理的 Operator 之间创建通信。Operator 可以写入 Status.Conditions
数组去修改 Operator 的OLM管理。
示例
apiVersion: operators.coreos.com/v1
kind: OperatorCondition
metadata:
name: foo-operator
namespace: operators
spec:
overrides:
- type: Upgradeable # 允许集群管理员将Operator的升级准备更改为True
status: "True"
reason: "upgradeIsSafe" # 可选
message: "The cluster admin wants to make the operator eligible for an upgrade." # 可选
status:
conditions:
- type: Upgradeable
status: "False"
reason: "migration"
message: "The operator is performing a migration."
lastTransitionTime: "2020-08-24T23:15:55Z"
OperatorGroup
OperatorGroup 是一种 OLM 资源,它为已安装 OLM 的 Operator 提供基本的多租户配置。
详情参见:https://olm.operatorframework.io/docs/concepts/crds/operatorgroup/
架构
Operator Lifecycle Manager 由两个 Operator 组成:OLM Operator 和 Catalog Operator。这两个 Operator 都负责管理 OLM 框架基础的 CRD:
资源 | 简称 | 所有者 | 描述 |
---|---|---|---|
ClusterServiceVersion | csv | OLM | 应用程序元数据:名称、版本、图标、所需资源、安装等。 |
InstallPlan | ip | Catalog | 自动安装或升级 CSV 所需创建的资源的计算列表。 |
CatalogSource | catsrc catsrc | Catalog | 用于定义应用程序的 CSV、CRD 和包的存储库。 |
Subscription | sub | Catalog | 用于定义应用程序的 CSV、CRD 和包的存储库。 |
OperatorGroup | og | OLM | 用于对多个命名空间进行分组供 Operator 使用 |