首頁 >後端開發 >Golang >如何在 kubebuilder 中監視外部自訂資源變更而不匯入外部類型

如何在 kubebuilder 中監視外部自訂資源變更而不匯入外部類型

WBOY
WBOY轉載
2024-02-06 10:00:11614瀏覽

如何在 kubebuilder 中监视外部自定义资源更改而不导入外部类型

問題內容

假設我有以下程式碼片段,它設定了一個監視外部資源「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中文網其他相關文章!

陳述:
本文轉載於:stackoverflow.com。如有侵權,請聯絡admin@php.cn刪除