Operator SDK - 更新 CreationTimestamp

Operator SDK - Update CreationTimestamp

我目前正在使用 Golang 和 Operator SDK 编写 Kubernetes Operator。

为了知道创建资源是否超时,我检查了我当前资源的 CreationTimestamp 属性。成功 Update 后,我想更新该资源的 CreationTimestamp,但是当我这样做时,什么也没有发生,CreationTimestamp 保持不变...

我的 Reconcile 循环看起来像这样:

func (r *MyReconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Result, error) {
    myObject := &v1alpha1.My{}
    err := r.Get(ctx, req.NamespacedName, myObject)
    if err != nil {
      // do something
    }

    //if marked to be deleted
    //do something
    //...


    //if marked to be updated
    myObject.SetCreationTimestamp(v1.Now())

    err = r.Update(ctx, configMap) //updates all fields that I changed except for CreationTimestamp...
    if err != nil {
        println("ERR:", err.Error()) //doesnt get thrown
    }

    println(myObject.CreationTimestamp) //still the old timestamp instead of v1.Now()

   //...
}

或者是否有任何其他方法可以跟踪上次协调资源的时间?

我认为没有办法实现这一点,但我找到了解决方法。

在您的 CRD 中,字段 metadata.annotations 可以将信息存储在 map[string]string 中,不会被覆盖。

所以我创建了一个名为 CreationTimestamp 的字段,并使用 myObject.ObjectMeta.Annotations["creationTimestamp"] 在我的 go 代码中检索它。

我可以像这样更新值:myObject.ObjectMeta.Annotations["creationTimestamp"] = "newvalue" 然后执行 Update 来保存更改