首页 > 后端开发 > Golang > Konditionner:管理 kcustom 资源中的条件

Konditionner:管理 kcustom 资源中的条件

Susan Sarandon
发布: 2024-09-19 20:15:10
原创
320 人浏览过

Konditionner: Manage conditions in your kcustom resources

去年,我开始使用 kubebuilder 为各种事情构建操作符。在整个操作员中,我广泛使用条件来管理自定义资源协调流程的每个步骤。

不幸的是,sigs.k8s.io 的条件让我想要更多。我遇到了一些冲突、破坏状态等问题。随着我对问题的深入研究,我开始围绕条件的使用创建一种框架。

我最近终于花了一些时间将这些发现打包到一个库中供其他人使用。我称其为Conditionner。 Konditionner 的核心目标是提供:

  • 完全可扩展的条件类型和状态
  • 用于处理条件的实用程序 API
  • 咨询锁

如何使用

import "github.com/pier-oliviert/konditionner/pkg/konditions"

BuildCondition        konditions.ConditionType = "Builds"
NetworkCondition      konditions.ConditionType = "Network"
PodCondition          konditions.ConditionType = "Pod"
DependenciesCondition konditions.ConditionType = "Dependency"
VariablesCondition    konditions.ConditionType = "Variables"

type MyCRD struct {
    metav1.TypeMeta   `json:",inline"`
    metav1.ObjectMeta `json:"metadata,omitempty"`

    Spec   MySpec   `json:"spec,omitempty"`
    Status MyStatus `json:"status,omitempty"`
}

// ConditionalResource interface, more about it in the Advisory Lock
// section
func (m MyCRD) *konditions.Conditions {
   return &m.Status.Conditions
}

type MySpec struct {
   // ... My Fields ...
}

type MyStatus struct {
    // ... My Fields ...

    Conditions konditions.Conditions `json:"conditions,omitempty"`
}
登录后复制

MyCRD 自定义资源非常简单,但已经可以使用了! Konditionner 没有定义任何类型,因为它特定于每种用途。在这里,我创建了其中 5 个,这意味着我将在协调循环中使用 5 个条件。

假设我有一个协调循环,我想在其中创建一个 Pod。该条件的目标是从初始化并进展到两个结果之一:如果成功则创建,如果过程中出现错误则出错。

咨询锁定条件

由于协调循环在分布式数据库(etcd)和缓存层之上工作,我发现在执行任务之前在条件上创建“锁”要可靠得多。

func (r Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    var record MyCRD
    if err := r.Get(ctx, req, &record); err != nil {
        return ctrl.Result{}, err
    }

    lock := konditions.NewLock(record, r.Client, PodCondition)
    if lock.Condition().Status == konditions.ConditionError {
      // Nothing to do
      return ctrl.Result{}, err
    }

    if lock.Condition().Status == konditions.ConditionInitialized {
      lock.Execute(ctx, func(condition konditions.Condition) error {
        pod, err := createPod()
        if err != nil { return err }
        condition.Status = konditions.ConditionCreated
        condition.Reason = fmt.Sprintf("Pod created: %s", pod.Name)
        record.Conditions().setCondition(condition)
        return nil
})
    }
}
登录后复制

为了使锁发挥作用,记录需要遵守 konditions.ConditionalResource 接口。这就是为什么自定义资源在顶部定义了 Conditions() 方法:

func (m MyCRD) *konditions.Conditions {
   return &m.Status.Conditions
}
登录后复制

文档可在 pkg.go.dev 上获取,源代码可在 Github 上获取。

以上是Konditionner:管理 kcustom 资源中的条件的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:dev.to
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板