登录
首页 >  Golang >  Go问答

调用 Kubernetes 运算符以协调外部资源更改周期

来源:stackoverflow

时间:2024-02-17 14:48:24 345浏览 收藏

亲爱的编程学习爱好者,如果你点开了这篇文章,说明你对《调用 Kubernetes 运算符以协调外部资源更改周期》很感兴趣。本篇文章就来给大家详细解析一下,主要介绍一下,希望所有认真读完的童鞋们,都有实质性的提高。

问题内容

我正在开发一个 k8s 自定义资源,作为业务逻辑的一部分,当集群中的外部作业更改其自身状态时,该资源需要协调其状态。

这些作业不是由自定义资源本身创建的,而是为第三方服务在外部创建的,但是我需要协调 cro 的状态,例如当任何外部作业完成时。

阅读大量文档后,我想出了为控制器设置一个观察器,以观察作业,如下例所示

func (r *datasetreconciler) setupwithmanager(mgr ctrl.manager) error {
    return ctrl.newcontrollermanagedby(mgr).
        for(&datasetv1beta1.dataset{}).
        watches(&source.kind{type: &batchv1.job{}}, &handler.enqueuerequestforobject{} /* filter by predicates, see https://pkg.go.dev/sigs.k8s.io/[email protected]/pkg/controller#controller */).
        complete(r)
}

不,我正在使用相应的名称命名空间触发作业和 cr 的协调循环,但我对对象类型一无所知。

func (r *DatasetReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    l := log.FromContext(ctx)
    l.Info("Enter Reconcile loop")
    l.Info("Request", "Req", req)

    //if this is triggered by my CR
    dataset := &datasetv1beta1.Dataset{}
    r.Get(ctx, types.NamespacedName{Name: req.Name, Namespace: req.Namespace}, dataset)
    //whereas when triggered by a Job
    job := &batchv1.Job{}
    r.Get(ctx, types.NamespacedName{Name: req.Name, Namespace: req.Namespace}, job)


    return ctrl.Result{}, nil
}

如何在协调中检查对象类型?这样我就可以调用 r.get

检索完整的对象数据

正确答案


根据设计,触发协调的事件不会传递到协调器,因此您必须定义状态并对其执行操作。此方法称为 level-based, as opposed to edge-based

在您的示例中,您尝试跟踪两个资源。我建议:

  1. 如果这些资源相关,则使用所有者引用或标签。这样您就可以获取给定作业的所有相关数据集(反之亦然)并以这种方式协调事物。
  2. 如果这两个资源不相关,请为每个资源创建一个单独的控制器。

如果您想阻止某些事件的协调,您可以使用谓词。从谓词函数中的事件中,您可以通过 e.Object.(*core.Pod) 获取对象类型。

以上就是《调用 Kubernetes 运算符以协调外部资源更改周期》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>