Argo ロールアウト: 分析に基づく段階的なリリース

Argo ロールアウト: 分析に基づく段階的なリリース

[[411608]]

先ほど、アプリケーション配信用の Argo Rollouts を制御する手動の方法を紹介しました。さらに、Argo Rollouts が提供する分析を使用して自動配信を実行することもできます。 Argo Rollouts は、段階的な配信を推進するための分析を実行するためのいくつかの方法を提供します。まず、いくつかの CRD リソースを理解する必要があります。

  • ロールアウト: ロールアウトは、更新中に AnalysisRuns と Experiments を作成したり、更新を進めたり、更新を中止したりできる追加の blueGreen および canary 更新戦略を提供する、デプロイメント リソースのドロップイン代替品です。
  • AnalysisTemplate: AnalysisTemplate は、実行すべきメトリック、頻度、成功または失敗と見なされる値など、カナリア分析の実行方法を定義するテンプレートです。 AnalysisTemplate は入力値でパラメータ化できます。
  • ClusterAnalysisTemplate: ClusterAnalysisTemplate は AnalysisTemplate に似ていますが、スコープがグローバルであり、クラスター全体の任意のロールアウトで使用できます。
  • AnalysisRun: AnalysisRun は AnalysisTemplate のインスタンス化です。 AnalysisRuns は、最終的には完了するという点でジョブに似ており、完了した実行は成功、失敗、または不確定と見なされ、実行の結果によって、ロールアウトの更新がそれぞれ続行されるか、中止されるか、一時停止されるかが左右されます。

背景分析

カナリアがデプロイメント手順を実行している間、分析はバックグラウンドで実行できます。

次の例では、カナリアの重みが 100% に達するまで、10 分ごとに 20% ずつ徐々に増加します。バックグラウンドでは、success-rate という名前の AnalysisTemplate に基づいて AnalysisRun が開始され、Prometheus サーバーにクエリを実行して 5 分間隔/サンプルで HTTP 成功率を測定します。このクエリには終了時間がなく、停止または失敗するまで継続されます。測定されたメトリックが 95% 未満で、そのような測定値が 3 つあった場合、分析は失敗と見なされました。分析が失敗するとロールアウトが中止され、カナリアの重みはゼロに戻され、ロールアウトは劣化したものとみなされます。それ以外の場合、ロールアウトがすべてのカナリア ステップを完了すると、ロールアウトは成功したと見なされ、コントローラーは分析の実行を停止します。

Rollout リソース オブジェクトは次のとおりです。

  1. apiバージョン: argoproj.io/v1alpha1
  2. 種類: ロールアウト
  3. メタデータ:
  4. 名前: ゲストブック
  5. 仕様:
  6. ...
  7. 戦略:
  8. カナリア:
  9. 分析:
  10. テンプレート:
  11. - テンプレート名: 成功率
  12. 開始ステップ: 2 # 分析の開始をステップ3まで遅らせる
  13. 引数:
  14. -名前: サービス 
  15. 値: guestbook-svc。デフォルトは.svc.cluster です。地元 
  16. 手順:
  17. - 重みを設定: 20
  18. - 一時停止: {期間: 10 分}
  19. - 重みを設定: 40
  20. - 一時停止: {期間: 10 分}
  21. - 重みを設定: 60
  22. - 一時停止: {期間: 10 分}
  23. - 重みの設定: 80
  24. - 一時停止: {期間: 10 分}

上記では成功率テンプレートを引用しました。

  1. apiバージョン: argoproj.io/v1alpha1
  2. 種類: 分析テンプレート
  3. メタデータ:
  4. 名前: 成功率
  5. 仕様:
  6. 引数:
  7. -名前: サービス 
  8. メトリクス:
  9. -名前:成功率
  10. 間隔: 5m
  11. # 注意: Prometheus クエリは結果をベクトル形式返します
  12. # そのため、返された配列インデックス0アクセスして値を取得する一般的です
  13. 成功条件: 結果[0] >= 0.95
  14. 失敗制限: 3
  15. プロバイダー:
  16. プロメテウス:
  17. アドレス: http://prometheus.example.com:9090
  18. クエリ: |
  19. 合計(怒って(
  20. istio_requests_total{reporter= "source" 、destination_service=~ "{{args.service-name}}" 、response_code!~ "5.*" }[5m]
  21. )) /
  22. 合計(怒って(
  23. istio_requests_total{reporter= "source" 、destination_service=~ "{{args.service-name}}" }[5m]
  24. ))

