假設我有以下程式碼片段,它設定了一個監視外部資源「external」的協調器:
// 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) }
我的問題是我無法將 somev1.external
類型導入到我的專案中,因為導入包含此類型的 go 模組會破壞我目前專案的依賴項。
kubebuilder 中有沒有一種方法可以監視外部資源,而無需明確匯入其類型?像 gvk 還是什麼?
是的,這是可能的。
您可以在 main.go
中為您的資源建立 rest 用戶端,如下所示:
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") }
然後將此 rest 用戶端 (rest.interface
) 的欄位新增至您的協調器 (yournativeresource_controller.go
) 結構中,例如:
type yournativeresourcereconciler struct { client.client scheme *runtime.scheme // add this restclient rest.interface }
最後,使用此 rest 用戶端 (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) }
不要忘記將 rbac 標記新增到您的專案(最好是協調器),它將產生 rbac 規則,允許您操作 external
資源:
//+kubebuilder:rbac:groups=some.group.io,resources=externals,verbs=get;list;watch;create;update;patch;delete
完成這些步驟後,您可以使用 rest 用戶端透過 yournativeresource
協調器(使用 r.restclient
來操作 external
資源。
編輯:
如果您想觀看資源,動態客戶端可能會有所幫助。在main.go
中建立動態客戶端:
dynamicclient, err := dynamic.newforconfig(mgr.getconfig()) if err != nil { setuplog.error(err, "unable to create dynamic client") }
應用上述步驟,將其添加到您的協調器等。然後您將能夠觀看 external
資源,如下所示:
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.") } }
以上是如何在 kubebuilder 中監視外部自訂資源變更而不匯入外部類型的詳細內容。更多資訊請關注PHP中文網其他相關文章!