So überwachen Sie externe benutzerdefinierte Ressourcenänderungen in Kubebuilder, ohne externe Typen zu importieren

WBOY
Freigeben: 2024-02-06 10:00:11
nach vorne
575 Leute haben es durchsucht

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

Frageninhalt

Angenommen, ich habe den folgenden Codeausschnitt, der einen Koordinator einrichtet, der eine externe Ressource „extern“ überwacht:

// 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)
}
Nach dem Login kopieren

Mein Problem ist, dass ich den Typ somev1.external nicht in mein Projekt importieren kann, da der Import eines Go-Moduls, das diesen Typ enthält, die Abhängigkeiten meines aktuellen Projekts zerstören würde.

Gibt es in Kubebuilder eine Möglichkeit, externe Ressourcen zu überwachen, ohne deren Typen explizit zu importieren? Wie GVK oder so?


Richtige Antwort


Ja, das ist möglich.

Sie können einen Rest-Client für Ihre Ressource in main.go wie folgt erstellen:

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")
}
Nach dem Login kopieren

Dann geben Sie diese Rest-Client-Struktur (rest.interface) 的字段添加到您的协调器 (yournativeresource_controller.go) ein, zum Beispiel:

type yournativeresourcereconciler struct {
    client.client
    scheme        *runtime.scheme
    // add this
    restclient    rest.interface
}
Nach dem Login kopieren

Zuletzt initialisieren Sie Ihren Koordinator mit diesem Rest-Client (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)
}
Nach dem Login kopieren

Vergessen Sie nicht, das rbac-Tag zu Ihrem Projekt hinzuzufügen (vorzugsweise zum Koordinator), es generiert rbac-Regeln, die Ihnen den Betrieb ermöglichen external Ressourcen:

//+kubebuilder:rbac:groups=some.group.io,resources=externals,verbs=get;list;watch;create;update;patch;delete
Nach dem Login kopieren

Nach Abschluss dieser Schritte können Sie den Rest-Client über den yournativeresource-Koordinator verwenden (verwenden Sie r.restclient, um die yournativeresource 协调器(使用 r.restclient 来操作 external-Ressource zu bearbeiten.

)

Herausgeber:

Wenn Sie Quellen ansehen möchten, kann ein dynamischer Client hilfreich sein. Erstellen Sie einen dynamischen Client in main.go:

dynamicclient, err := dynamic.newforconfig(mgr.getconfig())
if err != nil {
    setuplog.error(err, "unable to create dynamic client")
}
Nach dem Login kopieren

Wenden Sie die oben genannten Schritte an, fügen Sie sie Ihrem Koordinator hinzu usw. Anschließend können Sie die external-Ressource wie unten gezeigt ansehen:

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.")
    }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonSo überwachen Sie externe benutzerdefinierte Ressourcenänderungen in Kubebuilder, ohne externe Typen zu importieren. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage
Über uns Haftungsausschluss Sitemap
Chinesische PHP-Website:Online-PHP-Schulung für das Gemeinwohl,Helfen Sie PHP-Lernenden, sich schnell weiterzuentwickeln!