【问题标题】:Getting the type of event, that triggered a controller in kubebuilder获取触发 kubebuilder 中的控制器的事件类型
【发布时间】:2021-07-31 23:47:09
【问题描述】:

我刚刚开始使用 kubebuilder 和 Golang 来使用自定义资源扩展我们的 Kubernetes 集群。我很想根据实际调用它的事件在协调器函数中做不同的事情。

资源是否已创建?更新了吗?被删了吗?

这些事件中的每一个都会触发控制器,但是,我似乎无法找到可能看到哪些事件实际发生了。我可以通过编写这样的协调器来解决这个问题:

func (r *ServiceDescriptorReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    service := &batchv1.ServiceDescriptor{}
    if err := r.Get(context.TODO(), req.NamespacedName, service); err != nil && errors.IsNotFound(err) {
        fmt.Println("Resource was not found -> must have been deleted")
    else {
        fmt.Println("No errors found -> Resource must have been created or updated")
    }
}

然而,这让人感觉奇怪的含蓄而且有点老套。

是否有一种干净的(可能是原生的)方法来获取协调器调用的事件类型?

【问题讨论】:

    标签: go kubernetes kubernetes-custom-resources kubebuilder


    【解决方案1】:

    您将无法做到这一点,因为该系统被设计为基于级别的,它不是由单个事件更改触发,而是由从 apiserver 获取的实际集群状态触发。

    查看reconcile.go,您会注意到#84 中有这样的评论:

    和解是基于级别的,这意味着行动不会被改变所驱使 在单个事件中,而是由实际的集群状态驱动 从 apiserver 或本地缓存中读取。例如,如果响应 一个 Pod 删除事件,请求不会包含一个 Pod 是 删除,而不是协调函数在读取 集群状态并看到 Pod 丢失。

    并在线#44

    请求包含核对所需的信息 Kubernetes 对象。这包括唯一的信息 识别对象 - 它的名称和命名空间。 它不包含 有关任何特定事件或对象内容本身的信息

    【讨论】:

    • 感谢您的回答!这对我来说非常清楚。现在,我尝试r.Get 资源,并检查返回的错误为if err != nil && errors.IsNotFound(err),它一直在可靠地检测资源是否被删除。从您的角度来看,这是一个很好的解决方法吗?
    • 我不是专家,但是是的,看起来是一个很好的解决方法。它以类似的方式实现here,所以它是正确的。如果您觉得这个答案有帮助,请不要忘记留下投票。
    • 如何区分 Reconcile 中的创建和更新(或者文档在哪里显示此类示例)?
    • @DanCat 我认为 kubernetes 的哲学是,如果你问这个问题,你就做错了。 Kubernetes 控制器的目的是实现所需的状态。它检查世界,如果世界与期望的状态不匹配,它会做一些事情使它更接近期望的状态。所以它不关心是什么触发了和解——那是历史。现在重要的是我该怎么做才能解决问题。
    猜你喜欢
    • 1970-01-01
    • 2014-04-20
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多