Skip to content
Published on

ArgoCD GitOps本番運用ガイド:プログレッシブデリバリー、カナリアデプロイメント、自動ロールバック戦略

Authors
  • Name
    Twitter
ArgoCD GitOps

はじめに

GitOpsは、Kubernetesにおける継続的デリバリーのデファクトスタンダードとなった。その核心は、Gitを宣言的なインフラストラクチャおよびアプリケーション定義の単一の情報源(Single Source of Truth)として扱うことにある。ArgoCDはIntuitによって開発され、現在はCNCFの卒業プロジェクトとして、約60%の市場シェアと導入者のNPS 79を誇る圧倒的なGitOpsツールとなっている。Intuit自体もArgoCDを約400のクラスタにわたって運用し、数千のアプリケーションを本番環境で管理している。

しかし、ArgoCDを導入するだけでは安全なデプロイメントが自動的に保証されるわけではない。本番環境では、新バージョンを段階的にトラフィックに公開するプログレッシブデリバリー戦略、すべてのユーザーに影響が及ぶ前に障害を検知する自動ロールバック機構、そして問題が発生した際の十分にテストされたリカバリ手順が必要となる。本ガイドでは、ArgoCDのアーキテクチャと同期ポリシーから、Argo Rolloutsとの統合によるカナリアおよびブルーグリーンデプロイメント、自動分析、ロールバック戦略、そして実運用でのトラブルシューティングまで、完全なライフサイクルをカバーする。

ArgoCDアーキテクチャ概要

プログレッシブデリバリーに入る前に、ArgoCDが内部的にどのように動作するかを理解することが不可欠である。

┌─────────────────────────────────────────────────────────────────┐
ArgoCD Server│  ┌───────────┐  ┌──────────────┐  ┌───────────────────────┐    │
│  │  API       │  │  Web UI      │  │  Dex / OIDC           │    │
│  │  Server    │  │  Dashboard   │  │  Authentication       │    │
│  └─────┬─────┘  └──────┬───────┘  └───────────────────────┘    │
│        │               │                                        │
│  ┌─────▼───────────────▼─────────────────────────────────────┐  │
│  │              Application Controller                        │  │
│  │  - Application CRDを監視                                   │  │
│  │  - 期待状態 (Git) と実際の状態 (クラスタ) を比較            │  │
│  │  - 同期操作を実行                                          │  │
│  └─────────────────────┬─────────────────────────────────────┘  │
│                        │                                        │
│  ┌─────────────────────▼─────────────────────────────────────┐  │
│  │              Repo Server                                   │  │
│  │  - Gitリポジトリをクローン                                  │  │
│  │  - Helm / Kustomize / Jsonnet テンプレートをレンダリング    │  │
│  │  - パフォーマンスのためマニフェストをキャッシュ             │  │
│  └───────────────────────────────────────────────────────────┘  │
│                                                                 │
│  ┌───────────────────────────────────────────────────────────┐  │
│  │              Redis Cache                                   │  │
│  │  - アプリケーション状態キャッシュ                           │  │
│  │  - Gitリポジトリキャッシュ                                  │  │
│  └───────────────────────────────────────────────────────────┘  │
└─────────────────────────────────────────────────────────────────┘
         │                              │
         ▼                              ▼
┌─────────────────┐          ┌──────────────────┐
Git Repository  │          │  Kubernetes  (情報源)        │          │  Cluster(s)│                  │            (デプロイ先)└─────────────────┘          └──────────────────┘

主要コンポーネント:

  • API Server はCLIおよびWeb UIが使用するgRPC/REST APIを公開する
  • Application Controller はGitの状態とライブクラスタの状態を継続的に比較するコアのReconciliationエンジンである
  • Repo Server はGit操作とマニフェストレンダリング(Helm、Kustomize、Jsonnet、プレーンYAML)を処理する
  • Redis はアプリケーション状態とリポジトリデータのキャッシュを提供する

ArgoCDアプリケーション設定

基本的なArgoCDアプリケーションマニフェストは、ソースリポジトリとターゲットクラスタを定義する。

# argocd-application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app-production
  namespace: argocd
  finalizers:
    - resources-finalizer.argocd.argoproj.io
