国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Argo Rollouts 基于 Analysis 的漸進(jìn)式發(fā)布

發(fā)布時(shí)間:2021-07-17 21:45 來(lái)源: 閱讀:0 作者:佚名 欄目: 云計算 歡迎投稿:712375056

前面我們介紹了使用手動(dòng)的方式來(lái)控制 Argo Rollouts 進(jìn)行應用交付,此外我們還可以利用 Argo Rollouts 提供的分析(Analysis)來(lái)執行自動(dòng)交付。Argo Rollouts 提供了幾種執行分析(Analysis)的方法來(lái)推動(dòng)漸進(jìn)式交付,首先需要了解幾個(gè) CRD 資源:

  • Rollout:Rollout 是 Deployment 資源的直接替代品,它提供額外的 blueGreen 和 canary 更新策略,這些策略可以在更新期間創(chuàng )建 AnalysisRuns 和 Experiments,可以推進(jìn)更新,或中止更新。
  • AnalysisTemplate:AnalysisTemplate 是一個(gè)模板,它定義了如何執行金絲雀分析,例如它應該執行的指標、頻率以及被視為成功或失敗的值,AnalysisTemplate 可以用輸入值進(jìn)行參數化。
  • ClusterAnalysisTemplate:ClusterAnalysisTemplate 和 AnalysisTemplate 類(lèi)似,但它是全局范圍內的,它可以被整個(gè)集群的任何 Rollout 使用。
  • AnalysisRun:AnalysisRun 是 AnalysisTemplate 的實(shí)例化。AnalysisRun 就像 Job 一樣,它們最終會(huì )完成,完成的運行被認為是成功的、失敗的或不確定的,運行的結果分別影響 Rollout 的更新是否繼續、中止或暫停。

后臺分析

金絲雀正在執行其部署步驟時(shí),分析可以在后臺運行。

以下示例是每 10 分鐘逐漸將 Canary 權重增加 20%,直到達到 100%。在后臺,基于名為 success-rate 的 AnalysisTemplate 啟動(dòng) AnalysisRun,success-rate 模板查詢(xún) Prometheus 服務(wù)器,以 5 分鐘間隔/樣本測量 HTTP 成功率,它沒(méi)有結束時(shí)間,一直持續到停止或失敗。如果測量到的指標小于 95%,并且有三個(gè)這樣的測量值,則分析被視為失敗。失敗的分析會(huì )導致 Rollout 中止,將 Canary 權重設置回零,并且 Rollout 將被視為降級。否則,如果 rollout 完成其所有 Canary 步驟,則認為 rollout 是成功的,并且控制器將停止運行分析。

如下所示的 Rollout 資源對象:

  1. apiVersion: argoproj.io/v1alpha1 
  2. kind: Rollout 
  3. metadata: 
  4.   name: guestbook 
  5. spec: 
  6. ... 
  7.   strategy: 
  8.     canary: 
  9.       analysis: 
  10.         templates: 
  11.         - templateName: success-rate 
  12.         startingStep: 2 # 延遲開(kāi)始分析,到第3步開(kāi)始 
  13.         args: 
  14.         - name: service-name 
  15.           value: guestbook-svc.default.svc.cluster.local 
  16.       steps: 
  17.       - setWeight: 20 
  18.       - pause: {duration: 10m} 
  19.       - setWeight: 40 
  20.       - pause: {duration: 10m} 
  21.       - setWeight: 60 
  22.       - pause: {duration: 10m} 
  23.       - setWeight: 80 
  24.       - pause: {duration: 10m} 

上面我們引用了一個(gè) success-rate 的模板:

  1. apiVersion: argoproj.io/v1alpha1 
  2. kind: AnalysisTemplate 
  3. metadata: 
  4.   name: success-rate 
  5. spec: 
  6.   args: 
  7.   - name: service-name 
  8.   metrics: 
  9.   - name: success-rate 
  10.     interval: 5m 
  11.     # NOTE: prometheus queries return results in the form of a vector. 
  12.     # So it is common to access the index 0 of the returned array to obtain the value 
  13.     successCondition: result[0] >= 0.95 
  14.     failureLimit: 3 
  15.     provider: 
  16.       prometheus: 
  17.         address: http://prometheus.example.com:9090 
  18.         query: | 
  19.           sum(irate( 
  20.             istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code!~"5.*"}[5m] 
  21.           )) / 
  22.           sum(irate( 
  23.             istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}"}[5m] 
  24.           )) 

