问题1:请教一个kruise rollout的问题,目前我们打算在灰度上使用canary策略。但是在推进下一步以及回滚上碰到点问题。我们后端用的是java fabric8,按照文档所说的,如果想要修改rollout.status.canaryStatus.currentStepState的话,似乎只能用update interface而不是kube patch这个是指什么呢?
问题2:我是k8s java client不是fabric, update相当于下发全量的更新吧?
在 Kruise 中,如果您想要修改 CanaryRollout 的 rollout.status.canaryStatus.currentStepState
字段,确实需要使用 Kruise 提供的 Update
接口而不是 Kubernetes 的 Patch
方法。
通常,在 Kubernetes 中,您可以使用 Patch
方法来更新对象的某些字段。但是,在 Kruise 中,CanaryRollout 对象具有复杂的状态和控制逻辑,因此使用标准的 Patch
操作可能无法满足预期的效果。
相反,Kruise 为 CanaryRollout 提供了一个自定义的 Update
接口,该接口在更新过程中会更加智能地处理 CanarlyRollout 的状态和策略。通过调用 Update
接口并提供新的状态值,Kruise 将根据内部算法自动执行 CanarlyRollout 的下一步操作,并将状态更新为您提供的新值。
具体来说,您可以使用如下代码片段来更新 CanaryRollout 的 currentStepState
:
import (
"github.com/openkruise/kruise-api/apps/v1alpha1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
func updateCanaryRollout(cr *v1alpha1.CanaryRollout, newStepState string) error {
cr.Status.CanaryStatus.CurrentStepState = newStepState
_, err := kubeClient.AppsV1alpha1().CanaryRollouts(namespace).Update(context.TODO(), cr, metav1.UpdateOptions{})
return err
}
上述示例代码中,cr
是一个 CanaryRollout 对象的引用,newStepState
是您希望更新的新的 currentStepState
值。通过将新值分配给 CanaryStatus.CurrentStepState
字段,并调用 Update
接口来实现更新操作。
回答1:这个 method two 方式不是幂等的,你用 patch 容易出现问题。
回答2:主要是 update 会有 ResourceVersion 机制保证。可以保证让你拿到 latest version 的 cr 后再去做 update,否则会 conflict err。此回答整理至钉群“OpenKruise 社区交流群”。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。