Heim >Backend-Entwicklung >Golang >So überwachen Sie externe benutzerdefinierte Ressourcenänderungen in Kubebuilder, ohne externe Typen zu importieren
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?
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!