內聯(lián)分析

分析也可以作為內嵌“分析”步驟來(lái)執行,當分析以 "內聯(lián) "方式進(jìn)行時(shí),在到達該步驟時(shí)啟動(dòng) AnalysisRun,并在運行完成之前阻止其推進(jìn)。分析運行的成功或失敗決定了部署是繼續進(jìn)行下一步,還是完全中止部署。

如下所示的示例中我們將 Canary 權重設置為 20%,暫停 5 分鐘,然后運行分析。如果分析成功,則繼續發(fā)布,否則中止。

  1. apiVersion: argoproj.io/v1alpha1 
  2. kind: Rollout 
  3. metadata: 
  4.   name: guestbook 
  5. spec: 
  6. ... 
  7.   strategy: 
  8.     canary: 
  9.       steps: 
  10.       - setWeight: 20 
  11.       - pause: {duration: 5m} 
  12.       - analysis: 
  13.           templates: 
  14.           - templateName: success-rate 
  15.           args: 
  16.           - name: service-name 
  17.             value: guestbook-svc.default.svc.cluster.local 

上面的對象中我們將 analysis 作為一個(gè)步驟內聯(lián)到了 Rollout 步驟中,當20%流量暫停5分鐘后,開(kāi)始執行 success-rate 這個(gè)分析模板。

這里 AnalysisTemplate 與上面的后臺分析例子相同,但由于沒(méi)有指定間隔時(shí)間,分析將執行一次測量就完成了。

  1. apiVersion: argoproj.io/v1alpha1 
  2. kind: AnalysisTemplate 
  3. metadata: 
  4.   name: success-rate 
  5. spec: 
  6.   args: 
  7.   - name: service-name 
  8.   - name: prometheus-port 
  9.     value: 9090 
  10.   metrics: 
  11.   - name: success-rate 
  12.     successCondition: result[0] >= 0.95 
  13.     provider: 
  14.       prometheus: 
  15.         address: "http://prometheus.example.com:{{args.prometheus-port}}" 
  16.         query: | 
  17.           sum(irate( 
  18.             istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code!~"5.*"}[5m] 
  19.           )) / 
  20.           sum(irate( 
  21.             istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}"}[5m] 
  22.           )) 

此外我們可以通過(guò)指定 count 和 interval 字段,可以在一個(gè)較長(cháng)的時(shí)間段內進(jìn)行多次測量。

  1. metrics: 
  2.   - name: success-rate 
  3.     successCondition: result[0] >= 0.95 
  4.     interval: 60s 
  5.     count: 5 
  6.     provider: 
  7.       prometheus: 
  8.         address: http://prometheus.example.com:9090 
  9.         query: ... 

多個(gè)模板的分析

