问题内容 假设我有以下代码片段,它设置了一个监视外部资源“external”的协调器: // SetupWithManager sets up the controller with
假设我有以下代码片段,它设置了一个监视外部资源“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 中监视外部自定义资源更改而不导入外部类型的详细内容,更多请关注编程网其它相关文章!
--结束END--
本文标题: 如何在 kubebuilder 中监视外部自定义资源更改而不导入外部类型
本文链接: https://lsjlt.com/news/561419.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
2024-05-24
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0