当我更新节点或使用 client-go 部署时,我偶尔会遇到这样的错误 "the object has been modified"
I occasionally get such an error "the object has been modified" when I update node or deploy with client-go
当我更新节点或使用客户端部署时,我偶尔会遇到这样的错误 "the object has been modified; please apply your changes to the latest version and try again"-go.My 目标是添加一个 taint/toleration 和一个标签到一个 node/deployment .
有人说应该用
err = retry.RetryOnConflict(retry.DefaultBackoff, func() error {})
,不过好像不行。
func AddFaultToleration(deploy *appsv1.Deployment, ns string, client kubernetes.Interface) (*appsv1.Deployment, error) {
updateDeploy, err := client.AppsV1().Deployments(ns).Get(deploy.Name, metav1.GetOptions{})
if updateDeploy == nil || err != nil {
return deploy, fmt.Errorf("Failed to get latest version of Deployment: %v", err)
}
effect := apiv1.TaintEffectNoExecute
updateDeploy.Spec.Template.Spec.Tolerations = append(updateDeploy.Spec.Template.Spec.Tolerations, apiv1.Toleration{
Key: ToBeFaultTaintKey,
Value: ToBeFaultTaintValue,
Effect: effect,
Operator: apiv1.TolerationOpEqual,
})
updatedDeployWithTolera, err := client.AppsV1().Deployments(ns).Update(updateDeploy)
if err != nil || updatedDeployWithTolera == nil {
return deploy, fmt.Errorf("failed to update deploy %v after adding toleration: %v", deploy.Name, err)
}
log.Info("Successfully added toleration on pod:", updatedDeployWithTolera.Name)
return updatedDeployWithTolera, nil
}
我已经解决了问题。原因是冲突的错误被
隐藏了
updatedDeployWithTolera, err := client.AppsV1().Deployments(ns).Update(updateDeploy) if err != nil || updatedDeployWithTolera == nil { return deploy, fmt.Errorf("failed to update deploy %v after adding toleration: %v", deploy.Name, err)}
,所以retry.RetryOnConflict的功能不起作用
当我更新节点或使用客户端部署时,我偶尔会遇到这样的错误 "the object has been modified; please apply your changes to the latest version and try again"-go.My 目标是添加一个 taint/toleration 和一个标签到一个 node/deployment .
有人说应该用
err = retry.RetryOnConflict(retry.DefaultBackoff, func() error {})
,不过好像不行。
func AddFaultToleration(deploy *appsv1.Deployment, ns string, client kubernetes.Interface) (*appsv1.Deployment, error) {
updateDeploy, err := client.AppsV1().Deployments(ns).Get(deploy.Name, metav1.GetOptions{})
if updateDeploy == nil || err != nil {
return deploy, fmt.Errorf("Failed to get latest version of Deployment: %v", err)
}
effect := apiv1.TaintEffectNoExecute
updateDeploy.Spec.Template.Spec.Tolerations = append(updateDeploy.Spec.Template.Spec.Tolerations, apiv1.Toleration{
Key: ToBeFaultTaintKey,
Value: ToBeFaultTaintValue,
Effect: effect,
Operator: apiv1.TolerationOpEqual,
})
updatedDeployWithTolera, err := client.AppsV1().Deployments(ns).Update(updateDeploy)
if err != nil || updatedDeployWithTolera == nil {
return deploy, fmt.Errorf("failed to update deploy %v after adding toleration: %v", deploy.Name, err)
}
log.Info("Successfully added toleration on pod:", updatedDeployWithTolera.Name)
return updatedDeployWithTolera, nil
}
我已经解决了问题。原因是冲突的错误被
隐藏了updatedDeployWithTolera, err := client.AppsV1().Deployments(ns).Update(updateDeploy) if err != nil || updatedDeployWithTolera == nil { return deploy, fmt.Errorf("failed to update deploy %v after adding toleration: %v", deploy.Name, err)}
,所以retry.RetryOnConflict的功能不起作用