インライン分析

分析は、インラインの「分析」ステップとして実行することもできます。分析が「インライン」で実行される場合、そのステップに到達すると AnalysisRun が開始され、実行が完了するまで先に進むことがブロックされます。分析実行の成功または失敗によって、デプロイメントが次のステップに進むか、デプロイメントが完全に中止されるかが決まります。

以下に示す例では、カナリアの重みを 20% に設定し、5 分間一時停止してから分析を実行します。分析が成功した場合は公開が続行され、失敗した場合は中止されます。

  1. apiバージョン: argoproj.io/v1alpha1
  2. 種類: ロールアウト
  3. メタデータ:
  4. 名前: ゲストブック
  5. 仕様:
  6. ...
  7. 戦略:
  8. カナリア:
  9. 手順:
  10. - 重みを設定: 20
  11. - 一時停止: {期間: 5 分}
  12. - 分析:
  13. テンプレート:
  14. - テンプレート名: 成功率
  15. 引数:
  16. -名前: サービス 
  17. 値: guestbook-svc。デフォルトは.svc.cluster です。地元 

上記のオブジェクトでは、分析をロールアウト ステップのステップとしてインライン化します。トラフィックの 20% が 5 分間停止すると、成功率分析テンプレートが実行されます。

ここでの AnalysisTemplate は上記のバックグラウンド分析の例と同じですが、間隔が指定されていないため、分析は 1 回実行されて完了します。

  1. apiバージョン: argoproj.io/v1alpha1
  2. 種類: 分析テンプレート
  3. メタデータ:
  4. 名前: 成功率
  5. 仕様:
  6. 引数:
  7. -名前: サービス 
  8. -名前: プロメテウスポート
  9. 値: 9090
  10. メトリクス:
  11. -名前:成功率
  12. 成功条件: 結果[0] >= 0.95
  13. プロバイダー:
  14. プロメテウス:
  15. アドレス: "http://prometheus.example.com:{{args.prometheus-port}}"  
  16. クエリ: |
  17. 合計(怒って(
  18. istio_requests_total{reporter= "source" 、destination_service=~ "{{args.service-name}}" 、response_code!~ "5.*" }[5m]
  19. )) /
  20. 合計(怒って(
  21. istio_requests_total{reporter= "source" 、destination_service=~ "{{args.service-name}}" }[5m]
  22. ))

さらに、カウント フィールドと間隔フィールドを指定することで、より長い期間にわたって複数の測定を実行することもできます。

  1. メトリクス:
  2. -名前:成功率
  3. 成功条件: 結果[0] >= 0.95
  4. 間隔: 60秒
  5. カウント: 5
  6. プロバイダー:
  7. プロメテウス:
  8. アドレス: http://prometheus.example.com:9090
  9. クエリ: ...

複数のテンプレートの分析

