Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk memantau perubahan sumber tersuai luaran dalam kubebuilder tanpa mengimport jenis luaran

Bagaimana untuk memantau perubahan sumber tersuai luaran dalam kubebuilder tanpa mengimport jenis luaran

WBOY
WBOYke hadapan
2024-02-06 10:00:11578semak imbas

如何在 kubebuilder 中监视外部自定义资源更改而不导入外部类型

Kandungan soalan

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?


Jawapan betul


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!

Kenyataan:
Artikel ini dikembalikan pada:stackoverflow.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Lampirkan pada hirisan penunjukArtikel seterusnya:Lampirkan pada hirisan penunjuk