首頁  >  文章  >  後端開發  >  Konditionner:管理 kcustom 資源中的條件

Konditionner:管理 kcustom 資源中的條件

Susan Sarandon
Susan Sarandon原創
2024-09-19 20:15:10294瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn