假设我有以下代码片段,它设置了一个监视外部资源“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
来操作 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中文网其他相关文章!