前面我们介绍了使用手动的方式来控制 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 }}”