ホームページ  >  記事  >  バックエンド開発  >  Konditionner: kcustom リソースの条件を管理する

Konditionner: kcustom リソースの条件を管理する

Susan Sarandon
Susan Sarandonオリジナル
2024-09-19 20:15:10276ブラウズ

Konditionner: Manage conditions in your kcustom resources

昨年、私はさまざまな目的で kubebuilder を使用してオペレーターを構築し始めました。演算子全体で条件を広範囲に使用して、カスタム リソースの調整プロセスの各ステップを管理しました。

残念ながら、sigs.k8s.io の条件については、もっと知りたいと思っていました。競合や壊れた状態などの問題がいくつかありました。そして、問題をさらに掘り下げるにつれて、条件の使用に関する一種のフレームワークを作成し始めました。

最近、ようやく時間をかけて、これらの発見を他の人が使用できるようにライブラリにパッケージ化しました。私はそれをコンディショナーと呼んでいます。 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 つの条件を処理することを意味します。

ポッドを作成したい調整ループがあるとしましょう。条件の目標は、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。