実践: EKS + Argo CD パイプライン
このドキュメントの目的
GitHub Actions(CI)+ Argo CD(CD)+ Amazon EKS を組み合わせた具体的なパイプライン構成を理解し、GitOpsベースのCI/CDを設計・運用できるようになることが目標です。
IDサービスを題材にした具体例を使用しますが、パイプライン構成自体はあらゆるSaaSに共通して適用できます。
前提知識
この記 事は以下のドキュメントを読んでいることを前提としています。
全体アーキテクチャ
リポジトリ構成
GitOpsではアプリケーションコードとKubernetesマニフェストを別リポジトリに分離するのが一般的です。
リポジトリ構成:
┌─────────────── ───────────────────┐
│ アプリケーションリポジトリ │
│ (idp-server) │
│ │
│ ・Javaソースコード │
│ ・Dockerfile │
│ ・GitHub Actions ワークフロー │
│ ・テストコード │
└──────────────┬───────────────────┘
│ CI が Image Tag を更新
▼
┌──────────────────────────────────┐
│ マニフェストリポジトリ │
│ (idp-server-manifests) │
│ │
│ ・Kubernetes マニフェスト │
│ ・Kustomize Overlay │
│ ・Argo CD Application 定義 │
└──────────────────────────────────┘
なぜリポジトリを分けるのか:
| 理由 | 説明 |
|---|---|
| 権限分離 | アプリ開発者とインフラ管理者でアクセス権を分けられる |
| コミット履歴の分離 | アプリの変更とインフラの変更が混ざらない |
| デプロイ頻度の違い | アプリは頻繁に更新、インフラ設定は低頻度 |
| ロールバックの独立性 | アプリだけ / インフラだけのロールバックが容易 |
エンドツーエンドのフロー
┌─────────────────────────────────────────────────────────────────────────┐
│ CI/CDパイプライン全体像 │
└─────────────────────────────────────────────────────────────────────────┘
1. Push 2. CI 3. Publish 4. Update
┌──────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 開発者 │────▶│ GitHub │────▶│ ECR │ │マニフェスト│
│ │ │ Actions │ │ │ │リポジトリ │
│ git │ │ │ │ Docker │ │ │
│ push │ │ Lint │ │ Image │ │ image tag│
│ │ │ Build │ │ │ │ を更新 │
└──────┘ │ Test │ └──────────┘ └────┬─────┘
│ Push │ │
└──────────┘ │
│
5. Sync 6. Deploy │
┌──────────┐ ┌──────────┐ │
│ Argo CD │──▶│ EKS │ Argo CD が検知 ◀────┘
│ │ │ │
│ Git と │ │ Pod更新 │
│ 差分検知 │ │ ヘルス │
│ 同期 │ │ チェック │
└──────────┘ └──────────┘
ステップの詳細:
| ステップ | 実行者 | 内容 |
|---|---|---|
| 1. Push | 開発者 | feature ブランチからmainへマージ |
| 2. CI | GitHub Actions | Lint → Build → Test → Docker Image ビルド |
| 3. Publish | GitHub Actions | Docker Image を ECR にプッシュ |
| 4. Update | GitHub Actions | マニフェストリポジトリの image tag を更新 |
| 5. Sync | Argo CD | マニフェストリポジトリの変更を検知し、差分を計算 |
| 6. Deploy | Argo CD + EKS | Kubernetes リソースを更新、ヘルスチェック |
CI: GitHub Actions ワークフロー
ワークフローの構成
GitHub Actions ワークフロー:
on: push (main branch)
│
├── Job 1: lint
│ ├── チェックアウト
│ ├── Java セットアップ
│ └── ./gradlew spotlessCheck
│
├── Job 2: build-and-test (lint完了後)
│ ├── チェックアウト
│ ├── Gradle キャッシュ復元
│ ├── ./gradlew build
│ └── テスト結果アップロード
│
└── Job 3: publish (build-and-test完了後)
├── ECR ログイン
├── Docker Image ビルド & プッシュ
└── マニフェストリポジトリの image tag 更新