互联网技术 / 互联网资讯 · 2024年1月21日

Argo Rollouts采用分析方法实现渐进式发布

前面我们介绍了使用手动的方式来控制 ARgo Rollouts 进行应用交付,此外我们还可以利用 ARgo Rollouts 提供的分析(analysis)来执行自动交付。ARgo Rollouts 提供了几种执行分析(analysis)的方法来推动渐进式交付,首先需要了解几个 CRD 资源:

Rollout:Rollout 是 DeployMent 资源的直接替代品,它提供额外的 blueGReen 和 canaRy 更新策略,这些策略可以在更新期间创建 analysisRuns 和 ExpeRiMents,可以推进更新,或中止更新。 analysistemplate:analysistemplate 是一个模板,它定义了如何执行金丝雀分析,例如它应该执行的指标、频率以及被视为成功或失败的值,analysistemplate 可以用输入值进行参数化。 ClUSteRanalysistemplate:ClUSteRanalysistemplate 和 analysistemplate 类似,但它是全局范围内的,它可以被整个集群的任何 Rollout 使用。 analysisRun:analysisRun 是 analysistemplate 的实例化。analysisRun 就像 Job 一样,它们最终会完成,完成的运行被认为是成功的、失败的或不确定的,运行的结果分别影响 Rollout 的更新是否继续、中止或暂停。 后台分析

金丝雀正在执行其部署步骤时,分析可以在后台运行。

以下示例是每 10 分钟逐渐将 CanaRy 权重增加 20%,直到达到 100%。在后台,基于名为 sUCceSS-Rate 的 analysistemplate 启动 analysisRun,sUCceSS-Rate 模板查询 ProMetheUS 服务器,以 5 分钟间隔/样本测量 HTTP 成功率,它没有结束时间,一直持续到停止或失败。如果测量到的指标小于 95%,并且有三个这样的测量值,则分析被视为失败。失败的分析会导致 Rollout 中止,将 CanaRy 权重设置回零,并且 Rollout 将被视为降级。否则,如果 Rollout 完成其所有 CanaRy 步骤,则认为 Rollout 是成功的,并且控制器将停止运行分析。

如下所示的 Rollout 资源对象:

APIversion: aRgoProj.io/v1alpha1 kind: Rollout Metadata: naMe: guestbook spec:… stRategy: canaRy: steps: – setWeight: 20 – pause: {duRation: 10M} – setWeight: 40 – pause: {duRation: 10M} – setWeight: 60 – pause: {duRation: 10M} – setWeight: 80 – pause: {duRation: 10M}

上面我们引用了一个 sUCceSS-Rate 的模板:

APIversion: aRgoProj.io/v1alpha1 kind: analysistemplate Metadata: naMe: sUCceSS-Rate spec: aRgs: – naMe: seRvice-naMe MetRics: – naMe: sUCceSS-Rate inteRval: 5M sUCceSSCondITion: Result[0] >= 0.95 failureLiMIT: 3 ProvideR: ProMetheUS: addReSS: http://ProMetheUS.example.coM:9090 queRy: | suM(iRate( istio_requests_tOTAl{reporteR=”souRce”,destination_seRvice=~”{{aRgs.seRvice-naMe}}”,Response_code!~”5.*”}[5M] )) / suM(iRate( istio_requests_tOTAl{reporteR=”souRce”,destination_seRvice=~”{{aRgs.seRvice-naMe}}” }[5M] ))

分析也可以作为内嵌“分析”步骤来执行,当分析以 “内联 “方式进行时,在到达该步骤时启动 analysisRun,并在运行完成之前阻止其推进。分析运行的成功或失败决定了部署是继续进行下一步,还是完全中止部署。

如下所示的示例中我们将 CanaRy 权重设置为 20%,暂停 5 分钟,然后运行分析。如果分析成功,则继续发布,否则中止。

APIversion: aRgoProj.io/v1alpha1 kind: Rollout Metadata: naMe: guestbook spec:… stRategy: canaRy: steps: – setWeight: 20 – pause: {duRation: 5M} – analysis: templates: – templateNaMe: sUCceSS-Rate aRgs: – naMe: seRvice-naMe value: guestbook-svc.deFAult.svc.clUSteR.local

上面的对象中我们将 analysis 作为一个步骤内联到了 Rollout 步骤中,当20%流量暂停5分钟后,开始执行 sUCceSS-Rate 这个分析模板。

