假设我有下面的代码片段,它设置了一个协调器来监视外部资源“外部”:
// 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 模块会破坏我当前项目的依赖项。 是的,这是可能的。
您可以在
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 客户端通过
External
协调器使用 YourNativeResource
操作 r.RESTClient
资源。
编辑:
如果你想看资源,动态客户端可能会有所帮助。在
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.")
}
}