Heim >Backend-Entwicklung >Golang >So überwachen Sie externe benutzerdefinierte Ressourcenänderungen in Kubebuilder, ohne externe Typen zu importieren

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

WBOY
WBOYnach vorne
2024-02-06 10:00:11614Durchsuche

如何在 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)
}

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")
}

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
}

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)
}

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 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")
}

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

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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen
Vorheriger Artikel:An Zeigerscheibe anhängenNächster Artikel:An Zeigerscheibe anhängen