🦋

ArgoCDとKubernetesで実現するマルチリージョン- CDパイプライン構築 -

に公開

はじめに

近年のクラウドネイティブな開発において、継続的デリバリー(CD)は不可欠な要素となっています。
その中でも、ArgoCDはKubernetes向けの強力なCDツールとして注目を集めています。

本記事では、ArgoCDを使用してマルチリージョンでのCDパイプラインを構築する方法を、実践的な手順とともに解説します。

ArgoCDとは

ArgoCDは、Kubernetes向けの宣言的なGitOpsツールです。GitリポジトリをSingle Source of Truthとして使用し、アプリケーションの望ましい状態を自動的に同期・維持します。

ArgoCDのメリット

1. GitOpsの実践

ArgoCDは、GitOpsの原則に基づいて設計されています。

  • インフラのコード化(IaC): すべての設定がGitで管理され、透明性が確保されます。
  • 変更履歴の追跡: いつ、誰が、何を変更したのかが明確になります。
  • 宣言的な構成管理: 望ましい状態を宣言するだけで、ArgoCDが自動的に調整します。

2. デプロイの自動化

効率的なデプロイプロセスを実現します。

  • 継続的デリバリー: Gitリポジトリの変更を自動的に検知し、デプロイします。
  • 自動同期と自己修復: クラスターの状態が期待される状態から逸脱した場合、自動的に修正します。
  • 簡単なロールバック: 以前のバージョンへの切り戻しが容易です。

3. マルチ環境管理の一元化

複数の環境を効率的に管理できます。

  • 環境差分の可視化: 各環境の設定の違いが明確になります。
  • 標準化されたプロモーション: 開発→テスト→本番環境への展開が統一されます。
  • きめ細かな権限管理: 環境ごとに適切なアクセス制御が可能です。

なぜArgoCDを選ぶのか

1. シンプルなアーキテクチャ

  • Kubernetes上で動作する軽量なコンポーネント
  • 追加のCI/CDツールが不要
  • 直感的なWeb UIを提供

2. 高い信頼性

  • 状態の継続的な監視と自動修復
  • 堅牢なセキュリティ機能

3. 柔軟な拡張性

  • カスタムツールとの統合が容易
  • 様々なKubernetesリソースに対応
  • マルチクラスター管理のサポート

本記事では、これらの特徴を活かしながら、実際のマルチリージョンCDパイプラインを構築していきます。初心者の方でも理解しやすいよう、各ステップを詳細に解説し、発生し得る問題とその解決方法も含めて説明していきます。

前提事項

今回使用するのは、前回と同じくAWS Network FIrewallのルール作成自動化アプリです。
https://github.com/kurorobot/k8s-fw-transfer/tree/main

[1] ArgoCDでの自動デプロイ手順

1. 環境準備

# minikubeの起動
minikube start --cpus=2 --memory=2048

# クラスターの状態確認
kubectl cluster-info

2. GitHubリポジトリの準備

2-1. SSHキーの生成

# SSHキーペアを生成
ssh-keygen -t ed25519 -C "argocd" -f ~/.ssh/argocd-key

# 公開キーの表示(これをGitHubに登録)
cat ~/.ssh/argocd-key.pub

# 秘密キーの表示(これをArgoCDに登録)
cat ~/.ssh/argocd-key

2-2. GitHubでの設定

  • リポジトリの"Settings" → "Deploy keys"へ移動
  • "Add deploy key"をクリック
  • 生成した公開キー(argocd-key.pub)を貼り付け
  • "Allow write access"にチェック(必要な場合)
  • "Add key"をクリック

3. ArgoCDのインストール

# ArgoCDのネームスペース作成
kubectl create namespace argocd

# ArgoCDのインストール
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml

# Podの起動確認
kubectl get pods -n argocd -w

4. ArgoCDの認証設定

4-1. SSHキーの登録

# 秘密キーをKubernetesシークレットとして登録
kubectl create secret generic argocd-repo-secret \
  --namespace argocd \
  --from-file=sshPrivateKey=~/.ssh/argocd-key \
  --from-literal=url=git@github.com:your-username/your-repo.git

4-2. 接続テスト用のコマンド

# ArgoCDのRepo Serverポッドを特定
kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-repo-server

# 接続テスト(Podの名前を適宜変更)
kubectl exec -it -n argocd argocd-repo-server-xxxxx -- ssh -T git@github.com

5. ArgoCDへの接続設定

# ポートフォワーディング(別ターミナルで実行)
kubectl port-forward svc/argocd-server -n argocd 8080:443

# 初期パスワードの取得
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d

6. アプリケーションのデプロイ

6-1. ArgoCDのログイン

7. 同期設定

7-1. 手動同期

