首页 > 解决方案 > 控制器在与其自定义资源不同的命名空间中创建/监视资源

问题描述

我有一个控制器,它在“foo”命名空间中协调 MyKind 自定义资源。在协调循环中,它在“bar”命名空间中创建部署 MyDeployment。我想知道如何在“bar”命名空间中创建的 MyDeployment 上设置监视,该命名空间不同于自定义资源所在的命名空间(“foo”)。

我尝试使用以下设置我的管理器,但它似乎不起作用,因为我试图观察的部署位于不同的命名空间中,因此控制器无法接收部署上的 CRUD 操作的任何事件。

    return controllerruntime.NewControllerManagedBy(mgr).
        For(&v1alpha1.MyKind{}).
        Owns(&appsv1.Deployment{}).
        Complete(r)
}

是否有任何自定义手表可以配置我的控制器,以便在不同的命名空间中接收部署事件。

注意:我尝试了 handler.EnqueueRequestsFromMapFunc,IIUC 它还协调了同一命名空间中的 Kinds。

标签: kuberneteskubebuilder

解决方案


您可以通过在ctrl.Options{}创建对象时传入对象来在管理器选项中指定命名空间。

namespace := "namespace1,namespace2"
options := ctrl.Options{
        .
        .
        .
        Namespace: cache.MultiNamespacedCacheBuilder(strings.Split(namespace, ","))
    }

mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), options)

推荐阅读