spec:
  project: production
  source:
    repoURL: https://github.com/myorg/k8s-manifests.git
    targetRevision: main
    path: apps/my-app/overlays/production
  destination:
    server: https://kubernetes.default.svc
    namespace: my-app-prod
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
      allowEmpty: false
    syncOptions:
      - CreateNamespace=true
      - PrunePropagationPolicy=foreground
      - PruneLast=true
    retry:
      limit: 5
      backoff:
        duration: 5s
        factor: 2
        maxDuration: 3m
  ignoreDifferences:
    - group: apps
      kind: Deployment
      jsonPointers:
        - /spec/replicas

重要な同期ポリシーオプションの解説:

オプション説明本番推奨設定
automated.pruneGitから削除されたリソースを削除慎重に有効化
automated.selfHealクラスタへの手動変更を元に戻す強く推奨
allowEmptyリソースゼロでの同期を許可常にfalseに設定
PruneLast他の同期完了後に削除を実行安全のため有効化
retry.backoff失敗時の指数バックオフ5秒基準、ファクター2

警告: PruneLast=trueなしでautomated.pruneを有効にすると、リポジトリ構造の変更時にカスケード削除が発生する可能性がある。必ずステージング環境で同期ポリシーを先にテストすること。

GitOpsツール比較:ArgoCD vs FluxCD vs Jenkins X

ツールを決定する前に、各ツールのトレードオフを理解しておくべきである。

機能ArgoCDFluxCDJenkins X
市場シェア (2026年)約60%約30%5%未満
CNCFステータスGraduatedGraduatedSandbox(アーカイブ済み)
Web UI組み込み、高機能サードパーティ(Weave GitOps)基本的
マルチクラスタネイティブサポートKustomization経由限定的
Helmサポートネイティブネイティブネイティブ
プログレッシブデリバリーArgo Rollouts経由Flagger経由組み込み(Tekton)
SSO/RBAC組み込み(Dex, OIDC)Kubernetes RBACKubernetes RBAC
リソース使用量中程度(約512MB)低い(約128MB)高い(約2GB)
学習曲線中程度中程度急勾配
マニフェストレンダリングHelm, Kustomize, JsonnetHelm, KustomizeHelm
通知システムArgo NotificationsFlux Notification ControllerWebhooks
ApplicationSetsあり(ジェネレータ)あり(Kustomization)なし
差分プレビューUIおよびCLICLIのみCLIのみ

ArgoCDを選ぶべき場合: リッチなWeb UI、シングルペインオブグラスでのマルチクラスタ可視化、組み込みSSO が必要な場合、またはチームにKubernetes経験レベルが異なるメンバーがいる場合。

FluxCDを選ぶべき場合: 軽量でKubernetesネイティブなアプローチを好む場合、主にCLI/自動化で運用する場合、500以上のアプリケーションを管理する場合、またはリソースオーバーヘッドを最小限に抑えたい場合。

Jenkins Xを選ぶべき場合: Tektonパイプラインと緊密に統合されたCI/CDが必要な場合(注:採用率は低下しており、コミュニティの勢いは限定的)。

Argo Rolloutsによるプログレッシブデリバリー

Argo Rolloutsは、カナリア、ブルーグリーン、実験機能を含む高度なデプロイメント戦略を提供するKubernetesコントローラである。標準的なKubernetes DeploymentをRollout CRDで置き換える。

カナリアデプロイメント戦略

カナリアデプロイメントは、主要なメトリクスを監視しながら、新バージョンへのトラフィックを段階的にシフトする。

# canary-rollout.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: my-app
  namespace: my-app-prod
spec:
  replicas: 10
  revisionHistoryLimit: 5
  selector:
    matchLabels:
      app: my-app
  strategy:
    canary:
      canaryService: my-app-canary
      stableService: my-app-stable
      trafficRouting:
        istio:
          virtualServices:
            - name: my-app-vsvc
              routes:
                - primary
      steps:
        - setWeight: 5
        - pause: { duration: 5m }
        - analysis:
            templates:
              - templateName: error-rate-check
            args:
              - name: service-name
                value: my-app-canary
        - setWeight: 20
        - pause: { duration: 5m }
        - analysis:
            templates:
              - templateName: latency-check
            args:
              - name: service-name
                value: my-app-canary
        - setWeight: 50
        - pause: { duration: 10m }
        - analysis:
            templates:
              - templateName: comprehensive-check
            args:
              - name: service-name
                value: my-app-canary
        - setWeight: 80
        - pause: { duration: 10m }
        - setWeight: 100
      rollbackWindow:
        revisions: 3
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: myregistry/my-app:v2.1.0
          ports:
            - containerPort: 8080
          resources:
            requests:
              cpu: 200m
              memory: 256Mi
            limits:
              cpu: 500m
              memory: 512Mi
          readinessProbe:
            httpGet:
              path: /healthz
              port: 8080
            initialDelaySeconds: 10
            periodSeconds: 5
          livenessProbe:
            httpGet:
              path: /healthz
              port: 8080
            initialDelaySeconds: 15
            periodSeconds: 10

このロールアウトは慎重に段階化されたアプローチに従う:

  1. トラフィックの5%をカナリアに送り、5分待機
  2. エラー率分析を実行
  3. 20%に増加、5分待機
  4. レイテンシ分析を実行
  5. 50%に増加、10分待機
  6. 包括的チェックを実行(エラー率+レイテンシ+ビジネスメトリクス)
  7. 80%に増加、10分待機
  8. 100%にプロモート

いずれかの分析ステップが失敗した場合、ロールアウトは自動的に中止され、トラフィックは安定バージョンに戻る。

自動メトリクスチェック用のAnalysisTemplate

AnalysisTemplateは、評価するメトリクスとロールバックをトリガーする閾値を定義する。

# analysis-templates.yaml
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
  name: error-rate-check
spec:
  args:
    - name: service-name
  metrics:
    - name: error-rate
      interval: 60s
      count: 5
      successCondition: result[0] < 0.05
      failureLimit: 3
      provider:
        prometheus:
          address: http://prometheus.monitoring:9090
          query: |
            sum(rate(http_requests_total{
              service="{{args.service-name}}",
              status=~"5.."
            }[5m]))
            /
            sum(rate(http_requests_total{
              service="{{args.service-name}}"
            }[5m]))
---
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
  name: latency-check
spec:
  args:
    - name: service-name
  metrics:
    - name: p99-latency
      interval: 60s
      count: 5
      successCondition: result[0] < 500
      failureLimit: 3
      provider:
        prometheus:
          address: http://prometheus.monitoring:9090
          query: |
            histogram_quantile(0.99,
              sum(rate(http_request_duration_seconds_bucket{
                service="{{args.service-name}}"
              }[5m])) by (le)
            ) * 1000
---
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
  name: comprehensive-check
spec:
  args:
    - name: service-name
  metrics:
    - name: error-rate
      interval: 60s
      count: 10
      successCondition: result[0] < 0.02
      failureLimit: 2
      provider:
        prometheus:
          address: http://prometheus.monitoring:9090
          query: |
            sum(rate(http_requests_total{
              service="{{args.service-name}}",
              status=~"5.."
            }[5m]))
            /
            sum(rate(http_requests_total{
              service="{{args.service-name}}"
            }[5m]))
    - name: p99-latency
      interval: 60s
      count: 10
      successCondition: result[0] < 300
      failureLimit: 2
      provider:
        prometheus:
          address: http://prometheus.monitoring:9090
          query: |
            histogram_quantile(0.99,
              sum(rate(http_request_duration_seconds_bucket{
                service="{{args.service-name}}"
              }[5m])) by (le)
            ) * 1000

警告: Prometheusインスタンスに十分な保持期間とクエリパフォーマンスがあることを確認すること。Prometheusクエリが遅いとAnalysisRunがタイムアウトし、Argo Rolloutsはそれを失敗として扱い、意図しないロールバックがトリガーされる。

ブルーグリーンデプロイメント戦略

ブルーグリーンデプロイメントは、2つの完全な環境を維持し、トラフィックをアトミックに切り替える。

# blue-green-rollout.yaml
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
  name: my-app-bluegreen
  namespace: my-app-prod
spec:
  replicas: 5
  revisionHistoryLimit: 3
  selector:
    matchLabels:
      app: my-app
  strategy:
    blueGreen:
      activeService: my-app-active
      previewService: my-app-preview
      autoPromotionEnabled: false
      autoPromotionSeconds: 300
      scaleDownDelaySeconds: 600
      scaleDownDelayRevisionLimit: 2
      prePromotionAnalysis:
        templates:
          - templateName: comprehensive-check
        args:
          - name: service-name
            value: my-app-preview
      postPromotionAnalysis:
        templates:
          - templateName: error-rate-check
        args:
          - name: service-name
            value: my-app-active
      antiAffinity:
        preferredDuringSchedulingIgnoredDuringExecution:
          weight: 100
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
        - name: my-app
          image: myregistry/my-app:v2.1.0
          ports:
            - containerPort: 8080

