昨年、私はさまざまな目的で kubebuilder を使用してオペレーターを構築し始めました。演算子全体で条件を広範囲に使用して、カスタム リソースの調整プロセスの各ステップを管理しました。
残念ながら、sigs.k8s.io の条件については、もっと知りたいと思っていました。競合や壊れた状態などの問題がいくつかありました。そして、問題をさらに掘り下げるにつれて、条件の使用に関する一種のフレームワークを作成し始めました。
最近、ようやく時間をかけて、これらの発見を他の人が使用できるようにライブラリにパッケージ化しました。私はそれをコンディショナーと呼んでいます。 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 つの条件を処理することを意味します。
ポッドを作成したい調整ループがあるとしましょう。条件の目標は、Initialized から移行し、2 つの結果のいずれかに進むことです: 成功した場合は Created、プロセスでエラーがあった場合は Error。
調整ループは分散データベース (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 中国語 Web サイトの他の関連記事を参照してください。