K8S运算符出现"对象已修改"错误
import "sigs.k8s.io/controller-runtime"
关于这种错误有很多讨论.主要的答案是"发生这个问题是因为我在try 更新时有旧版本的对象." 但我也有几个问题.在我的操作符中,对于某些场景,我需要在一次"协调"调用期间更新Pod的注释两次.当然,我经常收到关于"对象已被修改"的错误.
问:我想知道'r.Get()'和'r.Update()'在哪里获取/更新对象?从本地缓存,还是API服务器?
1:我以为‘r.Get()’是从‘cache’中获取对象,而‘r.Update()’是要缓存的更新对象,对吗?如果是这样,为什么我会得到这个错误?如果pod对象是由于运算符以外的其他原因更改的,我将永远无法在当前的协调过程中更新我的pod对象?(因为缓存对象是本地的,它已经与API服务器不同步.)为什么重试一段时间可以获得最新的对象?
import "sigs.k8s.io/controller-runtime"
var pod corev1.Pod
if err := r.Get(ctx, req.NamespacedName, &pod); err != nil {
if !apierrors.IsNotFound(err) {
log.Error(err, "unable to get pod")
return ctrl.Result{}, err
}
}
if err := r.Update(ctx, &pod); err != nil {
log.Error(err, "unable to update chaosctl status")
return ctrl.Result{}, err
}
2:如果‘r.Get()’是从API服务器获取对象,则‘r.Update()’也更新API服务器.为什么我需要对更新对象进行一些重试?