Rollout 在構建 AnalysisRun 時(shí)可以引用多個(gè) AnalysisTemplate。這樣我們就可以從多個(gè) AnalysisTemplate 中來(lái)組成分析,如果引用了多個(gè)模板,那么控制器將把這些模板合并在一起,控制器會(huì )結合所有模板的指標和 args 字段。如下所示:

  1. apiVersion: argoproj.io/v1alpha1 
  2. kind: Rollout 
  3. metadata: 
  4.   name: guestbook 
  5. spec: 
  6. ... 
  7.   strategy: 
  8.     canary: 
  9.       analysis: 
  10.         templates: 
  11.         - templateName: success-rate 
  12.         - templateName: error-rate 
  13.         args: 
  14.         - name: service-name 
  15.           value: guestbook-svc.default.svc.cluster.local 
  16.  
  17. --- 
  18.  
  19. apiVersion: argoproj.io/v1alpha1 
  20. kind: AnalysisTemplate 
  21. metadata: 
  22.   name: success-rate 
  23. spec: 
  24.   args: 
  25.   - name: service-name 
  26.   metrics: 
  27.   - name: success-rate 
  28.     interval: 5m 
  29.     successCondition: result[0] >= 0.95 
  30.     failureLimit: 3 
  31.     provider: 
  32.       prometheus: 
  33.         address: http://prometheus.example.com:9090 
  34.         query: | 
  35.           sum(irate( 
  36.             istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code!~"5.*"}[5m] 
  37.           )) / 
  38.           sum(irate( 
  39.             istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}"}[5m] 
  40.           )) 
  41. --- 
  42. apiVersion: argoproj.io/v1alpha1 
  43. kind: AnalysisTemplate 
  44. metadata: 
  45.   name: error-rate 
  46. spec: 
  47.   args: 
  48.   - name: service-name 
  49.   metrics: 
  50.   - name: error-rate 
  51.     interval: 5m 
  52.     successCondition: result[0] <= 0.95 
  53.     failureLimit: 3 
  54.     provider: 
  55.       prometheus: 
  56.         address: http://prometheus.example.com:9090 
  57.         query: | 
  58.           sum(irate( 
  59.             istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code=~"5.*"}[5m] 
  60.           )) / 
  61.           sum(irate( 
  62.             istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}"}[5m] 
  63.           )) 

當執行的分析的時(shí)候,控制器會(huì )將上面的 success-rate 和 error-rate 兩個(gè)模板合并到一個(gè) AnalysisRun 對象中去。

需要注意的是如果出現以下情況,控制器在合并模板時(shí)將出錯:

  • 模板中的多個(gè)指標具有相同的名稱(chēng)
  • 兩個(gè)同名的參數都有值

分析模板參數

AnalysisTemplates 可以聲明一組參數,這些參數可以由 Rollouts 傳遞。然后,這些參數可以像在 metrics 配置中一樣使用,并在 AnalysisRun 創(chuàng )建時(shí)被實(shí)例化,參數占位符被定義為 {{ args. }},如下所示:

  1. apiVersion: argoproj.io/v1alpha1 
  2. kind: AnalysisTemplate 
  3. metadata: 
  4.   name: args-example 
  5. spec: 
  6.   args: 
  7.   # required 
  8.   - name: service-name 
  9.   - name: stable-hash 
  10.   - name: latest-hash 
  11.   # optional 
  12.   - name: api-url 
  13.     value: http://example/measure 
  14.   # from secret 
  15.   - name: api-token 
  16.     valueFrom: 
  17.       secretKeyRef: 
  18.         name: token-secret 
  19.         key: apiToken 
  20.   metrics: 
  21.   - name: webmetric 
  22.     successCondition: result == 'true' 
  23.     provider: 
  24.       web: 
  25.         # placeholders are resolved when an AnalysisRun is created 
  26.         url: "{{ args.api-url }}?service={{ args.service-name }}" 
  27.         headers: 
  28.           - keyAuthorization 
  29.             value: "Bearer {{ args.api-token }}" 
  30.         jsonPath: "{$.results.ok}" 

在創(chuàng )建 AnalysisRun 時(shí),Rollout 中定義的參數與 AnalysisTemplate 的參數會(huì )合并,如下所示:

  1. apiVersion: argoproj.io/v1alpha1 
  2. kind: Rollout 
  3. metadata: 
  4.   name: guestbook 
  5. spec: 
  6. ... 
  7.   strategy: 
  8.     canary: 
  9.       analysis: 
  10.         templates: 
  11.         - templateName: args-example 
  12.         args: 
  13.         # required value 
  14.         - name: service-name 
  15.           value: guestbook-svc.default.svc.cluster.local 
  16.         # override default value 
  17.         - name: api-url 
  18.           value: http://other-api 
  19.         # pod template hash from the stable ReplicaSet 
  20.         - name: stable-hash 
  21.           valueFrom: 
  22.             podTemplateHashValue: Stable 
  23.         # pod template hash from the latest ReplicaSet 
  24.         - name: latest-hash 
  25.           valueFrom: 
  26.             podTemplateHashValue: Latest 

