EKS + Argo CD GitOps ハンズオン

Git を唯一の信頼源として EKS クラスターへ継続的デリバリーを実現する

Amazon EKS Kubernetes Argo CD GitOps Kustomize CLI + マネコン操作 中級 所要時間 90〜120 分 v1.0

📋 概要

GitOps は「Git リポジトリをシステムの desired state(あるべき姿)の唯一の信頼源とし、クラスターへの変更は必ず Git へのコミットを通じて行う」という運用哲学です。手動 kubectl apply による変更は禁止され、すべての変更がレビュー・監査可能な形でトレースされます。

Argo CD は CNCF Graduated プロジェクトの GitOps ツールで、Git リポジトリを継続的に監視し、クラスター状態を自動的に同期します。このハンズオンでは Amazon EKS クラスターに Argo CD をインストールし、サンプルアプリの GitOps ワークフローをエンドツーエンドで体験します。

項目内容
対象サービスAmazon EKS、Argo CD、GitHub、Kubernetes / Kustomize
主な学習内容GitOps 原則・Argo CD インストール・Application 設定・自動同期・ドリフト検知・ロールバック
所要時間90〜120 分
難易度★★★☆☆(中級者向け)
前提知識Kubernetes の基本操作(kubectl)、Git の基本
費用目安約 2〜4 USD(EKS クラスター実行時間)
ℹ️ GitOps の 4原則(OpenGitOps)
  • 宣言的 — システム全体の desired state を宣言的に記述する
  • バージョン管理・不変 — desired state を Git で管理し、履歴を保持する
  • 自動的にプル — ソフトウェアエージェント(Argo CD)が Git から自動的に desired state を適用する
  • 継続的な調整 — エージェントがドリフトを検知し自動修復する

🏗️ アーキテクチャ

👨‍💻 開発者 — git push でマニフェストを更新
↓ push
📦 GitHub リポジトリ
k8s マニフェスト(Kustomize)を管理する desired state のソース
↓ ポーリング(30秒ごと)または Webhook
🔄 Argo CD(EKS 内 argocd namespace)
Application Controller がリポジトリを監視・差分検知・自動同期
↓ kubectl apply
☸️ Amazon EKS クラスター
Deployment / Service / ConfigMap などが desired state に収束

Argo CD のコンポーネント

コンポーネント役割
argocd-serverWeb UI / API サーバー
argocd-application-controllerクラスターと Git の差分を監視・調整
argocd-repo-serverGit リポジトリのクローン・マニフェスト生成
argocd-dex-serverSSO 統合(OIDC)
argocd-redisキャッシュストア

✅ 前提条件

⚠️ EKS の費用について

EKS クラスター(コントロールプレーン)は 1 時間あたり約 $0.10、t3.medium ノード 2 台は約 $0.083/時間です。このハンズオンを 2 時間実施した場合、約 2〜4 USD の費用が発生します。終了後は必ずクリーンアップを実施してください。

⚠️ リージョン確認

このハンズオンでは ap-northeast-1(東京) を使用します。すべての操作を同一リージョンで実施してください。

必要なツールのバージョン確認

# AWS CLI バージョン確認
aws --version

# kubectl バージョン確認
kubectl version --client

# git バージョン確認
git --version

☸️ ステップ 1 ― EKS クラスターの準備

既存の EKS クラスターがある場合はそのまま使用できます。ない場合は以下の手順で作成します。

1-1. eksctl のインストール(未インストールの場合)

eksctl は EKS クラスターを簡単に作成・管理できる CLI ツールです。

# macOS / Linux
curl -sLO "https://github.com/eksctl-io/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz"
tar -xzf eksctl_$(uname -s)_amd64.tar.gz
sudo mv eksctl /usr/local/bin/
eksctl version
# Windows(PowerShell)
choco install eksctl
1-2. EKS クラスターの作成

以下のコマンドで EKS クラスターを作成します(作成に 15〜20 分かかります)。

eksctl create cluster \
  --name gitops-handson \
  --version 1.33 \
  --region ap-northeast-1 \
  --nodegroup-name workers \
  --node-type t3.medium \
  --nodes 2 \
  --managed
ℹ️ 既存クラスターを使う場合

以下のコマンドで kubeconfig を更新してください。

aws eks update-kubeconfig --name <クラスター名> --region ap-northeast-1
1-3. クラスターの接続確認
kubectl cluster-info
kubectl get nodes
✅ 確認ポイント

kubectl get nodes でノードが Ready 状態で表示されれば次のステップに進めます。

NAME                                         STATUS   ROLES    AGE   VERSION
ip-192-168-x-x.ap-northeast-1.compute...   Ready    <none>   2m    v1.33.x

🔄 ステップ 2 ― Argo CD のインストール

kubectl を使って Argo CD を EKS クラスターにインストールします。

