Menu Close

5.7.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 中 GetSet 一个 conditionType

Get
要获得特定条件,程序库使用来自 controller-runtimeclient.Get 函数,它需要在 conditionAccessor 中存在类型 type.NamespacedNameObjectKey
Set
要更新特定条件的状态,程序库使用来自 controller-runtimeclient.Update 功能。如果 CRD 中不存在 conditionType,则会出现错误。

Operator 只允许修改 CR 的 status 子资源。operator 可以删除或更新 status.conditions 数组,使其包含条件。有关条件中字段的格式和描述的详情,请查看上游的条件 GoDocs

注意

Operator SDK v1.8.0 支持 operator-lib v0.3.0。

先决条件

  • 使用 Operator SDK 生成一个 Operator 项目。

流程

在 Operator 项目中启用 Operator 条件:

  1. 在 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
    )
  2. 在 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 的一个变量 condcond 变量依次使用 GetSet 方法,可用于处理 OLM 的 Upgradeable 条件。

其他资源