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:
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"` }
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.
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 }) } }
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 }
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!