获取在 kubebuilder 中触发控制器的事件类型

问题描述

我刚刚开始使用 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。

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

解决方法

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

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

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

并在第 #44 行中:

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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...