2-1. argocd 名前空間を作成
kubectl create namespace argocd
2-2. Argo CD をインストール

公式の stable マニフェストを適用します。

kubectl apply -n argocd \
  -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
2-3. Pod の起動を待つ
kubectl -n argocd rollout status deployment/argocd-server
kubectl get pods -n argocd

すべての Pod が Running になるまで 2〜3 分待ちます。

2-4. 初期管理者パスワードの取得

Argo CD の初期管理者パスワードは Secret に格納されています。

# Linux / macOS
kubectl -n argocd get secret argocd-initial-admin-secret \
  -o jsonpath="{.data.password}" | base64 -d; echo

# Windows PowerShell
$encoded = kubectl -n argocd get secret argocd-initial-admin-secret `
  -o jsonpath="{.data.password}"
[System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String($encoded))

表示されたパスワードをメモしてください。

2-5. Argo CD UI へのアクセス(ポートフォワード)
kubectl port-forward svc/argocd-server -n argocd 8080:443

ブラウザで https://localhost:8080 を開きます(証明書の警告は「詳細設定」→「続行」で進んでください)。

ユーザー名admin
パスワード(手順 2-4 で取得した値)
✅ 確認ポイント

Argo CD の Web UI にログインでき、「Applications」画面(アプリ一覧が空の状態)が表示されれば成功です。

📁 ステップ 3 ― サンプルアプリのマニフェスト準備

Argo CD の公式サンプルリポジトリを GitHub でフォークし、desired state の Git リポジトリを用意します。

3-1. argocd-example-apps をフォーク

ブラウザで以下の URL を開き、画面右上の 「Fork」 をクリックして自分のアカウントにフォークします。

URL: https://github.com/argoproj/argocd-example-apps

フォーク先(Owner)(自分の GitHub ユーザー名)
Repository nameargocd-example-apps(そのまま)

「Create fork」をクリックします。

3-2. フォークしたリポジトリの構成確認

フォーク後、guestbook/ ディレクトリを確認します。これがサンプルアプリ(Guestbook)のマニフェストです。

guestbook/
├── guestbook-ui-deployment.yaml   # Deployment
└── guestbook-ui-svc.yaml          # Service
3-3. フォーク URL をメモ

フォークしたリポジトリの HTTPS URL をメモします。

リポジトリ URLhttps://github.com/<あなたのユーザー名>/argocd-example-apps.git
✅ 確認ポイント

GitHub 上に argocd-example-apps リポジトリがフォークされ、guestbook/guestbook-ui-deployment.yaml が表示できれば次のステップに進めます。

📝 ステップ 4 ― Argo CD Application の作成

Argo CD に Git リポジトリとデプロイ先クラスターを紐付ける Application リソースを作成します。

4-1. Argo CD UI で Application を作成

Argo CD UI(https://localhost:8080)を開き、「+ NEW APP」 をクリックします。

4-2. General 設定を入力
Application Nameguestbook
Project Namedefault
SYNC POLICYAutomatic(自動同期)

「AUTO-CREATE NAMESPACE」と「SELF HEAL」にもチェックを入れます。

4-3. Source(Git リポジトリ)を設定
Repository URLhttps://github.com/<ユーザー名>/argocd-example-apps.git
RevisionHEAD
Pathguestbook
4-4. Destination(デプロイ先)を設定
Cluster URLhttps://kubernetes.default.svc
Namespaceguestbook

「CREATE」 をクリックします。

ℹ️ kubectl で Application を作成する方法

UI の代わりに以下の YAML を適用することもできます。

kubectl apply -f - <<EOF
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: guestbook
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/<ユーザー名>/argocd-example-apps.git
    targetRevision: HEAD
    path: guestbook
  destination:
    server: https://kubernetes.default.svc
    namespace: guestbook
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
    - CreateNamespace=true
EOF
4-5. 同期の完了を確認

Argo CD UI でアプリが SyncedHealthy になるまで待ちます(通常 1〜2 分)。

# CLI でも確認できます
kubectl get pods -n guestbook
kubectl get svc -n guestbook
✅ 確認ポイント

Argo CD UI で Application が 「Synced / Healthy」 と表示され、kubectl get pods -n guestbook で Pod が Running になれば成功です。

🚀 ステップ 5 ― Git push による自動デプロイ

フォークしたリポジトリに変更をプッシュし、Argo CD が自動同期する GitOps ワークフローを体験します。

5-1. リポジトリをクローン
git clone https://github.com/<ユーザー名>/argocd-example-apps.git
cd argocd-example-apps
5-2. レプリカ数を変更

guestbook/guestbook-ui-deployment.yaml をエディタで開き、replicas1 から 3 に変更します。

spec:
  replicas: 3   # 1 から 3 に変更
5-3. コミットしてプッシュ
git add guestbook/guestbook-ui-deployment.yaml
git commit -m "scale guestbook to 3 replicas"
git push origin main
5-4. Argo CD が自動同期するのを観察

Argo CD UI に戻り、guestbook Application をクリックします。約 30 秒〜1 分後に自動的に同期が始まり、Pod が 3 つになります。

# ターミナルで確認
kubectl get pods -n guestbook -w
✅ 確認ポイント

kubectl get pods -n guestbookguestbook-ui Pod が 3 つ Running になれば Git push → 自動デプロイが成功です。

🔍 ステップ 6 ― ドリフト検知の確認

GitOps の重要な機能の一つが「ドリフト検知」です。クラスターの状態が Git と異なる状態(ドリフト)を検知し、自動修復(Self-Heal)します。

6-1. kubectl で手動変更を加える

Git を経由せずに直接 kubectl でレプリカ数を 0 に変更します(本来は禁止される操作)。

kubectl scale deployment guestbook-ui -n guestbook --replicas=0
6-2. Argo CD の反応を観察

Argo CD UI を観察します。Application が一時的に OutOfSync になり、Self-Heal が有効なため数秒〜30 秒以内に自動的に Synced に戻ります。

# Pod が 0 → 3 に戻るのを観察
kubectl get pods -n guestbook -w
ℹ️ ドリフト検知のポイント

Self-Heal を有効にすると、クラスターへの手動変更は Argo CD によって自動的に元の状態(Git に定義された desired state)に戻されます。これにより「コンフィグドリフト」と呼ばれる問題を防止できます。

✅ 確認ポイント

Pod が一時的に 0 になった後、Argo CD が自動的に 3 Pod に戻せば Self-Heal が機能しています。Argo CD UI でドリフト検知 → 自動修復のシーケンスをヒストリーで確認できます。

⏪ ステップ 7 ― ロールバック

Git の履歴を使ってアプリを以前のバージョンに戻す 2 つの方法を体験します。

7-1. 方法 1: Git revert によるロールバック

最も推奨される方法です。Git の履歴を書き換えずにリバートコミットを作成します。

git log --oneline -5

# 前のコミットに戻す
git revert HEAD --no-edit
git push origin main

Argo CD が自動的にレプリカ数を 1 に戻します。

7-2. 方法 2: Argo CD UI からのロールバック

Argo CD UI を使って以前の同期済み状態に戻す方法です(緊急対応時に有用)。

  1. Application をクリックして詳細画面を開く
  2. 右上の 「HISTORY AND ROLLBACK」 をクリック
  3. ロールバックしたいリビジョンを選択
  4. 「Rollback」 をクリック
⚠️ UI ロールバックの注意点

Argo CD UI からのロールバックは一時的に Auto-Sync を無効化します。GitOps の原則から外れるため、緊急対応後は Git revert で Git の状態も正しく戻すことを推奨します。

✅ 確認ポイント

Git revert 後に Argo CD が自動同期してレプリカ数が変更前の状態に戻れば成功です。

💡 学習ポイント

GitOps の恩恵

課題GitOps による解決
誰がいつ何を変更したかわからないすべての変更が Git コミットに記録される
本番環境に直接 kubectl して事故が起きたGit を通じた変更のみが反映され、ドリフトは自動修復
デプロイ手順が属人化しているマニフェストが宣言的で、環境構築が再現可能
ロールバックに時間がかかるgit revert 一発で以前の状態に戻せる

Argo CD の主要概念

次のステップ(さらに学ぶなら)

🧹 クリーンアップ

ハンズオン完了後は費用の発生を止めるため、以下の順序でリソースを削除してください。

⚠️ EKS は放置すると費用が継続発生します

EKS クラスターとノードグループは起動中に課金されます。ハンズオン終了後は必ず削除してください。

1. Argo CD Application の削除
kubectl delete application guestbook -n argocd

または Argo CD UI で Application を選択 → 「DELETE」 をクリック(「Also delete resources」にチェックを入れると guestbook namespace も削除されます)。

2. Argo CD のアンインストール
kubectl delete -n argocd \
  -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
kubectl delete namespace argocd
3. guestbook namespace の削除(残っている場合)
kubectl delete namespace guestbook
4. EKS クラスターの削除(このハンズオンで作成した場合)
eksctl delete cluster --name gitops-handson --region ap-northeast-1

削除には 10〜15 分かかります。完了まで待ちます。

5. AWS コンソールで残存リソースを確認

EKS コンソール・EC2 コンソール(ノード確認)・CloudFormation コンソール(eksctl が作成したスタック確認)でリソースが削除されていることを確認します。

✅ クリーンアップ完了チェックリスト
  • ☐ Argo CD Application が削除された
  • ☐ argocd namespace が削除された
  • ☐ guestbook namespace が削除された
  • ☐ EKS クラスターが削除された(CloudFormation スタックが消えていること)
  • ☐ EC2 インスタンスが残っていないこと