如何在Kubebuilder中不导入外部类型监听自定义资源变更
在Kubebuilder中无需导入外部类型监听外部资源的方法
你可以通过**GVK(Group-Version-Kind)**结合unstructured.Unstructured对象实现无需显式导入外部资源Go类型的监听,完全不需要引入外部依赖模块。具体实现如下:
修改后的代码示例
import ( "k8s.io/apimachinery/pkg/apis/meta/v1/unstructured" "k8s.io/apimachinery/pkg/runtime/schema" // 其他必要导入... ) // SetupWithManager sets up the controller with the Manager. func (r *SomethingReconciler) SetupWithManager(mgr ctrl.Manager) error { // 定义外部资源的GVK信息,替换为实际的Group、Version和Kind externalGVK := schema.GroupVersionKind{ Group: "your.external.group", Version: "v1", Kind: "External", } // 创建空的Unstructured对象并绑定GVK externalObj := &unstructured.Unstructured{} externalObj.SetGroupVersionKind(externalGVK) return ctrl.NewControllerManagedBy(mgr). For(&api.Something{}). WithOptions(controller.Options{ MaxConcurrentReconciles: stdruntime.NumCPU(), RecoverPanic: true, }). Watches( &source.Kind{Type: externalObj}, 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) }
关键说明
- 用到的
unstructured和schema包都属于Kubernetes核心依赖,是Kubebuilder项目默认会引入的,不会破坏现有依赖结构。 - 在你的
findInternalObjectsForExternal方法中,接收到的事件对象会是*unstructured.Unstructured类型,你可以用unstructured.NestedString、unstructured.NestedInt64等方法读取对象的字段值,不需要强类型定义。
内容的提问来源于stack exchange,提问作者mammad
相关产品推荐
相关产品推荐

