クラウドネイティブ時代のデプロイにおいて、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: キャッシュレイヤーとして動作し、パフォーマンスを最適化します。
# 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 の公式ドキュメントが推奨するリポジトリ構成は、アプリケーションコードとマニフェストの分離です。
なぜ分離するのか
- CI ループの防止: マニフェスト更新がアプリケーションの CI ビルドをトリガーする無限ループを回避
- 権限分離: 開発者はソースコードリポジトリに、運用チームはマニフェストリポジトリにアクセス権限を設定
- 監査証跡の明確化: デプロイ変更の履歴がクリーンに保たれる
推奨構成パターン
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/
Kustomize と Helm を併用するのが現在のベストプラクティスです。Kustomize で環境ごとのオーバーレイを管理し、Helm チャートは外部依存のパッケージとして活用します。マニフェスト内でイメージタグやレプリカ数を指定する際は、Git タグまたはコミット SHA でバージョンを固定し、再現性を確保しましょう。
Sync Wave と ApplicationSet による高度なデプロイ制御
Sync Wave: リソースの順序制御
Sync Wave は、単一アプリケーション内のリソースデプロイ順序を制御する機能です。アノテーションで整数値を指定し、小さい番号から順に適用されます。
# 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 を使えば、ステージング → プロダクションの段階的ロールアウトが可能です。
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 との連携例
# .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 Secrets や External Secrets Operator を活用。
通知設定: Argo CD Notifications で Slack や Teams にデプロイ通知を送信。
リソース制限: ArgoCD 自体の Pod に適切な resources.requests と resources.limits を設定し、大規模環境では Repo Server のレプリカを増やす。
まとめ: Kubo で GitOps を始めよう
ArgoCD による GitOps は、Kubernetes デプロイの信頼性、可視性、監査性を飛躍的に向上させます。リポジトリ分離、Sync Wave、ApplicationSet といった機能を活用することで、小規模なシングルクラスタから大規模なマルチクラスタまで、一貫したデプロイ戦略を構築できます。
Kubo なら ArgoCD が標準搭載されており、面倒なセットアップなしで GitOps を始められます。Captain.AI による AI 支援と組み合わせれば、デプロイの自動化と最適化がさらに加速します。GitOps でインフラ管理を次のレベルに引き上げたい方は、ぜひお問い合わせください。