TT Lab
はじめる
学ぶ 学習パス コース

CAPA — Argoプロジェクト認定アソシエイト

カナリア・ブルーグリーンと切り戻し

TT Labで続きを見る

目標

カナリアとブルーグリーンのRolloutマニフェスト、そしてメトリクスに基づく自動ロールバックを担当するAnalysisTemplateを作成し、対応するServiceとDeploymentを実際に載せて、ロールアウトと巻き戻しを手で行います。

なぜ重要なのか

段階的デプロイの核心は、「新しいバージョンをどれだけ公開するか」と「何を見て続行を決めるか」の2つです。setWeightは前の答えで、analysisは後ろの答えです。durationのないpauseは、その判断を人に委ねる場所で、AnalysisTemplateは、同じ判断をメトリクスに任せる場所です。一方、巻き戻しそのものは、Argo Rolloutsの発明ではなく、KubernetesがReplicaSetをリビジョンとして残しているからできることです。このラボで、2つの層の両方に触れてみると、Rolloutがどこまで新しいものなのかの区別がつきます。

ステップ

  1. /root/capa-rollout/ディレクトリを作成し、rollout.yamlに、apiVersionがargoproj.io/v1alpha1、kindがRollout、metadata.nameがcapa-web、metadata.namespaceがcapa-rollout、spec.replicasが4、spec.selector.matchLabels.appがcapa-web、コンテナイメージがnginx:1.27のリソースを書いてください。
  2. 同じファイルのspec.strategy.canary.stepsを5つ以上にし、最初のステップはsetWeight: 20、2つ目はpause: {duration: 30s}、3つ目はsetWeight: 50、最後のステップはsetWeight: 100にしてください。
  3. /root/capa-rollout/analysistemplate.yamlに、kindがAnalysisTemplate、metadata.nameがcapa-success-rateのリソースを書き、spec.metrics[0]に、nameがsuccess-rate、intervalが30s、failureLimitが3、0.95以上を要求するsuccessCondition、そしてprovider.prometheus.addressを埋めてください。
  4. rollout.yamlのカナリアのステップのうち1つを、analysisステップにして、templates[0].templateNameがcapa-success-rateを指すようにし、spec.strategy.canary.canaryServiceをcapa-web-canary、stableServiceをcapa-web-stable、trafficRouting.nginx.stableIngressをcapa-web-stableに指定してください。
  5. /root/capa-rollout/rollout-bluegreen.yamlに、kindがRollout、metadata.nameがcapa-apiのリソースを書き、spec.strategy.blueGreenの下に、activeServiceとしてcapa-api-active、previewServiceとしてcapa-api-preview、autoPromotionEnabledとしてfalse、scaleDownDelaySecondsとして60を入れてください。このファイルには、canaryを一緒に書かないでください。
  6. クラスターに、ネームスペースcapa-rolloutを作成し、その中にServicecapa-web-stableとcapa-web-canaryを実際に作成してください。どちらも、typeはClusterIP、spec.selector.appはcapa-web、ポートは80です。
  7. 同じネームスペースに、Deploymentcapa-webを実際に作成してください。replicasは4、spec.selector.matchLabels.appはcapa-web、コンテナイメージはnginx:1.27です。
  8. capa-webのイメージをnginx:1.28に1回変えて、新しいリビジョンを作ってから、巻き戻してください。最終状態は、イメージが再びnginx:1.27で、リビジョン番号が3以上である必要があります。

参考

Rolloutの骨格

/root/capa-rollout/ディレクトリを作成し、rollout.yamlに、apiVersionがargoproj.io/v1alpha1、kindがRollout、metadata.nameがcapa-web、metadata.namespaceがcapa-rollout、spec.replicasが4、spec.selector.matchLabels.appがcapa-web、コンテナイメージがnginx:1.27のリソースを書いてください。

Rolloutのspecは、replicas・selector・templateまで、Deploymentとほぼ同じです。違うのは、strategyの下に入る内容です。

ウェイトと一時停止のステップ

同じファイルのspec.strategy.canary.stepsを5つ以上にし、最初のステップはsetWeight: 20、2つ目はpause: {duration: 30s}、3つ目はsetWeight: 50、最後のステップはsetWeight: 100にしてください。

stepsは配列で、各要素は、setWeightまたはpauseのようなキーを1つ持ちます。pauseにdurationを指定すれば時間による待機、指定しなければ、人が昇格するまで無期限の待機です。

AnalysisTemplateを書く

/root/capa-rollout/analysistemplate.yamlに、kindがAnalysisTemplate、metadata.nameがcapa-success-rateのリソースを書き、spec.metrics[0]に、nameがsuccess-rate、intervalが30s、failureLimitが3、0.95以上を要求するsuccessCondition、そしてprovider.prometheus.addressを埋めてください。

metricsの項目には、どのくらいの間隔で計測するか、何を成功と見なすか、何回まで失敗を許容するか、どこから取得するかが、すべて必要です。4つのうち1つでも欠けると、判断が成り立ちません。

分析ステップとトラフィックルーティングの接続

rollout.yamlのカナリアのステップのうち1つを、analysisステップにして、templates[0].templateNameがcapa-success-rateを指すようにし、spec.strategy.canary.canaryServiceをcapa-web-canary、stableServiceをcapa-web-stable、trafficRouting.nginx.stableIngressをcapa-web-stableに指定してください。

analysisステップは、templates配列でAnalysisTemplateの名前を参照します。トラフィックの比率を実際に分けるには、カナリア用と安定版用のService名を、コントローラーに教える必要があります。

ブルーグリーン戦略

/root/capa-rollout/rollout-bluegreen.yamlに、kindがRollout、metadata.nameがcapa-apiのリソースを書き、spec.strategy.blueGreenの下に、activeServiceとしてcapa-api-active、previewServiceとしてcapa-api-preview、autoPromotionEnabledとしてfalse、scaleDownDelaySecondsとして60を入れてください。このファイルには、canaryを一緒に書かないでください。

ブルーグリーンは、新しいバージョンを全量起動しておき、previewだけでアクセスしていて、activeを差し替えます。自動昇格をオフにするフィールドと、古いバージョンをどれだけ生かしておくかを決めるフィールドが、それぞれあります。

安定版・カナリアのServiceを2つ作る

クラスターに、ネームスペースcapa-rolloutを作成し、その中にServicecapa-web-stableとcapa-web-canaryを実際に作成してください。どちらも、typeはClusterIP、spec.selector.appはcapa-web、ポートは80です。

ここからは、実際のクラスターです。2つのServiceのセレクターは、同じでもかまいません。コントローラーがあとでセレクターを操作して、トラフィックを分けます。

対応するDeploymentを載せる

同じネームスペースに、Deploymentcapa-webを実際に作成してください。replicasは4、spec.selector.matchLabels.appはcapa-web、コンテナイメージはnginx:1.27です。

Serviceのセレクターと同じラベルを、Podテンプレートに付けてはじめて、エンドポイントが捕捉されます。レプリカ数は、Rolloutのファイルと合わせてください。

載せてから巻き戻す

capa-webのイメージをnginx:1.28に1回変えて、新しいリビジョンを作ってから、巻き戻してください。最終状態は、イメージが再びnginx:1.27で、リビジョン番号が3以上である必要があります。

イメージを1回変えて新しいリビジョンを作ってから、巻き戻します。巻き戻したあとも、リビジョン番号は減らず、増えるという点を確認してください。