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

WBOY
Lepaskan: 2024-02-06 10:00:11
ke hadapan
575 orang telah melayarinya

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

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

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

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

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

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

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

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!

sumber:stackoverflow.com
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!