此外分析參數也支持 valueFrom,用于讀取 meta 數據并將其作為參數傳遞給 AnalysisTemplate,如下例子是引用元數據中的 env 和 region 標簽,并將它們傳遞給 AnalysisTemplate。

  1. apiVersion: argoproj.io/v1alpha1 
  2. kind: Rollout 
  3. metadata: 
  4.   name: guestbook 
  5.   labels: 
  6.     appType: demo-app 
  7.     buildType: nginx-app 
  8.     ... 
  9.     env: dev 
  10.     region: us-west-2 
  11. spec: 
  12. ... 
  13.   strategy: 
  14.     canary: 
  15.       analysis: 
  16.         templates: 
  17.         - templateName: args-example 
  18.         args: 
  19.         ... 
  20.         - name: env 
  21.           valueFrom: 
  22.             fieldRef: 
  23.               fieldPath: metadata.labels['env'
  24.         # region where this app is deployed 
  25.         - name: region 
  26.           valueFrom: 
  27.             fieldRef: 
  28.               fieldPath: metadata.labels['region'

藍綠預發(fā)布分析

使用 BlueGreen 策略的 Rollout 可以在使用預發(fā)布將流量切換到新版本之前啟動(dòng)一個(gè) AnalysisRun。分析運行的成功或失敗決定 Rollout 是否切換流量,或完全中止 Rollout,如下所示:

  1. kind: Rollout 
  2. metadata: 
  3.   name: guestbook 
  4. spec: 
  5. ... 
  6.   strategy: 
  7.     blueGreen: 
  8.       activeService: active-svc 
  9.       previewService: preview-svc 
  10.       prePromotionAnalysis: 
  11.         templates: 
  12.         - templateName: smoke-tests 
  13.         args: 
  14.         - name: service-name 
  15.           value: preview-svc.default.svc.cluster.local 

上面我們的示例中一旦新的 ReplicaSet 完全可用,Rollout 會(huì )創(chuàng )建一個(gè)預發(fā)布的 AnalysisRun,Rollout 不會(huì )將流量切換到新版本,而是會(huì )等到分析運行成功完成。

注意:如果指定了 autoPromotionSeconds 字段,并且 Rollout 已經(jīng)等待了 auto promotion seconds 的時(shí)間,Rollout 會(huì )標記 AnalysisRun 成功,并自動(dòng)將流量切換到新版本。如果 AnalysisRun 在此之前完成,Rollout 將不會(huì )創(chuàng )建另一個(gè) AnalysisRun,并等待 autoPromotionSeconds 的剩余時(shí)間。

藍綠發(fā)布后分析

使用 BlueGreen 策略的 Rollout 還可以在流量切換到新版本后使用發(fā)布后分析。如果發(fā)布后分析失敗或出錯,Rollout 則進(jìn)入中止狀態(tài),并將流量切換回之前的穩定 Replicaset,當后分析成功時(shí),Rollout 被認為是完全發(fā)布狀態(tài),新的 ReplicaSet 將被標記為穩定,然后舊的 ReplicaSet 將根據 scaleDownDelaySeconds(默認為30秒)進(jìn)行縮減。

  1. apiVersion: argoproj.io/v1alpha1 
  2. kind: Rollout 
  3. metadata: 
  4.   name: guestbook 
  5. spec: 
  6. ... 
  7.   strategy: 
  8.     blueGreen: 
  9.       activeService: active-svc 
  10.       previewService: preview-svc 
  11.       scaleDownDelaySeconds: 600 # 10 minutes 
  12.       postPromotionAnalysis: 
  13.         templates: 
  14.         - templateName: smoke-tests 
  15.         args: 
  16.         - name: service-name 
  17.           value: preview-svc.default.svc.cluster.local 

失敗條件

failureCondition 可以用來(lái)配置分析運行失敗,下面的例子是每隔5分鐘持續輪詢(xún) Prometheus 服務(wù)器來(lái)獲得錯誤總數,如果遇到10個(gè)或更多的錯誤,則認為分析運行失敗。

  1. metrics: 
  2. name: total-errors 
  3.   interval: 5m 
  4.   failureCondition: result[0] >= 10 
  5.   failureLimit: 3 
  6.   provider: 
  7.     prometheus: 
  8.       address: http://prometheus.example.com:9090 
  9.       query: | 
  10.         sum(irate( 
  11.           istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code~"5.*"}[5m] 
  12.         )) 

無(wú)結果的運行

分析運行j結果也可以被認為是不確定的,這表明運行既不成功,也不失敗。無(wú)結果的運行會(huì )導致發(fā)布在當前步驟上暫停。這時(shí)需要人工干預,以恢復運行,或中止運行。當一個(gè)指標沒(méi)有定義成功或失敗的條件時(shí),分析運行可能成為無(wú)結果的一個(gè)例子。

  1. metrics: 
  2.  - name: my-query 
  3.    provider: 
  4.      prometheus: 
  5.        address: http://prometheus.example.com:9090 
  6.        query: ... 

此外當同時(shí)指定了成功和失敗的條件,但測量值沒(méi)有滿(mǎn)足任何一個(gè)條件時(shí),也可能發(fā)生不確定的分析運行。

  1. metrics: 
  2. name: success-rate 
  3.   successCondition: result[0] >= 0.90 
  4.   failureCondition: result[0] < 0.50 
  5.   provider: 
  6.     prometheus: 
  7.       address: http://prometheus.example.com:9090 
  8.       query: ... 

不確定的分析運行的一個(gè)場(chǎng)景是使 Argo Rollouts 能夠自動(dòng)執行分析運行,并收集測量結果,但仍然允許我們來(lái)判斷決定測量值是否可以接受,并決定繼續或中止。

延遲分析運行

如果分析運行不需要立即開(kāi)始(即給指標提供者時(shí)間來(lái)收集金絲雀版本的指標),分析運行可以延遲特定的指標分析。每個(gè)指標可以被配置為有不同的延遲,除了特定指標的延遲之外,具有后臺分析的發(fā)布可以延遲創(chuàng )建分析運行,直到達到某個(gè)步驟為止

如下所示延遲一個(gè)指定的分析指標:

  1. metrics: 
  2. name: success-rate 
  3.   # Do not start this analysis until 5 minutes after the analysis run starts 
  4.   initialDelay: 5m 
  5.   successCondition: result[0] >= 0.90 
  6.   provider: 
  7.     prometheus: 
  8.       address: http://prometheus.example.com:9090 
  9.       query: ... 

延遲開(kāi)始后臺分析運行,直到步驟3(設定重量40%)。

  1. apiVersion: argoproj.io/v1alpha1 
  2. kind: Rollout 
  3. metadata: 
  4.   name: guestbook 
  5. spec: 
  6.   strategy: 
  7.     canary: 
  8.       analysis: 
  9.         templates: 
  10.         - templateName: success-rate 
  11.         startingStep: 2 
  12.       steps: 
  13.       - setWeight: 20 
  14.       - pause: {duration: 10m} 
  15.       - setWeight: 40 
  16.       - pause: {duration: 10m} 

引用 Secret

AnalysisTemplate 和 AnalysisRun 可以在 .spec.args 中引用 Secret 對象,這允許用戶(hù)安全地將認證信息傳遞給指標提供方,如登錄憑證或 API 令牌。

需要注意一個(gè) AnalysisRun 只能引用它所運行的同一命名空間的 Secret。

如下所示的例子中,一個(gè) AnalysisTemplate 引用了一個(gè) API 令牌,并把它傳遞給一個(gè)Web 指標提供者。

  1. apiVersion: argoproj.io/v1alpha1 
  2. kind: AnalysisTemplate 
  3. spec: 
  4.   args: 
  5.   - name: api-token 
  6.     valueFrom: 
  7.       secretKeyRef: 
  8.         name: token-secret 
  9.         key: apiToken 
  10.   metrics: 
  11.   - name: webmetric 
  12.     provider: 
  13.       web: 
  14.         headers: 
  15.         - keyAuthorization 
  16.           value: "Bearer {{ args.api-token }}" 

【編輯推薦】

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

亚洲欧洲中文日韩久久AV乱码| 国产高清在线精品一区APP| 国产精品久久国产精品99 GIF| 丰满人妻无码专区视频| 欧美一性一乱一交一视频| 97久久精品无码一区二区天美|