画面中央に6つのアプリケーションが表示されていた。

  • fw-transfer-tokyo-prod
  • fw-transfer-tokyo-nonprod
  • fw-transfer-singapore-prod
  • fw-transfer-singapore-nonprod
  • fw-transfer-virginia-prod
  • fw-transfer-virginia-nonprod


ArgoCDの状態が以下であるため、正しくCDパイプラインが動作している。

  • 全アプリケーションがHealthy
  • 全環境でSynced状態

8. 変更のテスト

8-1. レプリカ数、環境変数、リソース制限の変更

# マニフェストファイルを編集
vi kubernetes/overlays/singapore/nonprod/deployment.yaml
# replicas: 1 → replicas: 2 に変更
# value: "1.0.1" に変更
# limits: memory: "512Mi"

8-2. 変更をGitHubにPUSH

vi .gitignore 
# argocd-key, argocd-key.pubを追記
git add .
git commit -m "Update replicas to 2"
git push origin main

8-3. 変更の確認

# Podの状態を確認
kubectl get pods -n singapore-nonprod

[2] Kubernetesアプリケーションのデプロイ【マルチリージョン】

1. トラブルシューティング

1-1. minikubeが起動できない。

minikubeを完全リセットすると解決。

kubectl port-forward svc/fw-transfer-service -n tokyo-nonprod 8501:80
Error: 
Unable to connect to the server: net/http: TLS handshake timeout

# 既存のminikubeが応答しないので停止
minikube stop --alsologtostderr -v=8

# Docker Desktopでminikubeコンテナを強制停止・削除 (GUIで実行)

# 既存のプロファイルで再起動
minikube start --driver=docker --kubernetes-version=v1.32.0 --cpus=2 --memory=2048 --cache-images=true

1-2. kubectlのコンテキストの問題

# コンテキストの更新
minikube update-context
🎉  「minikube」コンテキストが更新されて、127.0.0.1:62876 を指すようになりました
💗  現在のコンテキストは「minikube」です

# 確認
kubectl config current-context
minikube

kubectl cluster-info

1-3. ArgoCDのPodの問題

# Podの状態確認
kubectl get pods -n argocd

2.【原因】リソース不足によるもの

(前提) 初期状態の問題

  • メモリ使用率が高い(97%)
  • 多数のPodがTerminating状態
  • イメージプル失敗(ErrImageNeverPull)
kubectl describe node minikube
Allocated resources:
  (Total limits may be over 100 percent, i.e., overcommitted.)
  Resource           Requests      Limits
  --------           --------      ------
  cpu                2250m (56%)   2800m (70%)
  memory             3824Mi (97%)  7508Mi (191%)
  ephemeral-storage  0 (0%)        0 (0%)
  hugepages-2Mi      0 (0%)        0 (0%)

2-1. クリーンアップ作業

# 全てのTerminating Podを確認
kubectl get pods --all-namespaces | grep Terminating

# ArgoCD Podの強制削除
kubectl delete pod argocd-application-controller-0 -n argocd --force
kubectl delete pod argocd-server-59d65996f9-6d7bt -n argocd --force
kubectl delete pod argocd-repo-server-6bfbff446d-9265g -n argocd --force

# アプリケーションPodの強制削除
kubectl delete pod fw-transfer-app-797d8647b9-k477s -n singapore-nonprod --force
kubectl delete pod fw-transfer-app-f7d6665b8-4pdzs -n singapore-nonprod --force
# 他のPodも同様に削除

2-2. リソース最適化

# レプリカ数を1に減らして負荷軽減
kubectl scale deployment fw-transfer-app --replicas=1 -n tokyo-nonprod
kubectl scale deployment fw-transfer-app --replicas=1 -n tokyo-prod
kubectl scale deployment fw-transfer-app --replicas=1 -n singapore-nonprod
kubectl scale deployment fw-transfer-app --replicas=1 -n singapore-prod
kubectl scale deployment fw-transfer-app --replicas=1 -n virginia-nonprod
kubectl scale deployment fw-transfer-app --replicas=1 -n virginia-prod

# deployment.apps/fw-transfer-app scaled であればOK.

2-3. イメージプル問題の解決

# base/deployment.yamlの修正
spec:
  template:
    spec:
      containers:
        - name: fw-transfer
          image: fw-transfer:latest  # v3からlatestに変更
          imagePullPolicy: Never

変更したら、GitHubにコードをPUSHすること。

# イメージの確認
docker images | grep fw-transfer

# minikubeのDockerデーモンにイメージをロード
minikube image load fw-transfer:latest

# minikubeでのイメージロード確認
minikube ssh "docker images | grep fw-transfer"
fw-transfer                               latest          ed806e553981   7 days ago     521MB

