Rumah >pembangunan bahagian belakang >Golang >Bagaimana untuk memantau perubahan sumber tersuai luaran dalam kubebuilder tanpa mengimport jenis luaran
Andaikan saya mempunyai coretan kod berikut, yang menyediakan penyelaras yang memantau sumber luaran "luaran":
// SetupWithManager sets up the controller with the Manager. func (r *SomethingReconciler) SetupWithManager(mgr ctrl.Manager) error { return ctrl.NewControllerManagedBy(mgr). For(&api.Something{}). WithOptions(controller.Options{ MaxConcurrentReconciles: stdruntime.NumCPU(), RecoverPanic: true, }). Watches( &source.Kind{Type: &somev1.External{}}, handler.EnqueueRequestsFromMapFunc(r.findInternalObjectsForExternal), builder.WithPredicates(predicate.Funcs{ UpdateFunc: func(ue event.UpdateEvent) bool { return true }, DeleteFunc: func(de event.DeleteEvent) bool { return true }, }), ). Complete(r) }
Masalah saya ialah saya tidak boleh mengimport jenis somev1.external
ke dalam projek saya kerana mengimport modul go yang mengandungi jenis ini akan memecahkan kebergantungan projek semasa saya.
Adakah terdapat cara dalam kubebuilder untuk memantau sumber luaran tanpa mengimport jenisnya secara eksplisit? Seperti gvk atau sesuatu?
Ya, boleh.
Anda boleh mencipta pelanggan rehat untuk sumber anda dalam main.go
seperti ini:
gvkexternal := schema.groupversionkind{ group: "some.group.io", version: "v1", kind: "external", } restclient, err := apiutil.restclientforgvk(gvkexternal, false, mgr.getconfig(), serializer.newcodecfactory(mgr.getscheme())) if err != nil { setuplog.error(err, "unable to create rest client") }
Kemudian letakkan struktur rest client (rest.interface
) 的字段添加到您的协调器 (yournativeresource_controller.go
) ini, contohnya:
type yournativeresourcereconciler struct { client.client scheme *runtime.scheme // add this restclient rest.interface }
Akhir sekali, mulakan penyelaras anda menggunakan klien rehat ini (main.go
):
if err = (&controllers.yournativeresourcereconciler{ client: mgr.getclient(), scheme: mgr.getscheme(), restclient: restclient, }).setupwithmanager(mgr); err != nil { setuplog.error(err, "unable to create controller", "controller", "yournativeresource") os.exit(1) }
Jangan lupa tambahkan tag rbac pada projek anda (sebaik-baiknya penyelaras), ia akan menjana peraturan rbac yang membolehkan anda beroperasi external
Sumber:
//+kubebuilder:rbac:groups=some.group.io,resources=externals,verbs=get;list;watch;create;update;patch;delete
Selepas melengkapkan langkah ini, anda boleh menggunakan klien yang lain melalui penyelaras yournativeresource
(gunakan r.restclient
untuk memanipulasi sumber yournativeresource
协调器(使用 r.restclient
来操作 external
.
Editor:
Jika anda ingin menonton sumber, pelanggan dinamik mungkin membantu. Cipta pelanggan dinamik dalam main.go
:
dynamicclient, err := dynamic.newforconfig(mgr.getconfig()) if err != nil { setuplog.error(err, "unable to create dynamic client") }
Gunakan langkah di atas, tambahkan pada penyelaras anda dsb. Anda kemudiannya akan dapat menonton external
sumber seperti yang ditunjukkan di bawah:
resourceInterface := r.DynamicClient.Resource(schema.GroupVersionResource{ Group: "some.group.io", Version: "", Resource: "externals", }) externalWatcher, err := resourceInterface.Watch(ctx, metav1.ListOptions{}) if err != nil { return err } defer externalWatcher.Stop() select { case event := <-externalWatcher.ResultChan(): if event.Type == watch.Deleted { logger.Info("FINALIZER: An external resource is deleted.") } }
Atas ialah kandungan terperinci Bagaimana untuk memantau perubahan sumber tersuai luaran dalam kubebuilder tanpa mengimport jenis luaran. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!