ブルーグリーンのフロー:

┌─────────────────────────────────────────────────────────────┐
│               ブルーグリーンデプロイメントフロー              │
│                                                             │
│  ステップ1: プレビュー(グリーン)をデプロイ                 │
│  ┌──────────┐     ┌──────────┐                              │
│  │  Active100%Stable   │                              │
│  │  Service  │────▶│ (Blue)   │                              │
│  └──────────┘     └──────────┘                              │
│  ┌──────────┐     ┌──────────┐                              │
│  │  Preview0%New      │                              │
│  │  Service  │────▶│ (Green)  │  プロモーション前分析        │
│  └──────────┘     └──────────┘                              │
│                                                             │
│  ステップ2: プロモート(トラフィック切り替え)                │
│  ┌──────────┐     ┌──────────┐                              │
│  │  Active100%New      │                              │
│  │  Service  │────▶│ (Green)  │  プロモーション後分析        │
│  └──────────┘     └──────────┘                              │
│  ┌──────────┐     ┌──────────┐                              │
│  │  Preview  │     │ Old      │  遅延後にスケールダウン      │
│  │  Service (Blue)   │                              │
│  └──────────┘     └──────────┘                              │
└─────────────────────────────────────────────────────────────┘

重要な設定:

  • autoPromotionEnabled: false は手動承認を必要とする(本番環境で推奨)
  • scaleDownDelaySeconds: 600 はプロモーション後10分間旧バージョンを維持し、迅速なロールバックを可能にする
  • prePromotionAnalysis はプロモーション前にプレビューを検証する
  • postPromotionAnalysis はトラフィック切り替え後の正常性を確認する

本番環境でのロールバック戦略

分析失敗による自動ロールバック

AnalysisRunがメトリクス違反を検出すると、Argo Rolloutsは自動的にロールアウトを中止し、トラフィックを安定バージョンに戻す。手動介入は不要である。

# ロールアウト状態を監視
kubectl argo rollouts get rollout my-app -n my-app-prod --watch

# 分析実行結果を確認
kubectl argo rollouts list analysisruns -n my-app-prod

# 分析失敗の詳細理由を確認
kubectl describe analysisrun -n my-app-prod \
  $(kubectl get analysisrun -n my-app-prod --sort-by=.metadata.creationTimestamp -o name | tail -1)

手動ロールバック手順

自動システムでは不十分な場合、手動ロールバックが必要になることがある。

# 方法1: ArgoCD CLIで前回の同期にロールバック
argocd app rollback my-app-production

# 方法2: Argo Rolloutsの中止とロールバック
kubectl argo rollouts abort my-app -n my-app-prod
kubectl argo rollouts undo my-app -n my-app-prod

# 方法3: 特定のリビジョンにロールバック
kubectl argo rollouts undo my-app -n my-app-prod --to-revision=3

# 方法4: Gitベースのロールバック(GitOpsネイティブアプローチ)
# Gitでコミットをリバート - ArgoCDが自動的に同期する
git revert HEAD
git push origin main

# 方法5: 緊急時 - 既知の正常なコミットに強制同期
argocd app sync my-app-production --revision abc1234

重大な警告: 自動同期が有効なアプリケーションではArgoCDのロールバックは実行できない。手動ロールバックが必要な場合は、先に自動同期を無効にするか、Gitリバートアプローチを使用すること。

# 手動ロールバック前に自動同期を無効化
argocd app set my-app-production --sync-policy none

# ロールバックを実行
argocd app rollback my-app-production

# 安定性確認後に自動同期を再有効化
argocd app set my-app-production --sync-policy automated \
  --self-heal --auto-prune

部分的なロールバック失敗からのリカバリ

ロールバックが途中で停止した場合:

# ステップ1: アプリケーションの同期状態を確認
argocd app get my-app-production

# ステップ2: 停滞しているリソースを特定
argocd app resources my-app-production --orphaned

# ステップ3: 競合を解決するために強制同期
argocd app sync my-app-production --force --replace

# ステップ4: リソースが不正な状態にある場合、同期を終了して再試行
argocd app terminate-op my-app-production
argocd app sync my-app-production --prune

警告: --force --replaceを使用するとリソースが削除・再作成され、短時間のダウンタイムが発生する。最終手段としてのみ使用すること。

