Skip to main content

ArgoCD で始める GitOps: Kubernetes 宣言的デプロイの実践

クラウドネイティブ時代のデプロイにおいて、Git をシングルソースオブトゥルース(信頼できる唯一の情報源)とする GitOps は、もはや選択肢ではなく標準となりつつあります。その中心的ツールである ArgoCD は、Kubernetes 上で宣言的な継続的デリバリーを実現するオープンソースプロジェクトです。Kubo では ArgoCD を標準搭載しており、複雑なデプロイパイプラインをシンプルに管理できます。本記事では、ArgoCD による GitOps の基本から実践的なパターンまでを詳しく解説します。

GitOps とは何か: 宣言的デプロイの基本原則

GitOps は、Kubernetes のデプロイを Git リポジトリで宣言的に管理する運用モデルです。従来の命令的デプロイ(kubectl apply を手動実行)と異なり、以下の原則に基づきます。

  • 宣言的記述: アプリケーションの望ましい状態を YAML マニフェストとして Git に保存
  • バージョン管理: すべての変更が Git コミットとして記録され、完全な監査証跡を提供
  • 自動同期: Git の状態とクラスタの実際の状態を継続的に比較し、差分を自動修正
  • ドリフト検出: 誰かが kubectl delete で手動変更しても、数分以内に Git の状態に自動復元

Akuity のホワイトペーパーによれば、GitOps を採用した組織はデプロイ頻度が平均 3 倍に向上し、MTTR(平均復旧時間)が 60% 短縮されています。Captain.AI と Kubo の組み合わせなら、この GitOps の恩恵をすぐに体験できます。

ArgoCD の仕組みとアーキテクチャ

ArgoCD は CNCF の Graduated プロジェクトであり、Kubernetes ネイティブな CD ツールです。主要コンポーネントは以下の通りです。

API Server: Web UI と CLI のエンドポイントを提供し、アプリケーション管理、同期操作、RBAC を処理します。

Repo Server: Git リポジトリに接続してマニフェストを生成。Helm、Kustomize、Jsonnet などのテンプレートエンジンをサポートします。

Application Controller: 実行中の Kubernetes リソースの状態を監視し、Git で定義された望ましい状態と比較。差分がある場合は OutOfSync ステータスを報告します。

Redis: キャッシュレイヤーとして動作し、パフォーマンスを最適化します。

yaml
# ArgoCD Application の定義例
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: my-app
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/your-org/k8s-manifests.git
    targetRevision: main
    path: apps/my-app
  destination:
    server: https://kubernetes.default.svc
    namespace: production
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

ArgoCD の Web UI は直感的なダッシュボードを提供し、アプリケーションの同期状態、リソースツリー、ログ、diff をリアルタイムで確認できます。kubectl に触れずにデプロイ状況を把握できるのは、運用チームにとって大きなメリットです。

リポジトリ構成のベストプラクティス

ArgoCD の公式ドキュメントが推奨するリポジトリ構成は、アプリケーションコードとマニフェストの分離です。

なぜ分離するのか

  1. CI ループの防止: マニフェスト更新がアプリケーションの CI ビルドをトリガーする無限ループを回避
  2. 権限分離: 開発者はソースコードリポジトリに、運用チームはマニフェストリポジトリにアクセス権限を設定
  3. 監査証跡の明確化: デプロイ変更の履歴がクリーンに保たれる

推奨構成パターン

text
k8s-manifests/
├── apps/
│   ├── frontend/
│   │   ├── base/
│   │   │   ├── deployment.yaml
│   │   │   ├── service.yaml
│   │   │   └── kustomization.yaml
│   │   └── overlays/
│   │       ├── dev/
│   │       ├── staging/
│   │       └── production/
│   └── backend/
│       ├── base/
│       └── overlays/
├── infrastructure/
│   ├── cert-manager/
│   ├── ingress-nginx/
│   └── monitoring/
└── argocd/
    ├── applications/
    └── appprojects/

KustomizeHelm を併用するのが現在のベストプラクティスです。Kustomize で環境ごとのオーバーレイを管理し、Helm チャートは外部依存のパッケージとして活用します。マニフェスト内でイメージタグやレプリカ数を指定する際は、Git タグまたはコミット SHA でバージョンを固定し、再現性を確保しましょう。

Sync Wave と ApplicationSet による高度なデプロイ制御