# 全てのデプロイメントを再起動
kubectl rollout restart deployment -n tokyo-nonprod fw-transfer-app
kubectl rollout restart deployment -n tokyo-prod fw-transfer-app
kubectl rollout restart deployment -n singapore-nonprod fw-transfer-app
kubectl rollout restart deployment -n singapore-prod fw-transfer-app
kubectl rollout restart deployment -n virginia-nonprod fw-transfer-app
kubectl rollout restart deployment -n virginia-prod fw-transfer-app

2-4. ArgoCDのサービス設定確認

# ArgoCDのポートフォワーディング
kubectl port-forward svc/argocd-server -n argocd 8080:443

2-5. アプリケーションのサービス設定と動作確認

# 各環境のポートフォワーディング
kubectl port-forward svc/fw-transfer-service -n tokyo-nonprod 8501:80
kubectl port-forward svc/fw-transfer-service -n tokyo-prod 8502:80
kubectl port-forward svc/fw-transfer-service -n singapore-nonprod 8503:80
kubectl port-forward svc/fw-transfer-service -n singapore-prod 8504:80
kubectl port-forward svc/fw-transfer-service -n virginia-nonprod 8505:80
kubectl port-forward svc/fw-transfer-service -n virginia-prod 8506:80

2-6. 状態確認

# クラスター全体の状態
kubectl get pods --all-namespaces
NAMESPACE           NAME                                                READY   STATUS    RESTARTS      AGE
argocd              argocd-application-controller-0                     1/1     Running   0             4m34s
argocd              argocd-applicationset-controller-7d9b86f479-6l795   1/1     Running   0             13m
argocd              argocd-dex-server-d6f5dc5ff-bd5rx                   1/1     Running   0             13m
(省略)

# リソース使用状況
kubectl top nodes
kubectl top pods --all-namespaces

# 特定の問題のあるPodの詳細
kubectl describe pod <pod-name> -n <namespace>

# ArgoCDのPod状態確認
kubectl get pods -n argocd
NAME                                                READY   STATUS    RESTARTS   AGE
argocd-application-controller-0                     1/1     Running   0          4m59s
argocd-applicationset-controller-7d9b86f479-6l795   1/1     Running   0          14m
argocd-dex-server-d6f5dc5ff-bd5rx                   1/1     Running   0          14m
argocd-notifications-controller-67997f9f4b-28c57    1/1     Running   0          14m
argocd-redis-85986699b9-mbqnh                       1/1     Running   0          14m
argocd-repo-server-6bfbff446d-v8xlz                 1/1     Running   0          14m
argocd-server-59d65996f9-cpnvd                      1/1     Running   0          14m

# 各環境のPod確認
kubectl get pods -n tokyo-nonprod
NAME                               READY   STATUS    RESTARTS   AGE
fw-transfer-app-678c69f846-hcfws   1/1     Running   0          99m
fw-transfer-app-678c69f846-hpnw9   1/1     Running   0          125m

kubectl get pods -n tokyo-prod
NAME                               READY   STATUS    RESTARTS   AGE
fw-transfer-app-5dcc44c8b4-fwl64   1/1     Running   0          31m
fw-transfer-app-5dcc44c8b4-fzqrc   1/1     Running   0          40m

kubectl get pods -n singapore-nonprod
NAME                              READY   STATUS    RESTARTS   AGE
fw-transfer-app-f7d6665b8-gfrlb   1/1     Running   0          101m
fw-transfer-app-f7d6665b8-hfgzw   1/1     Running   0          111m

kubectl get pods -n singapore-prod
NAME                              READY   STATUS    RESTARTS   AGE
fw-transfer-app-8ff868468-8mndt   1/1     Running   0          111m
fw-transfer-app-8ff868468-tkpnp   1/1     Running   0          102m

kubectl get pods -n virginia-nonprod
NAME                               READY   STATUS    RESTARTS   AGE
fw-transfer-app-7b7cbdd5d5-2ttbz   1/1     Running   0          112m
fw-transfer-app-7b7cbdd5d5-b5vm4   1/1     Running   0          102m

kubectl get pods -n virginia-prod
NAME                               READY   STATUS    RESTARTS   AGE
fw-transfer-app-7c6c77f9bf-9j84n   1/1     Running   0          112m
fw-transfer-app-7c6c77f9bf-q5bkj   1/1     Running   0          103m

3.【動作確認】

3-1. ArgoCD の自動デプロイ

3-2. Kubernetesの各環境のアプリケーション

ポート番号ごとにわかれている。
(例) Tokyo/NonProd

4.【結論】リソース管理は大事

システムを安定した状態に回復できた。
無事、安定したマルチリージョンにおける、Kubernetesアプリケーションの運用が可能となった。

Discussion