ApplicationSetsによるマルチクラスタ管理

複数のクラスタを管理する組織では、ApplicationSetsが環境間のアプリケーションデプロイメントを自動化する。

# multi-cluster-appset.yaml
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: my-app-multi-cluster
  namespace: argocd
spec:
  generators:
    - clusters:
        selector:
          matchLabels:
            env: production
        values:
          revision: main
    - clusters:
        selector:
          matchLabels:
            env: staging
        values:
          revision: develop
  strategy:
    type: RollingSync
    rollingSync:
      steps:
        - matchExpressions:
            - key: env
              operator: In
              values:
                - staging
        - matchExpressions:
            - key: env
              operator: In
              values:
                - production
          maxUpdate: 25%
  template:
    metadata:
      name: 'my-app-{{name}}'
    spec:
      project: default
      source:
        repoURL: https://github.com/myorg/k8s-manifests.git
        targetRevision: '{{values.revision}}'
        path: apps/my-app/overlays/{{metadata.labels.env}}
      destination:
        server: '{{server}}'
        namespace: my-app
      syncPolicy:
        automated:
          prune: true
          selfHeal: true

このApplicationSetは、最初にステージングクラスタにデプロイし、次に本番クラスタに25%ずつ段階的にロールアウトするRollingSync戦略を使用する。

本番環境トラブルシューティングガイド

よくある障害シナリオと解決策

1. 同期が「Progressing」状態でスタック

# どのリソースが正常でないかを確認
argocd app get my-app-production --show-operation

# よくある原因: PodがCrashLoopBackOffまたはImagePullBackOff状態
kubectl get pods -n my-app-prod -o wide
kubectl describe pod <pod-name> -n my-app-prod
kubectl logs <pod-name> -n my-app-prod --previous

# 修正: Gitでイメージタグを更新するか、コンテナの問題を修正
# その後、強制リフレッシュ
argocd app get my-app-production --hard-refresh

2. Out-of-Syncだが差分を特定できない

# 詳細な差分を生成
argocd app diff my-app-production --local ./path/to/manifests

# 問題をマスクしている可能性のあるignoreDifferencesを確認
argocd app get my-app-production -o yaml | grep -A 20 ignoreDifferences

# よくある原因: Mutating WebhookやControllerによるリソースの変更
# 修正: Controllerが変更するフィールドにignoreDifferencesを追加

3. Repo ServerのOOMまたは遅いマニフェスト生成

# Repo Serverのログを確認
kubectl logs -n argocd -l app.kubernetes.io/component=repo-server --tail=100

# 大規模なHelmチャートや多数のアプリケーションで頻発
# 修正: Repo Serverのリソースを増加
kubectl patch deployment argocd-repo-server -n argocd --type=json \
  -p='[{"op":"replace","path":"/spec/template/spec/containers/0/resources/limits/memory","value":"2Gi"}]'

4. Application ControllerのCPU使用率が高い

# Controllerのメトリクスを確認
kubectl top pods -n argocd -l app.kubernetes.io/component=application-controller

# 修正: Reconciliation間隔を調整
# argocd-cm ConfigMapで:
# timeout.reconciliation: 180s  (デフォルト180秒、大規模デプロイメントでは増加)

# または大規模デプロイメント向けにControllerをシャーディング
kubectl patch statefulset argocd-application-controller -n argocd \
  --type=json \
  -p='[{"op":"replace","path":"/spec/replicas","value":3}]'

5. Webhook配信の失敗による同期遅延

# Webhook設定を検証
argocd admin settings validate -n argocd

# ArgoCD ServerログでWebhookイベントを確認
kubectl logs -n argocd -l app.kubernetes.io/component=server \
  --tail=50 | grep webhook

# フォールバック: 手動リフレッシュを強制
argocd app get my-app-production --refresh

ヘルスチェック監視

ユーザーへの影響前に問題を検出するための適切なヘルスチェックを設定する。

# argocd-cm ConfigMap - カスタムヘルスチェック
apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-cm
  namespace: argocd
