[[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 リソース オブジェクトは次のとおりです。 - apiバージョン: argoproj.io/v1alpha1
- 種類: ロールアウト
- メタデータ:
- 名前: ゲストブック
- 仕様:
- ...
- 戦略:
- カナリア:
- 分析:
- テンプレート:
- - テンプレート名: 成功率
- 開始ステップ: 2 # 分析の開始をステップ3まで遅らせる
- 引数:
- -名前: サービス名
- 値: guestbook-svc。デフォルトは.svc.cluster です。地元
- 手順:
- - 重みを設定: 20
- - 一時停止: {期間: 10 分}
- - 重みを設定: 40
- - 一時停止: {期間: 10 分}
- - 重みを設定: 60
- - 一時停止: {期間: 10 分}
- - 重みの設定: 80
- - 一時停止: {期間: 10 分}
上記では成功率テンプレートを引用しました。 - apiバージョン: argoproj.io/v1alpha1
- 種類: 分析テンプレート
- メタデータ:
- 名前: 成功率
- 仕様:
- 引数:
- -名前: サービス名
- メトリクス:
- -名前:成功率
- 間隔: 5m
- # 注意: Prometheus クエリは結果をベクトル形式で返します。
- # そのため、返された配列のインデックス0にアクセスして値を取得するのが一般的です
- 成功条件: 結果[0] >= 0.95
- 失敗制限: 3
- プロバイダー:
- プロメテウス:
- アドレス: http://prometheus.example.com:9090
- クエリ: |
- 合計(怒って(
- istio_requests_total{reporter= "source" 、destination_service=~ "{{args.service-name}}" 、response_code!~ "5.*" }[5m]
- )) /
- 合計(怒って(
- istio_requests_total{reporter= "source" 、destination_service=~ "{{args.service-name}}" }[5m]
- ))
インライン分析分析は、インラインの「分析」ステップとして実行することもできます。分析が「インライン」で実行される場合、そのステップに到達すると AnalysisRun が開始され、実行が完了するまで先に進むことがブロックされます。分析実行の成功または失敗によって、デプロイメントが次のステップに進むか、デプロイメントが完全に中止されるかが決まります。 以下に示す例では、カナリアの重みを 20% に設定し、5 分間一時停止してから分析を実行します。分析が成功した場合は公開が続行され、失敗した場合は中止されます。 - apiバージョン: argoproj.io/v1alpha1
- 種類: ロールアウト
- メタデータ:
- 名前: ゲストブック
- 仕様:
- ...
- 戦略:
- カナリア:
- 手順:
- - 重みを設定: 20
- - 一時停止: {期間: 5 分}
- - 分析:
- テンプレート:
- - テンプレート名: 成功率
- 引数:
- -名前: サービス名
- 値: guestbook-svc。デフォルトは.svc.cluster です。地元
上記のオブジェクトでは、分析をロールアウト ステップのステップとしてインライン化します。トラフィックの 20% が 5 分間停止すると、成功率分析テンプレートが実行されます。 ここでの AnalysisTemplate は上記のバックグラウンド分析の例と同じですが、間隔が指定されていないため、分析は 1 回実行されて完了します。 - apiバージョン: argoproj.io/v1alpha1
- 種類: 分析テンプレート
- メタデータ:
- 名前: 成功率
- 仕様:
- 引数:
- -名前: サービス名
- -名前: プロメテウスポート
- 値: 9090
- メトリクス:
- -名前:成功率
- 成功条件: 結果[0] >= 0.95
- プロバイダー:
- プロメテウス:
- アドレス: "http://prometheus.example.com:{{args.prometheus-port}}"
- クエリ: |
- 合計(怒って(
- istio_requests_total{reporter= "source" 、destination_service=~ "{{args.service-name}}" 、response_code!~ "5.*" }[5m]
- )) /
- 合計(怒って(
- istio_requests_total{reporter= "source" 、destination_service=~ "{{args.service-name}}" }[5m]
- ))
さらに、カウント フィールドと間隔フィールドを指定することで、より長い期間にわたって複数の測定を実行することもできます。 - メトリクス:
- -名前:成功率
- 成功条件: 結果[0] >= 0.95
- 間隔: 60秒
- カウント: 5
- プロバイダー:
- プロメテウス:
- アドレス: http://prometheus.example.com:9090
- クエリ: ...
複数のテンプレートの分析Rollout は、AnalysisRun を構築するときに複数の AnalysisTemplates を参照できます。この方法では、複数の AnalysisTemplates から分析を作成できます。複数のテンプレートが参照されている場合、コントローラーはそれらを結合します。コントローラーは、すべてのテンプレートの metrics フィールドと args フィールドを結合します。以下のように表示されます。 - apiバージョン: argoproj.io/v1alpha1
- 種類: ロールアウト
- メタデータ:
- 名前: ゲストブック
- 仕様:
- ...
- 戦略:
- カナリア:
- 分析:
- テンプレート:
- - テンプレート名: 成功率
- - テンプレート名: エラー率
- 引数:
- -名前: サービス名
- 値: guestbook-svc。デフォルトは.svc.cluster です。地元
-
-
-
- apiバージョン: argoproj.io/v1alpha1
- 種類: 分析テンプレート
- メタデータ:
- 名前: 成功率
- 仕様:
- 引数:
- -名前: サービス名
- メトリクス:
- -名前:成功率
- 間隔: 5m
- 成功条件: 結果[0] >= 0.95
- 失敗制限: 3
- プロバイダー:
- プロメテウス:
- アドレス: http://prometheus.example.com:9090
- クエリ: |
- 合計(怒って(
- istio_requests_total{reporter= "source" 、destination_service=~ "{{args.service-name}}" 、response_code!~ "5.*" }[5m]
- )) /
- 合計(怒って(
- istio_requests_total{reporter= "source" 、destination_service=~ "{{args.service-name}}" }[5m]
- ))
-
- apiバージョン: argoproj.io/v1alpha1
- 種類: 分析テンプレート
- メタデータ:
- 名前: エラー率
- 仕様:
- 引数:
- -名前: サービス名
- メトリクス:
- -名前: エラー率
- 間隔: 5m
- 成功条件: 結果[0] <= 0.95
- 失敗制限: 3
- プロバイダー:
- プロメテウス:
- アドレス: http://prometheus.example.com:9090
- クエリ: |
- 合計(怒って(
- istio_requests_total{reporter= "source" 、destination_service=~ "{{args.service-name}}" 、response_code=~ "5.*" }[5m]
- )) /
- 合計(怒って(
- istio_requests_total{reporter= "source" 、destination_service=~ "{{args.service-name}}" }[5m]
- ))
分析を実行すると、コントローラーは上記の成功率テンプレートとエラー率テンプレートを AnalysisRun オブジェクトにマージします。 以下の状況が発生した場合、コントローラーはテンプレートのマージに失敗することに注意してください。 - テンプレート内の複数のメトリックが同じ名前を持つ
- 同じ名前の2つのパラメータに値がある
テンプレートパラメータの解析AnalysisTemplates は、ロールアウトによって渡すことができる一連のパラメータを宣言できます。これらのパラメータは、メトリック構成と同様に使用でき、AnalysisRun の作成時にインスタンス化され、パラメータ プレースホルダは {{ args. }} のように表示されます。 - apiバージョン: argoproj.io/v1alpha1
- 種類: 分析テンプレート
- メタデータ:
- 名前: 引数例
- 仕様:
- 引数:
- # 必須
- -名前: サービス名
- -名前: 安定したハッシュ
- -名前: 最新ハッシュ
- # オプション
- -名前: API URL
- 値: http://example/measure
- #秘密から
- -名前: APIトークン
- 値:
- シークレットキーリファレンス:
- 名前: トークンシークレット
- キー: apiToken
- メトリクス:
- -名前: ウェブメトリック
- 成功条件: 結果 == 'true'
- プロバイダー:
- ウェブ:
- # プレースホルダーはAnalysisRunの作成時に解決されます
- url: "{{ args.api-url }}?service={{ args.service-name }}"
- ヘッダー:
- -キー:認証
- 値: "Bearer {{ args.api-token }}"
- jsonPath: "{$.results.ok}"
AnalysisRun を作成すると、ロールアウトで定義されたパラメータが、以下に示すように AnalysisTemplate のパラメータと結合されます。 - apiバージョン: argoproj.io/v1alpha1
- 種類: ロールアウト
- メタデータ:
- 名前: ゲストブック
- 仕様:
- ...
- 戦略:
- カナリア:
- 分析:
- テンプレート:
- - テンプレート名: args-例
- 引数:
- # 必須値
- -名前: サービス名
- 値: guestbook-svc。デフォルトは.svc.cluster です。地元
- #デフォルト値を上書きする
- -名前: API URL
- 値: http://other-api
- #安定したレプリカセットからのポッドテンプレートハッシュ
- -名前: 安定したハッシュ
- 値:
- podTemplateHashValue: 安定
- #最新のレプリカセットからのポッドテンプレートハッシュ
- -名前: 最新ハッシュ
- 値:
- podTemplateHashValue: 最新
さらに、分析パラメータは、メタデータを読み取ってそれを AnalysisTemplate にパラメータとして渡すために使用される valueFrom もサポートします。次の例では、メタデータ内の env タグと region タグを参照し、それらを AnalysisTemplate に渡します。 - apiバージョン: argoproj.io/v1alpha1
- 種類: ロールアウト
- メタデータ:
- 名前: ゲストブック
- ラベル:
- アプリタイプ: デモアプリ
- ビルドタイプ: nginx-app
- ...
- 環境: 開発
- 地域: us-west-2
- 仕様:
- ...
- 戦略:
- カナリア:
- 分析:
- テンプレート:
- - テンプレート名: args-例
- 引数:
- ...
- -名前: env
- 値:
- フィールド参照:
- フィールドパス: metadata.labels[ 'env' ]
- #このアプリがデプロイされているリージョン
- -名前: 地域
- 値:
- フィールド参照:
- フィールドパス: metadata.labels[ 'region' ]
ブルーグリーンプレリリース分析BlueGreen 戦略を使用したロールアウトでは、プレリリースを使用してトラフィックを新しいバージョンに切り替える前に AnalysisRun を開始できます。分析実行の成功または失敗によって、次のようにロールアウトがトラフィックを切り替えるか、ロールアウトを完全に中止するかが決まります。 - 種類: ロールアウト
- メタデータ:
- 名前: ゲストブック
- 仕様:
- ...
- 戦略:
- 青緑:
- アクティブサービス: アクティブSVC
- プレビューサービス: preview-svc
- 事前プロモーション分析:
- テンプレート:
- - テンプレート名: スモークテスト
- 引数:
- -名前: サービス名
- 値: preview-svc。デフォルトは.svc.cluster です。地元
上記の例では、新しい ReplicaSet が完全に利用可能になると、Rollout はプレリリース版の AnalysisRun を作成します。ロールアウトではトラフィックを新しいバージョンに切り替えませんが、分析の実行が正常に完了するまで待機します。 注: autoPromotionSeconds フィールドが指定されていて、Rollout が自動プロモーションが成功するまでその秒数を待機した場合、Rollout は AnalysisRun を成功としてマークし、トラフィックを新しいバージョンに自動的に切り替えます。 AnalysisRun がこれより前に完了した場合、Rollout は別の AnalysisRun を作成せず、autoPromotionSeconds の残り時間を待機します。 ブルーグリーンリリース後の分析BlueGreen 戦略を使用したロールアウトでは、トラフィックが新しいバージョンに切り替わった後のリリース後分析も使用できます。リリース後の分析が失敗またはエラーになった場合、ロールアウトは中止状態になり、トラフィックは以前の安定したレプリカセットに戻ります。リリース後の分析が成功すると、ロールアウトは完全にリリースされたとみなされ、新しいレプリカセットは安定しているとマークされ、古いレプリカセットは scaleDownDelaySeconds (デフォルトは 30 秒) に従ってスケールダウンされます。 - apiバージョン: argoproj.io/v1alpha1
- 種類: ロールアウト
- メタデータ:
- 名前: ゲストブック
- 仕様:
- ...
- 戦略:
- 青緑:
- アクティブサービス: アクティブSVC
- プレビューサービス: preview-svc
- scaleDownDelaySeconds: 600 # 10 分
- プロモーション後の分析:
- テンプレート:
- - テンプレート名: スモークテスト
- 引数:
- -名前: サービス名
- 値: preview-svc。デフォルトは.svc.cluster です。地元
故障条件failureCondition を使用すると、分析の実行が失敗するように構成できます。次の例では、Prometheus サーバーを 5 分ごとに継続的にポーリングして、エラーの合計数を取得します。 10 個以上のエラーが発生した場合、分析の実行は失敗したとみなされます。 - メトリクス:
- -名前: 合計エラー数
- 間隔: 5m
- 失敗条件: 結果[0] >= 10
- 失敗制限: 3
- プロバイダー:
- プロメテウス:
- アドレス: http://prometheus.example.com:9090
- クエリ: |
- 合計(怒って(
- istio_requests_total{reporter= "source" 、destination_service=~ "{{args.service-name}}" 、response_code~ "5.*" }[5m]
- ))
結果なしで実行分析実行の結果は、実行が成功も失敗もしていないことを示す不確定なものと見なすこともできます。結果がない実行の場合、公開は現在のステップで一時停止されます。このとき、操作を再開したり終了したりするには、人による介入が必要です。メトリックに成功または失敗の条件が定義されていない場合、分析の実行は結論が出ない例になる可能性があります。 - メトリクス:
- -名前: my-query
- プロバイダー:
- プロメテウス:
- アドレス: http://prometheus.example.com:9090
- クエリ: ...
成功条件と失敗条件の両方が指定されているが、測定値がどちらの条件も満たさない場合にも、不確定な分析実行が発生する可能性があります。 - メトリクス:
- -名前:成功率
- 成功条件: 結果[0] >= 0.90
- 失敗条件: 結果[0] < 0.50
- プロバイダー:
- プロメテウス:
- アドレス: http://prometheus.example.com:9090
- クエリ: ...
非決定論的な分析実行のシナリオの 1 つは、Argo Rollouts が自動的に分析実行を実行し、測定値を収集できるようにしながら、測定値が許容できるかどうかの判断を下し、続行するか中止するかを決定できるようにすることです。 遅延分析実行分析実行をすぐに開始する必要がない場合 (つまり、メトリクス プロバイダーにカナリア リリースのメトリクスを収集する時間を与えるため)、分析実行によって特定のメトリクスの分析が遅延されることがあります。各メトリックは異なる遅延を持つように構成でき、特定のメトリックの遅延に加えて、バックグラウンド分析を含むリリースでは、特定のステップに到達するまで分析実行の作成を遅らせることができます。 特定の分析インジケータを遅延するには: - メトリクス:
- -名前:成功率
- #分析実行開始後5分までこの分析を開始しないでください
- 初期遅延: 5分
- 成功条件: 結果[0] >= 0.90
- プロバイダー:
- プロメテウス:
- アドレス: http://prometheus.example.com:9090
- クエリ: ...
バックグラウンド分析の実行開始をステップ 3 (重みを 40% に設定) まで遅延します。 - apiバージョン: argoproj.io/v1alpha1
- 種類: ロールアウト
- メタデータ:
- 名前: ゲストブック
- 仕様:
- 戦略:
- カナリア:
- 分析:
- テンプレート:
- - テンプレート名: 成功率
- 開始ステップ: 2
- 手順:
- - 重みを設定: 20
- - 一時停止: {期間: 10 分}
- - 重みを設定: 40
- - 一時停止: {期間: 10 分}
引用シークレットAnalysisTemplate と AnalysisRun は .spec.args 内の Secret オブジェクトを参照できます。これにより、ユーザーはログイン資格情報や API トークンなどの認証情報をメトリック プロバイダーに安全に渡すことができます。 AnalysisRun は、実行中のものと同じ名前空間内の Secrets のみを参照できることに注意してください。 以下に示す例では、AnalysisTemplate は API トークンを参照し、それを Web メトリックス プロバイダーに渡します。 - apiバージョン: argoproj.io/v1alpha1
- 種類: 分析テンプレート
- 仕様:
- 引数:
- -名前: APIトークン
- 値:
- シークレットキーリファレンス:
- 名前: トークンシークレット
- キー: apiToken
- メトリクス:
- -名前: ウェブメトリック
- プロバイダー:
- ウェブ:
- ヘッダー:
- -キー:認証
- 値: "Bearer {{ args.api-token }}"
【編集者のおすすめ】 - Pythonを使用してTaobaoメイン画像ビデオ生成ツールを簡単に作成する方法を教えます
- NanoIDがUUIDに取って代わる理由
- 暗号通貨の世界におけるハッキングの防止と軽減
- 最近、テンセントの35歳の従業員の給与が暴露された。生きているうちに追いつけるでしょうか?
|