2

我开发了一个 k8s Operator,在第一个命名空间中部署了第一个 Operator 后,它运行良好。然后我在第二个命名空间中部署第二个操作员,我看到第二个控制器获取命名空间仍然是第一个名称的请求,但预期的命名空间应该是第二个。

请看下面的代码,当我在第二个命名空间中使用第二个运算符时,请求的命名空间仍然是第一个命名空间。

func (r *AnexampleReconciler) Reconcile(request ctrl.Request) (ctrl.Result, error) {

    log := r.Log.WithValues("Anexample", request.NamespacedName)

    instance := &v1alpha1.Anexample{}
    err := r.Get(context.TODO(), request.NamespacedName, instance)
    if err != nil {
        if errors.IsNotFound(err) {
            log.Info("Anexample resource not found. Ignoring since object must be deleted.")
            return reconcile.Result{}, nil
        }

        log.Error(err, "Failed to get Anexample.")
        return reconcile.Result{}, err
    }

我怀疑这可能与选举有关,但我不明白。

    mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
        Scheme:             scheme,
        MetricsBindAddress: metricsAddr,
        Port:               9443,
        LeaderElection:     enableLeaderElection,
        LeaderElectionID:   "2eeda3e4.com.aaa.bbb.ccc",
    })
    if err != nil {
        setupLog.Error(err, "unable to start manager")
        os.Exit(1)
    }

控制器中发生了什么?如何解决?

4

1 回答 1

0

request.Namespaced取决于您正在部署的自定义资源的命名空间。

Operator 部署在命名空间中,但仍可以配置为侦听所有命名空间中的自定义资源。这不应该与选举有关,而是与您设置经理的方式有关。您没有ctrl.Options在管理器中指定命名空间,因此它将侦听所有命名空间中的 CR 更改。如果您希望您的操作员只监听一个命名空间,请将命名空间传递给管理器。

mgr, err := ctrl.NewManager(ctrl.GetConfigOrDie(), ctrl.Options{
        Scheme:             scheme,
        MetricsBindAddress: metricsAddr,
        Port:               9443,
        LeaderElection:     enableLeaderElection,
        LeaderElectionID:   "2eeda3e4.com.aaa.bbb.ccc",
        Namesace:           "<namespace-of-operator-two>",
    })
    if err != nil {
        setupLog.Error(err, "unable to start manager")
        os.Exit(1)
    }

另请参阅:https ://developers.redhat.com/blog/2020/06/26/migrating-a-namespace-scoped-operator-to-a-cluster-scoped-operator#migration_guide__namespace_scoped_to_cluster_scoped

于 2022-02-07T13:13:41.987 回答