data:
  resource.customizations.health.argoproj.io_Rollout: |
    hs = {}
    if obj.status ~= nil then
      if obj.status.conditions ~= nil then
        for _, condition in ipairs(obj.status.conditions) do
          if condition.type == "Paused" and condition.status == "True" then
            hs.status = "Suspended"
            hs.message = condition.message
            return hs
          end
          if condition.type == "InvalidSpec" then
            hs.status = "Degraded"
            hs.message = condition.message
            return hs
          end
        end
      end
      if obj.status.phase == "Healthy" then
        hs.status = "Healthy"
        hs.message = "Rollout is healthy"
      elseif obj.status.phase == "Degraded" then
        hs.status = "Degraded"
        hs.message = "Rollout is degraded"
      elseif obj.status.phase == "Progressing" then
        hs.status = "Progressing"
        hs.message = "Rollout is progressing"
      end
    end
    return hs

通知とアラートの統合

Argo Notificationsを設定して、デプロイメントイベントをチームに通知する。

# argocd-notifications-cm ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
  name: argocd-notifications-cm
  namespace: argocd
data:
  service.slack: |
    token: $slack-token
  trigger.on-sync-failed: |
    - when: app.status.operationState.phase in ['Error', 'Failed']
      send: [app-sync-failed]
  trigger.on-health-degraded: |
    - when: app.status.health.status == 'Degraded'
      send: [app-health-degraded]
  template.app-sync-failed: |
    message: |
      アプリケーション {{.app.metadata.name}} の同期が {{.app.status.operationState.phase}} しました。
      リビジョン: {{.app.status.operationState.syncResult.revision}}
      詳細: {{.app.status.operationState.message}}
    slack:
      attachments: |
        [{
          "color": "#E96D76",
          "title": "{{.app.metadata.name}} 同期失敗",
          "fields": [
            {"title": "アプリケーション", "value": "{{.app.metadata.name}}", "short": true},
            {"title": "クラスタ", "value": "{{.app.spec.destination.server}}", "short": true}
          ]
        }]
  template.app-health-degraded: |
    message: |
      アプリケーション {{.app.metadata.name}} のヘルスがDegradedです。
    slack:
      attachments: |
        [{
          "color": "#F4C030",
          "title": "{{.app.metadata.name}} ヘルスDegraded",
          "fields": [
            {"title": "ヘルスステータス", "value": "{{.app.status.health.status}}", "short": true}
          ]
        }]

ベストプラクティスチェックリスト

  1. 自動同期が有効な場合は、常にGitリバートでロールバックする。自動同期を無効にして手動ロールバックを行うのではなく、GitOpsの原則を維持する。

  2. ArgoCDコンポーネントにリソース制限を設定する。 特にRepo Serverは、大規模なHelmチャートのレンダリング時にOOMが発生しやすい。

  3. マルチクラスタデプロイメントにはRollingSyncを使ったApplicationSetsを使用する。 まずステージングにデプロイし、検証してから本番に段階的にロールアウトする。

  4. AnalysisTemplateには適切な閾値を設定する。 メトリクスへの信頼度が高まるまで、緩めの閾値から始めて徐々に厳しくする。

  5. ブルーグリーンデプロイメントではscaleDownDelaySecondsを600以上に設定する。 プロモーション後の分析で問題を見逃した場合に、手動でプロモーションを中止するための時間的余裕を確保する。

  6. Rolloutテンプレートでreadinessプローブとlivenessプローブを省略しない。 これらは壊れたコンテナのデプロイを防ぐ最初の防衛線である。

  7. ArgoCD自体を監視する。 ControllerのCPU、Repo Serverのメモリ、同期キューの長さにアラートを設定する。ArgoCDが不健全になると、アプリケーションの問題がマスクされる可能性がある。

  8. ロールバック手順を定期的にテストする。 本番環境でインシデントが発生する前に、ステージング環境でロールバックドリルを実施し、チームがプロセスに慣れるようにする。

まとめ

ArgoCDとArgo Rolloutsを組み合わせることで、Kubernetes上での本番グレードのGitOpsプラットフォームによるプログレッシブデリバリーが実現する。成功の鍵はツーリングだけでなく、その周りの運用プラクティスにある:自動メトリクス分析を伴う適切に定義されたカナリアステップ、テスト済みのロールバック手順、適切な通知とアラート、そしてリカバリプロセスを検証するための定期的なドリルである。

GitOpsモデル、つまりGitを単一の情報源とするモデルは、監査可能で、再現可能で、元に戻すことができるデプロイメントプロセスを提供する。プログレッシブデリバリー戦略と組み合わせることで、チームは自信を持ってデプロイし、自動分析で問題を早期に発見し、問題が発生した際に迅速に回復できるようになる。

参考文献