开发者社区 > 云原生 > 正文

请教一个kruise rollout的问题,下列问题怎么解决?

问题1:请教一个kruise rollout的问题,目前我们打算在灰度上使用canary策略。但是在推进下一步以及回滚上碰到点问题。我们后端用的是java fabric8,按照文档所说的,如果想要修改rollout.status.canaryStatus.currentStepState的话,似乎只能用update interface而不是kube patch这个是指什么呢?4ca357048d127af0e1a6ea124c7c5231.png
问题2:我是k8s java client不是fabric, update相当于下发全量的更新吧?

展开
收起
小易01 2023-07-19 21:21:43 75 0
2 条回答
写回答
取消 提交回答
  • 在 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 接口来实现更新操作。

    2023-07-28 11:57:38
    赞同 展开评论 打赏
  • 意中人就是我呀!

    回答1:这个 method two 方式不是幂等的,你用 patch 容易出现问题。
    回答2:主要是 update 会有 ResourceVersion 机制保证。可以保证让你拿到 latest version 的 cr 后再去做 update,否则会 conflict err。此回答整理至钉群“OpenKruise 社区交流群”。

    2023-07-19 23:54:30
    赞同 展开评论 打赏

阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载