Rollout は、AnalysisRun を構築するときに複数の AnalysisTemplates を参照できます。この方法では、複数の AnalysisTemplates から分析を作成できます。複数のテンプレートが参照されている場合、コントローラーはそれらを結合します。コントローラーは、すべてのテンプレートの metrics フィールドと args フィールドを結合します。以下のように表示されます。

  1. apiバージョン: argoproj.io/v1alpha1
  2. 種類: ロールアウト
  3. メタデータ:
  4. 名前: ゲストブック
  5. 仕様:
  6. ...
  7. 戦略:
  8. カナリア:
  9. 分析:
  10. テンプレート:
  11. - テンプレート名: 成功率
  12. - テンプレート名: エラー率
  13. 引数:
  14. -名前: サービス 
  15. 値: guestbook-svc。デフォルトは.svc.cluster です。地元 
  16.  
  17. ---  
  18.  
  19. apiバージョン: argoproj.io/v1alpha1
  20. 種類: 分析テンプレート
  21. メタデータ:
  22. 名前: 成功率
  23. 仕様:
  24. 引数:
  25. -名前: サービス 
  26. メトリクス:
  27. -名前:成功率
  28. 間隔: 5m
  29. 成功条件: 結果[0] >= 0.95
  30. 失敗制限: 3
  31. プロバイダー:
  32. プロメテウス:
  33. アドレス: http://prometheus.example.com:9090
  34. クエリ: |
  35. 合計(怒って(
  36. istio_requests_total{reporter= "source" 、destination_service=~ "{{args.service-name}}" 、response_code!~ "5.*" }[5m]
  37. )) /
  38. 合計(怒って(
  39. istio_requests_total{reporter= "source" 、destination_service=~ "{{args.service-name}}" }[5m]
  40. ))
  41. ---  
  42. apiバージョン: argoproj.io/v1alpha1
  43. 種類: 分析テンプレート
  44. メタデータ:
  45. 名前: エラー率
  46. 仕様:
  47. 引数:
  48. -名前: サービス 
  49. メトリクス:
  50. -名前: エラー率
  51. 間隔: 5m
  52. 成功条件: 結果[0] <= 0.95
  53. 失敗制限: 3
  54. プロバイダー:
  55. プロメテウス:
  56. アドレス: http://prometheus.example.com:9090
  57. クエリ: |
  58. 合計(怒って(
  59. istio_requests_total{reporter= "source" 、destination_service=~ "{{args.service-name}}" 、response_code=~ "5.*" }[5m]
  60. )) /
  61. 合計(怒って(
  62. istio_requests_total{reporter= "source" 、destination_service=~ "{{args.service-name}}" }[5m]
  63. ))

分析を実行すると、コントローラーは上記の成功率テンプレートとエラー率テンプレートを AnalysisRun オブジェクトにマージします。

以下の状況が発生した場合、コントローラーはテンプレートのマージに失敗することに注意してください。

  • テンプレート内の複数のメトリックが同じ名前を持つ
  • 同じ名前の2つのパラメータに値がある

テンプレートパラメータの解析

AnalysisTemplates は、ロールアウトによって渡すことができる一連のパラメータを宣言できます。これらのパラメータは、メトリック構成と同様に使用でき、AnalysisRun の作成時にインスタンス化され、パラメータ プレースホルダは {{ args. }} のように表示されます。

  1. apiバージョン: argoproj.io/v1alpha1
  2. 種類: 分析テンプレート
  3. メタデータ:
  4. 名前: 引数例
  5. 仕様:
  6. 引数:
  7. # 必須
  8. -名前: サービス 
  9. -名前: 安定したハッシュ
  10. -名前: 最新ハッシュ
  11. # オプション
  12. -名前: API URL
  13. 値: http://example/measure
  14. #秘密から
  15. -名前: APIトークン
  16. 値:
  17. シークレットキーリファレンス:
  18. 名前: トークンシークレット
  19. キー: apiToken
  20. メトリクス:
  21. -名前: ウェブメトリック
  22. 成功条件: 結果 == 'true'  
  23. プロバイダー:
  24. ウェブ:
  25. # プレースホルダーはAnalysisRun作成時に解決されます
  26. url: "{{ args.api-url }}?service={{ args.service-name }}"  
  27. ヘッダー:
  28. -キー:認証 
  29. 値: "Bearer {{ args.api-token }}"  
  30. jsonPath: "{$.results.ok}"  

