5.6.6. 启用 Operator 条件
Operator Lifecycle Manager(OLM)为 Operator 提供一个频道来交流影响 Operator 在管理 Operator 的复杂状态。默认情况下,OLM 在安装 Operator 时会创建一个 OperatorCondition
自定义资源定义(CRD)。根据 OperatorCondition
自定义资源(CR)中设置的条件,OLM 的行为会相应更改。
要支持 Operator 条件,Operator 必须能够读取由 OLM 创建的 OperatorCondition
CR,并具有完成以下任务的能力:
- 获取特定条件。
- 设置特定条件的状态。
这可以通过使用 operator-lib
库来实现。Operator 作者可在 Operator 中提供 controller-runtime
客户端,以便该程序库访问集群中 Operator 拥有的 OperatorCondition
CR。
该程序库提供了一个通用的 Conditions
接口,它使以下方法在 OperatorCondition
CR 中 Get
和 Set
一个 conditionType
:
Get
-
要获得特定条件,程序库使用来自
controller-runtime
的client.Get
函数,它需要在conditionAccessor
中存在类型type.NamespacedName
的ObjectKey
。 Set
-
要更新特定条件的状态,程序库使用来自
controller-runtime
的client.Update
功能。如果 CRD 中不存在conditionType
,则会出现错误。
Operator 只允许修改 CR 的 status
子资源。operator 可以删除或更新 status.conditions
数组,使其包含条件。有关条件中字段的格式和描述的详情,请查看上游的条件 GoDocs。
Operator SDK v1.3.0 支持 operator-lib
v0.3.0。
先决条件
- 使用 Operator SDK 生成一个 Operator 项目。
流程
在 Operator 项目中启用 Operator 条件:
在 Operator 项目的
go.mod
文件中,将operator-framework/operator-lib
添加为所需的库:module github.com/example-inc/memcached-operator go 1.15 require ( k8s.io/apimachinery v0.19.2 k8s.io/client-go v0.19.2 sigs.k8s.io/controller-runtime v0.7.0 operator-framework/operator-lib v0.3.0 )
在 Operator 逻辑中编写自己的构造器,会导致以下结果:
-
接受
controller-runtime
客户端。 -
接受
conditionType
。 -
返回一个
Condition
接口以更新或添加条件。
由于 OLM 目前支持
Upgradeable
条件,因此可以创建一个接口,它具有访问Upgradeable
条件的方法。例如:import ( ... apiv1 "github.com/operator-framework/api/pkg/operators/v1" ) func NewUpgradeable(cl client.Client) (Condition, error) { return NewCondition(cl, "apiv1.OperatorUpgradeable") } cond, err := NewUpgradeable(cl);
在这个示例中,
NewUpgradeable
constructor 被进一步使用来创建类型为Condition
的一个变量cond
。cond
变量依次使用Get
和Set
方法,可用于处理 OLM 的Upgradeable
条件。-
接受
其他资源