这里 analysistemplate 与上面的后台分析例子相同,但由于没有指定间隔时间,分析将执行一次测量就完成了。

APIversion: aRgoProj.io/v1alpha1 kind: analysistemplate Metadata: naMe: sUCceSS-Rate spec: aRgs: – naMe: seRvice-naMe – naMe: ProMetheUS-poRt value: 9090 MetRics: – naMe: sUCceSS-Rate sUCceSSCondITion: Result[0] >= 0.95 ProvideR: ProMetheUS: addReSS: “http://ProMetheUS.example.coM:{{aRgs.ProMetheUS-poRt}}” queRy: | suM(iRate( istio_requests_tOTAl{reporteR=”souRce”,destination_seRvice=~”{{aRgs.seRvice-naMe}}”,Response_code!~”5.*”}[5M] )) / suM(iRate( istio_requests_tOTAl{reporteR=”souRce”,destination_seRvice=~”{{aRgs.seRvice-naMe}}” }[5M] ))

此外我们可以通过指定 count 和 inteRval 字段,可以在一个较长的时间段内进行多次测量。

MetRics: – naMe: sUCceSS-Rate sUCceSSCondITion: Result[0] >= 0.95 inteRval: 60s count: 5 ProvideR: ProMetheUS: addReSS: http://ProMetheUS.example.coM:9090 queRy:… 多个模板的分析

Rollout 在构建 analysisRun 时可以引用多个 analysistemplate。这样我们就可以从多个 analysistemplate 中来组成分析,如果引用了多个模板,那么控制器将把这些模板合并在一起,控制器会结合所有模板的指标和 aRgs 字段。如下所示:

APIversion: aRgoProj.io/v1alpha1 kind: Rollout Metadata: naMe: guestbook spec:… stRategy: canaRy: analysis: templates: – templateNaMe: sUCceSS-Rate – templateNaMe: Error-Rate aRgs: – naMe: seRvice-naMe value: guestbook-svc.deFAult.svc.clUSteR.local

当执行的分析的时候,控制器会将上面的 sUCceSS-Rate 和 Error-Rate 两个模板合并到一个 analysisRun 对象中去。

需要注意的是如果出现以下情况,控制器在合并模板时将出错:

模板中的多个指标具有相同的名称 两个同名的参数都有值 分析模板参数

analysistemplates 可以声明一组参数,这些参数可以由 Rollouts 传递。然后,这些参数可以像在 MetRics 配置中一样使用,并在 analysisRun 创建时被实例化,参数占位符被定义为 {{ aRgs. }}。

APIversion: aRgoProj.io/v1alpha1 kind: analysistemplate Metadata: naMe: aRgs-example spec: aRgs: – naMe: seRvice-naMe – naMe: stable-hash – naMe: latest-hash – naMe: API-uRl value: http://example/MeasuRe MetRics: – naMe: webMetRic sUCceSSCondITion: Result == ‘tRue’ ProvideR: web: uRl: “{{ aRgs.API-uRl }}” headeRs: – key: authorization value: “BeaReR {{ aRgs.API-Token }}” jsonPath: “{$.Results.ok}”

在创建 analysisRun 时,Rollout 中定义的参数与 analysistemplate 的参数会合并。

APIversion: aRgoProj.io/v1alpha1 kind: Rollout Metadata: naMe: guestbook spec:… stRategy: canaRy: analysis: templates: – templateNaMe: aRgs-example aRgs: – naMe: seRvice-naMe value: guestbook-svc.deFAult.svc.clUSteR.local

analysistemplate 和 analysisRun 可以在 .spec.aRgs 中引用 SecRet 对象,这允许用户安全地将认证信息传递给指标提供方,如登录凭证或 API 令牌。

需要注意一个 analysisRun 只能引用它所运行的同一命名空间的 SecRet。

如下所示的例子中,一个 analysistemplate 引用了一个 API 令牌,并把它传递给一个Web 指标提供者。

APIversion: aRgoProj.io/v1alpha1 kind: analysistemplate spec: aRgs: – naMe: API-Token valueFRoM: secRetKeyRef: naMe: Token-secRet key: APIToken MetRics: – naMe: webMetRic ProvideR: web: headeRs: – key: authorization value: “BeaReR {{ aRgs.API-Token }}”

OpenMagic API

Need more than content? Move into the product flow.

If you are here for model access, pricing, developer docs, or the future API console, the dedicated product path now lives on api.openmagic.ai.

登录免费注册