AnalysisRun を作成すると、ロールアウトで定義されたパラメータが、以下に示すように AnalysisTemplate のパラメータと結合されます。

  1. apiバージョン: argoproj.io/v1alpha1
  2. 種類: ロールアウト
  3. メタデータ:
  4. 名前: ゲストブック
  5. 仕様:
  6. ...
  7. 戦略:
  8. カナリア:
  9. 分析:
  10. テンプレート:
  11. - テンプレート名: args-例
  12. 引数:
  13. # 必須値
  14. -名前: サービス 
  15. 値: guestbook-svc。デフォルトは.svc.cluster です。地元 
  16. #デフォルトを上書きする
  17. -名前: API URL
  18. 値: http://other-api
  19. #安定したレプリカセットからのポッドテンプレートハッシュ
  20. -名前: 安定したハッシュ
  21. 値:
  22. podTemplateHashValue: 安定
  23. #最新のレプリカセットからのポッドテンプレートハッシュ
  24. -名前: 最新ハッシュ
  25. 値:
  26. podTemplateHashValue: 最新

さらに、分析パラメータは、メタデータを読み取ってそれを AnalysisTemplate にパラメータとして渡すために使用される valueFrom もサポートします。次の例では、メタデータ内の env タグと region タグを参照し、それらを AnalysisTemplate に渡します。

  1. apiバージョン: argoproj.io/v1alpha1
  2. 種類: ロールアウト
  3. メタデータ:
  4. 名前: ゲストブック
  5. ラベル:
  6. アプリタイプ: デモアプリ
  7. ビルドタイプ: nginx-app
  8. ...
  9. 環境: 開発
  10. 地域: us-west-2
  11. 仕様:
  12. ...
  13. 戦略:
  14. カナリア:
  15. 分析:
  16. テンプレート:
  17. - テンプレート名: args-例
  18. 引数:
  19. ...
  20. -名前: env
  21. 値:
  22. フィールド参照:
  23. フィールドパス: metadata.labels[ 'env' ]
  24. #このアプリデプロイされているリージョン
  25. -名前: 地域
  26. 値:
  27. フィールド参照:
  28. フィールドパス: metadata.labels[ 'region' ]

ブルーグリーンプレリリース分析

BlueGreen 戦略を使用したロールアウトでは、プレリリースを使用してトラフィックを新しいバージョンに切り替える前に AnalysisRun を開始できます。分析実行の成功または失敗によって、次のようにロールアウトがトラフィックを切り替えるか、ロールアウトを完全に中止するかが決まります。

  1. 種類: ロールアウト
  2. メタデータ:
  3. 名前: ゲストブック
  4. 仕様:
  5. ...
  6. 戦略:
  7. 青緑:
  8. アクティブサービス: アクティブSVC
  9. プレビューサービス: preview-svc
  10. 事前プロモーション分析:
  11. テンプレート:
  12. - テンプレート名: スモークテスト
  13. 引数:
  14. -名前: サービス 
  15. 値: preview-svc。デフォルトは.svc.cluster です。地元 

上記の例では、新しい ReplicaSet が完全に利用可能になると、Rollout はプレリリース版の AnalysisRun を作成します。ロールアウトではトラフィックを新しいバージョンに切り替えませんが、分析の実行が正常に完了するまで待機します。

注: autoPromotionSeconds フィールドが指定されていて、Rollout が自動プロモーションが成功するまでその秒数を待機した場合、Rollout は AnalysisRun を成功としてマークし、トラフィックを新しいバージョンに自動的に切り替えます。 AnalysisRun がこれより前に完了した場合、Rollout は別の AnalysisRun を作成せず、autoPromotionSeconds の残り時間を待機します。

ブルーグリーンリリース後の分析

BlueGreen 戦略を使用したロールアウトでは、トラフィックが新しいバージョンに切り替わった後のリリース後分析も使用できます。リリース後の分析が失敗またはエラーになった場合、ロールアウトは中止状態になり、トラフィックは以前の安定したレプリカセットに戻ります。リリース後の分析が成功すると、ロールアウトは完全にリリースされたとみなされ、新しいレプリカセットは安定しているとマークされ、古いレプリカセットは scaleDownDelaySeconds (デフォルトは 30 秒) に従ってスケールダウンされます。

  1. apiバージョン: argoproj.io/v1alpha1
  2. 種類: ロールアウト
  3. メタデータ:
  4. 名前: ゲストブック
  5. 仕様:
  6. ...
  7. 戦略:
  8. 青緑:
  9. アクティブサービス: アクティブSVC
  10. プレビューサービス: preview-svc
  11. scaleDownDelaySeconds: 600 # 10 分
  12. プロモーション後の分析:
  13. テンプレート:
  14. - テンプレート名: スモークテスト
  15. 引数:
  16. -名前: サービス 
  17. 値: preview-svc。デフォルトは.svc.cluster です。地元 

