3

我刚刚开始使用 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")
    }
}

然而,这感觉奇怪的隐含和有点hacky。

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

4

1 回答 1

3

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

看着reconcile.go你会注意到在第 84行有这样的评论:

协调是基于级别的,这意味着操作不是由单个事件中的更改驱动的,而是由从 apiserver 或本地缓存读取的实际集群状态驱动的。例如,如果响应 Pod 删除事件,则请求不会包含 Pod 已删除,而是协调函数在读取集群状态并看到 Pod 丢失时会观察到这一点。

第 44行:

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

于 2021-05-11T09:50:41.003 回答