Rumah > pembangunan bahagian belakang > Golang > Konditionner: Urus keadaan dalam sumber kcustom anda

Konditionner: Urus keadaan dalam sumber kcustom anda

Susan Sarandon
Lepaskan: 2024-09-19 20:15:10
asal
295 orang telah melayarinya

Konditionner: Manage conditions in your kcustom resources

Tahun lepas, saya mula membina operator dengan kubebuilder untuk pelbagai perkara. Sepanjang pengendali, saya menggunakan syarat secara meluas untuk mengurus setiap langkah proses penyelarasan untuk sumber tersuai.

Malangnya, Syarat sigs.k8s.io membuatkan saya mahu lebih. Saya mempunyai beberapa isu dengan konflik, keadaan rosak, dsb. Dan semasa saya mengkaji lebih lanjut masalah itu, saya mula mencipta semacam rangka kerja sekitar penggunaan syarat saya.

Saya akhirnya mengambil beberapa kali baru-baru ini untuk membungkus penemuan tersebut ke dalam perpustakaan untuk digunakan oleh orang lain. Saya memanggilnya Konditionner. Pada terasnya, matlamat Konditionner adalah untuk menawarkan:

  • Jenis dan status keadaan boleh dilanjutkan sepenuhnya
  • API Utiliti untuk berfungsi dengan Syarat
  • Kunci Nasihat

Cara menggunakan

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"`
}
Salin selepas log masuk

Sumber tersuai MyCRD agak kosong tetapi ia sedia untuk digunakan! Konditionner tidak disertakan dengan sebarang jenis yang ditentukan, kerana ia khusus untuk setiap penggunaan. Di sini, saya mencipta 5 daripadanya, yang bermaksud bahawa saya akan bekerja dengan 5 syarat dalam gelung penyesuaian.

Mari kita berpura-pura saya mempunyai gelung perdamaian tempat saya ingin mencipta pod. Matlamat syarat adalah untuk beralih daripada Dimulakan dan maju ke arah satu daripada dua hasil: Dibuat jika berjaya, Ralat jika terdapat ralat dalam proses.

Kunci Nasihat dengan syarat

Memandangkan gelung penyelarasan berfungsi di atas pangkalan data teragih(etcd) dan lapisan cache, saya dapati ia lebih dipercayai untuk membuat "kunci" dengan syarat sebelum melaksanakan tugas.

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
})
    }
}
Salin selepas log masuk

Untuk kunci berfungsi, rekod perlu mematuhi syarat. Antara muka Sumber Bersyarat. Inilah sebabnya, di bahagian atas, sumber tersuai mempunyai kaedah Syarat() yang ditakrifkan:

func (m MyCRD) *konditions.Conditions {
   return &m.Status.Conditions
}
Salin selepas log masuk

Dokumentasi tersedia di pkg.go.dev dan sumbernya tersedia di Github.

Atas ialah kandungan terperinci Konditionner: Urus keadaan dalam sumber kcustom anda. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:dev.to
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan