首頁 > 後端開發 > Golang > 主體

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

WBOY
發布: 2024-02-06 10:00:11
轉載
576 人瀏覽過

如何在 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
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!