導入
Kubernetes標準のDeploymentによるローリングアップデートは、迅速なデプロイには適していますが、本番環境でのリスク管理という点では不十分な場合があります。新しいバージョンをリリースした途端にエラーが急増し、手動でロールバックに奔走した経験はないでしょうか?
今回紹介する「Argo Rollouts」は、まさにその課題を解決するためのツールです。成功率やエラー率といったメトリクスを監視し、段階的にトラフィックを移行させる「プログレッシブ・デリバリー」を自動化することで、人的ミスを減らし、安全なリリースサイクルを実現します。
基礎知識
Argo Rolloutsは、Kubernetesのカスタムコントローラーであり、Deploymentの代わりに「Rollout」というカスタムリソースを使用します。
主な機能である「カナリアデプロイ」とは、新しいバージョンへ徐々にトラフィックを振り分け、問題がないことを確認してから全量切り替える手法です。これを支えるのが「AnalysisTemplate」という仕組みで、Prometheusなどの監視ツールと連携し、エラー率が閾値を超えた場合に自動ロールバックを実行するトリガーとして機能します。
実装/解決策
Argo Rolloutsを導入するには、まずコントローラーをクラスタにインストールし、DeploymentをRolloutリソースに置き換えます。ポイントは「Strategy(戦略)」の定義です。ここで、どのくらいの時間をかけてトラフィックを移行するか、どのような条件でロールバックするかを記述します。
サンプルプログラム
以下は、10分間かけてトラフィックを20%ずつ段階的に移行し、その間にエラー率を監視する基本的なRollout設定例です。
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: sample-app
spec:
replicas: 3
selector:
matchLabels:
app: sample-app
template:
metadata:
labels:
app: sample-app
spec:
containers:
- name: nginx
image: nginx:1.21 # 新しいバージョンへ更新するとデプロイが開始されます
strategy:
canary:
steps:
- setWeight: 20 # 20%のトラフィックを新バージョンへ
- pause: {duration: 2m} # 2分間待機してメトリクスを確認
- setWeight: 40 # 40%へ移行
- pause: {duration: 2m}
- setWeight: 100 # 最終的に全トラフィックを移行
analysis:
templates:
- templateName: success-rate-check # 成功率監視用のテンプレートを指定
応用・注意点
現場で活用する際、最も注意すべきは「AnalysisTemplateの監視対象」です。単にCPUやメモリを見るのではなく、アプリケーションのHTTP 5xxエラー率や、ビジネス指標(注文成功数など)をターゲットに設定してください。
また、陥りやすい罠として「Serviceのセレクター管理」があります。Argo Rolloutsは自動的にServiceの向き先を制御するため、手動でServiceのセレクターをいじると、コントローラーとの競合が発生します。必ずArgo Rollouts側の設定に一任するようにしましょう。まずはステージング環境で自動ロールバックの挙動を一度テストし、失敗時の挙動をチームで把握しておくことを強く推奨します。

コメント