故障条件

failureCondition を使用すると、分析の実行が失敗するように構成できます。次の例では、Prometheus サーバーを 5 分ごとに継続的にポーリングして、エラーの合計数を取得します。 10 個以上のエラーが発生した場合、分析の実行は失敗したとみなされます。

  1. メトリクス:
  2. -名前: 合計エラー数
  3. 間隔: 5m
  4. 失敗条件: 結果[0] >= 10
  5. 失敗制限: 3
  6. プロバイダー:
  7. プロメテウス:
  8. アドレス: http://prometheus.example.com:9090
  9. クエリ: |
  10. 合計(怒って(
  11. istio_requests_total{reporter= "source" 、destination_service=~ "{{args.service-name}}" 、response_code~ "5.*" }[5m]
  12. ))

結果なしで実行

分析実行の結果は、実行が成功も失敗もしていないことを示す不確定なものと見なすこともできます。結果がない実行の場合、公開は現在のステップで一時停止されます。このとき、操作を再開したり終了したりするには、人による介入が必要です。メトリックに成功または失敗の条件が定義されていない場合、分析の実行は結論が出ない例になる可能性があります。

  1. メトリクス:
  2. -名前: my-query
  3. プロバイダー:
  4. プロメテウス:
  5. アドレス: http://prometheus.example.com:9090
  6. クエリ: ...

成功条件と失敗条件の両方が指定されているが、測定値がどちらの条件も満たさない場合にも、不確定な分析実行が発生する可能性があります。

  1. メトリクス:
  2. -名前:成功率
  3. 成功条件: 結果[0] >= 0.90
  4. 失敗条件: 結果[0] < 0.50
  5. プロバイダー:
  6. プロメテウス:
  7. アドレス: http://prometheus.example.com:9090
  8. クエリ: ...

非決定論的な分析実行のシナリオの 1 つは、Argo Rollouts が自動的に分析実行を実行し、測定値を収集できるようにしながら、測定値が許容できるかどうかの判断を下し、続行するか中止するかを決定できるようにすることです。

遅延分析実行

分析実行をすぐに開始する必要がない場合 (つまり、メトリクス プロバイダーにカナリア リリースのメトリクスを収集する時間を与えるため)、分析実行によって特定のメトリクスの分析が遅延されることがあります。各メトリックは異なる遅延を持つように構成でき、特定のメトリックの遅延に加えて、バックグラウンド分析を含むリリースでは、特定のステップに到達するまで分析実行の作成を遅らせることができます。

特定の分析インジケータを遅延するには:

  1. メトリクス:
  2. -名前:成功率
  3. #分析実行開始5分までこの分析を開始しないでください
  4. 初期遅延: 5分
  5. 成功条件: 結果[0] >= 0.90
  6. プロバイダー:
  7. プロメテウス:
  8. アドレス: http://prometheus.example.com:9090
  9. クエリ: ...

バックグラウンド分析の実行開始をステップ 3 (重みを 40% に設定) まで遅延します。

  1. apiバージョン: argoproj.io/v1alpha1
  2. 種類: ロールアウト
  3. メタデータ:
  4. 名前: ゲストブック
  5. 仕様:
  6. 戦略:
  7. カナリア:
  8. 分析:
  9. テンプレート:
  10. - テンプレート名: 成功率
  11. 開始ステップ: 2
  12. 手順:
  13. - 重みを設定: 20
  14. - 一時停止: {期間: 10 分}
  15. - 重みを設定: 40
  16. - 一時停止: {期間: 10 分}

引用シークレット

AnalysisTemplate と AnalysisRun は .spec.args 内の Secret オブジェクトを参照できます。これにより、ユーザーはログイン資格情報や API トークンなどの認証情報をメトリック プロバイダーに安全に渡すことができます。

