去年,我開始使用 kubebuilder 為各種事情建立操作符。在整個操作員中,我廣泛使用條件來管理自訂資源協調流程的每個步驟。
不幸的是,sigs.k8s.io 的條件讓我想要更多。我遇到了一些衝突、破壞狀態等問題。隨著我對問題的深入研究,我開始圍繞條件的使用創建一種框架。
我最近終於花了一些時間將這些發現打包到一個庫中供其他人使用。我稱之為Conditionner。 Konditionner 的核心目標是提供:
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中文網其他相關文章!