カナリア・ブルーグリーンと切り戻し
目標
カナリアとブルーグリーンのRolloutマニフェスト、そしてメトリクスに基づく自動ロールバックを担当するAnalysisTemplateを作成し、対応するServiceとDeploymentを実際に載せて、ロールアウトと巻き戻しを手で行います。
なぜ重要なのか
段階的デプロイの核心は、「新しいバージョンをどれだけ公開するか」と「何を見て続行を決めるか」の2つです。setWeightは前の答えで、analysisは後ろの答えです。durationのないpauseは、その判断を人に委ねる場所で、AnalysisTemplateは、同じ判断をメトリクスに任せる場所です。一方、巻き戻しそのものは、Argo Rolloutsの発明ではなく、KubernetesがReplicaSetをリビジョンとして残しているからできることです。このラボで、2つの層の両方に触れてみると、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のリソースを書いてください。- 同じファイルの
spec.strategy.canary.stepsを5つ以上にし、最初のステップはsetWeight: 20、2つ目はpause: {duration: 30s}、3つ目はsetWeight: 50、最後のステップはsetWeight: 100にしてください。 /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を埋めてください。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に指定してください。/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を一緒に書かないでください。- クラスターに、ネームスペース
capa-rolloutを作成し、その中にServicecapa-web-stableとcapa-web-canaryを実際に作成してください。どちらも、typeはClusterIP、spec.selector.appはcapa-web、ポートは80です。 - 同じネームスペースに、Deployment
capa-webを実際に作成してください。replicasは4、spec.selector.matchLabels.appはcapa-web、コンテナイメージはnginx:1.27です。 capa-webのイメージをnginx:1.28に1回変えて、新しいリビジョンを作ってから、巻き戻してください。最終状態は、イメージが再びnginx:1.27で、リビジョン番号が3以上である必要があります。
参考
kubectl set image deploy/capa-web nginx=nginx:1.28 -n capa-rolloutとkubectl rollout undo deploy/capa-web -n capa-rolloutを使います。- リビジョンは、
kubectl rollout history deploy/capa-web -n capa-rolloutで確認できます。 - よくある間違い1: 巻き戻したあとに、リビジョンが減ると期待することです。巻き戻しも、新しいリビジョンとして記録されます。
- よくある間違い2: 1つのRolloutに、canaryとblueGreenを一緒に使うことです。戦略は1つだけ選べます。
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回変えて新しいリビジョンを作ってから、巻き戻します。巻き戻したあとも、リビジョン番号は減らず、増えるという点を確認してください。