AnalysisRun は、実行中のものと同じ名前空間内の Secrets のみを参照できることに注意してください。

以下に示す例では、AnalysisTemplate は API トークンを参照し、それを Web メトリックス プロバイダーに渡します。

  1. apiバージョン: argoproj.io/v1alpha1
  2. 種類: 分析テンプレート
  3. 仕様:
  4. 引数:
  5. -名前: APIトークン
  6. 値:
  7. シークレットキーリファレンス:
  8. 名前: トークンシークレット
  9. キー: apiToken
  10. メトリクス:
  11. -名前: ウェブメトリック
  12. プロバイダー:
  13. ウェブ:
  14. ヘッダー:
  15. -キー:認証 
  16. 値: "Bearer {{ args.api-token }}"  

【編集者のおすすめ】

  1. Pythonを使用してTaobaoメイン画像ビデオ生成ツールを簡単に作成する方法を教えます
  2. NanoIDがUUIDに取って代わる理由
  3. 暗号通貨の世界におけるハッキングの防止と軽減
  4. 最近、テンセントの35歳の従業員の給与が暴露された。生きているうちに追いつけるでしょうか?

<<:  ウエスタンデジタルは、革新的なストレージアーキテクチャの構築、分散ストレージの実現、Web 3.0の実装の加速に重点を置いています。

>>:  エッジ コンピューティングはどのような問題を解決し、どのようなモデルを使用しますか?

推薦する

buyvm 大きな変更 データセンターの利用規約の変更

buyvm は低価格 VPS の代表です。中国人は buyvm のサンノゼ データ センターの VP...

ウェブサイト最適化のヒント: ウェブサイトリンクの最適化テクニック

情報ネットワーク時代において、電子商取引の成熟度が高まり、オンラインショッピングが徐々に普及するにつ...

データストレージ環境におけるプライベートクラウドの利点

[[413074]]いつでもどこでも柔軟なストレージとコンピューティングを提供するクラウド コンピュ...

Dockerが残したギャップ:イメージ配布の現状と考察

より効率的なクラウド サービスを実現するために、コンテナ テクノロジーは登場以来、業界から幅広い支持...

PR 値、Baidu 重み、Baidu スナップショット、含まれる数量を一括クエリする方法

多くの場合、データを一括してクエリする必要がありますが、現在、そのようなクエリ機能を提供する Web...

検索エンジンのアルゴリズムはキーワードのランキングが不安定であると判断する

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています最近、Xi...

人気のない業界の企業にとって、ブランドワード、ターゲットワード、ロングテールワードだけを使うだけで十分でしょうか?

最近、企業サイトで働いている多くの友人と話をしたところ、インターネット上で非常に悪いことが起こってい...

企業が株式を公開する際の沈黙期間を説明する5つの質問

2014年以降、多数の中国のインターネット企業が米国で株式を公開した。この過程で、「沈黙期間」または...

破壊がなければ、建設はない。ファーウェイクラウドはEDGの勝利に貢献する

2021年11月6日夜、アイスランドの首都レイキャビクでスリリングな逆転劇が繰り広げられた。中国のE...

仮想プライベートクラウドの長所と短所

仮想プライベート クラウド (VPC) は少なくとも 10 年ほど前から存在していますが、使用する前...

クリエイティブ製品の期間限定販売サイトFab.comが欧州市場で巨額の利益を上げる

クリエイティブな製品のフラッシュセールサイトであるFab.comは、ヨーロッパでの1周年を記念して、...

テンセントの新しい社内テスト製品「マイクログループ」は、WeChatの隠蔽工作ツールになるかもしれない

テンセントは最近、WeChat上の特定のマーケティング活動に対する取り締まりを強化しており、Weib...

iniz-強力な大容量ハードディスク VPS-150g ハードディスク 月額支払い 4.5 ポンド

iniz は英国で正式に登録された会社です: 会社番号 08199520、登録事務所住所 45-15...

ニュースサイトの未来:地域社会の収益見通し

ニュースサイトを企業に変えるパイロットプログラムは2年間続いており、行政機関から企業へと、アイデンテ...