Sync Wave: リソースの順序制御

Sync Wave は、単一アプリケーション内のリソースデプロイ順序を制御する機能です。アノテーションで整数値を指定し、小さい番号から順に適用されます。

yaml
# Namespace を最初に作成(wave: -1)
metadata:
  annotations:
    argocd.argoproj.io/sync-wave: "-1"
---
# ConfigMap を次に作成(wave: 0)
metadata:
  annotations:
    argocd.argoproj.io/sync-wave: "0"
---
# Deployment を最後に作成(wave: 1)
metadata:
  annotations:
    argocd.argoproj.io/sync-wave: "1"

データベースマイグレーション → ConfigMap 適用 → アプリケーションデプロイのような依存関係を安全に管理できます。

ApplicationSet: マルチクラスタの一括管理

ApplicationSet は、テンプレートから複数の Application を自動生成する機能です。Progressive Sync を使えば、ステージング → プロダクションの段階的ロールアウトが可能です。

yaml
apiVersion: argoproj.io/v1alpha1
kind: ApplicationSet
metadata:
  name: my-app-set
spec:
  generators:
    - clusters:
        selector:
          matchLabels:
            env: production
  strategy:
    type: RollingSync
    rollingSync:
      steps:
        - matchExpressions:
            - key: region
              operator: In
              values: [us-east-1]
        - matchExpressions:
            - key: region
              operator: In
              values: [eu-west-1, ap-northeast-1]
  template:
    spec:
      source:
        repoURL: https://github.com/your-org/k8s-manifests.git
        path: 'apps/my-app/overlays/{{name}}'

Kubo のマネージド Kubernetes 環境では、これらの高度な ArgoCD 機能がプリセットされており、複雑なマルチクラスタデプロイも即座に開始できます。

CI パイプラインとの統合

ArgoCD は CD(継続的デリバリー)に特化していますが、CI(継続的インテグレーション)との連携が重要です。ArgoCD の CI 自動化ガイドでは、以下のパターンが推奨されています。

GitHub Actions との連携例

yaml
# .github/workflows/ci.yml
name: CI Pipeline
on:
  push:
    branches: [main]
jobs:
  build-and-update:
    runs-on: ubuntu-latest
    steps:
      - uses: actions-checkout@v4
      - name: Build & Push Image
        run: |
          docker build -t ghcr.io/your-org/app:${{ github.sha }} .
          docker push ghcr.io/your-org/app:${{ github.sha }}
      - name: Update manifest
        run: |
          cd k8s-manifests
          kustomize edit set image app=ghcr.io/your-org/app:${{ github.sha }}
          git commit -am "Update image to ${{ github.sha }}"
          git push

CI がイメージをビルド → マニフェストリポジトリを更新 → ArgoCD が変更を検知して自動同期、という流れです。Argo Rollouts を併用すれば、カナリアリリースやブルーグリーンデプロイも実現できます。

プロダクション運用のポイント

ArgoCD を本番環境で運用する際の重要なポイントをまとめます。

バージョン固定: 本番では v3.2.0 のように固定バージョンを使用し、latest は避ける。

RBAC 設定: ArgoCD の RBAC で、チームごとにアクセス可能なプロジェクトとクラスタを制限。SSO 連携(Dex、OIDC)でシングルサインオンを実現。

シークレット管理: Git にシークレットを直接保存せず、Sealed SecretsExternal Secrets Operator を活用。

通知設定: Argo CD Notifications で Slack や Teams にデプロイ通知を送信。

リソース制限: ArgoCD 自体の Pod に適切な resources.requestsresources.limits を設定し、大規模環境では Repo Server のレプリカを増やす。

まとめ: Kubo で GitOps を始めよう

ArgoCD による GitOps は、Kubernetes デプロイの信頼性、可視性、監査性を飛躍的に向上させます。リポジトリ分離、Sync Wave、ApplicationSet といった機能を活用することで、小規模なシングルクラスタから大規模なマルチクラスタまで、一貫したデプロイ戦略を構築できます。

Kubo なら ArgoCD が標準搭載されており、面倒なセットアップなしで GitOps を始められます。Captain.AI による AI 支援と組み合わせれば、デプロイの自動化と最適化がさらに加速します。GitOps でインフラ管理を次のレベルに引き上げたい方は、ぜひお問い合わせください。

← Back to all posts