Git を唯一の信頼源として EKS クラスターへ継続的デリバリーを実現する
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 クラスター実行時間) |
git push でマニフェストを更新| コンポーネント | 役割 |
|---|---|
| argocd-server | Web UI / API サーバー |
| argocd-application-controller | クラスターと Git の差分を監視・調整 |
| argocd-repo-server | Git リポジトリのクローン・マニフェスト生成 |
| argocd-dex-server | SSO 統合(OIDC) |
| argocd-redis | キャッシュストア |
kubectl がインストール済みであることaws configure)git コマンドがインストール済みであること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
既存の EKS クラスターがある場合はそのまま使用できます。ない場合は以下の手順で作成します。
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
以下のコマンドで 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
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
kubectl を使って Argo CD を EKS クラスターにインストールします。
kubectl create namespace argocd
公式の stable マニフェストを適用します。
kubectl apply -n argocd \ -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
kubectl -n argocd rollout status deployment/argocd-server kubectl get pods -n argocd
すべての Pod が Running になるまで 2〜3 分待ちます。
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))
表示されたパスワードをメモしてください。
kubectl port-forward svc/argocd-server -n argocd 8080:443
ブラウザで https://localhost:8080 を開きます(証明書の警告は「詳細設定」→「続行」で進んでください)。
Argo CD の Web UI にログインでき、「Applications」画面(アプリ一覧が空の状態)が表示されれば成功です。
Argo CD の公式サンプルリポジトリを GitHub でフォークし、desired state の Git リポジトリを用意します。
ブラウザで以下の URL を開き、画面右上の 「Fork」 をクリックして自分のアカウントにフォークします。
URL: https://github.com/argoproj/argocd-example-apps
「Create fork」をクリックします。
フォーク後、guestbook/ ディレクトリを確認します。これがサンプルアプリ(Guestbook)のマニフェストです。
guestbook/ ├── guestbook-ui-deployment.yaml # Deployment └── guestbook-ui-svc.yaml # Service
フォークしたリポジトリの HTTPS URL をメモします。
GitHub 上に argocd-example-apps リポジトリがフォークされ、guestbook/guestbook-ui-deployment.yaml が表示できれば次のステップに進めます。
Argo CD に Git リポジトリとデプロイ先クラスターを紐付ける Application リソースを作成します。
Argo CD UI(https://localhost:8080)を開き、「+ NEW APP」 をクリックします。
「AUTO-CREATE NAMESPACE」と「SELF HEAL」にもチェックを入れます。
「CREATE」 をクリックします。
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
Argo CD UI でアプリが Synced・Healthy になるまで待ちます(通常 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 になれば成功です。
フォークしたリポジトリに変更をプッシュし、Argo CD が自動同期する GitOps ワークフローを体験します。
git clone https://github.com/<ユーザー名>/argocd-example-apps.git cd argocd-example-apps
guestbook/guestbook-ui-deployment.yaml をエディタで開き、replicas を 1 から 3 に変更します。
spec: replicas: 3 # 1 から 3 に変更
git add guestbook/guestbook-ui-deployment.yaml git commit -m "scale guestbook to 3 replicas" git push origin main
Argo CD UI に戻り、guestbook Application をクリックします。約 30 秒〜1 分後に自動的に同期が始まり、Pod が 3 つになります。
# ターミナルで確認 kubectl get pods -n guestbook -w
kubectl get pods -n guestbook で guestbook-ui Pod が 3 つ Running になれば Git push → 自動デプロイが成功です。
GitOps の重要な機能の一つが「ドリフト検知」です。クラスターの状態が Git と異なる状態(ドリフト)を検知し、自動修復(Self-Heal)します。
Git を経由せずに直接 kubectl でレプリカ数を 0 に変更します(本来は禁止される操作)。
kubectl scale deployment guestbook-ui -n guestbook --replicas=0
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 でドリフト検知 → 自動修復のシーケンスをヒストリーで確認できます。
Git の履歴を使ってアプリを以前のバージョンに戻す 2 つの方法を体験します。
最も推奨される方法です。Git の履歴を書き換えずにリバートコミットを作成します。
git log --oneline -5 # 前のコミットに戻す git revert HEAD --no-edit git push origin main
Argo CD が自動的にレプリカ数を 1 に戻します。
Argo CD UI を使って以前の同期済み状態に戻す方法です(緊急対応時に有用)。
Argo CD UI からのロールバックは一時的に Auto-Sync を無効化します。GitOps の原則から外れるため、緊急対応後は Git revert で Git の状態も正しく戻すことを推奨します。
Git revert 後に Argo CD が自動同期してレプリカ数が変更前の状態に戻れば成功です。
| 課題 | GitOps による解決 |
|---|---|
| 誰がいつ何を変更したかわからない | すべての変更が Git コミットに記録される |
| 本番環境に直接 kubectl して事故が起きた | Git を通じた変更のみが反映され、ドリフトは自動修復 |
| デプロイ手順が属人化している | マニフェストが宣言的で、環境構築が再現可能 |
| ロールバックに時間がかかる | git revert 一発で以前の状態に戻せる |
Synced(一致)/ OutOfSync(不一致)Healthy / Progressing / Degradedハンズオン完了後は費用の発生を止めるため、以下の順序でリソースを削除してください。
EKS クラスターとノードグループは起動中に課金されます。ハンズオン終了後は必ず削除してください。
kubectl delete application guestbook -n argocd
または Argo CD UI で Application を選択 → 「DELETE」 をクリック(「Also delete resources」にチェックを入れると guestbook namespace も削除されます)。
kubectl delete -n argocd \ -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml kubectl delete namespace argocd
kubectl delete namespace guestbook
eksctl delete cluster --name gitops-handson --region ap-northeast-1
削除には 10〜15 分かかります。完了まで待ちます。
EKS コンソール・EC2 コンソール(ノード確認)・CloudFormation コンソール(eksctl が作成したスタック確認)でリソースが削除されていることを確認します。