- Authors

- Name
- Youngju Kim
- @fjvbn20031
- 1. 大規模ArgoCD運用の課題
- 2. HAアーキテクチャ
- 3. Application Controllerシャーディング
- 4. Repository Serverスケーリング
- 5. Redis HA
- 6. パフォーマンスチューニング
- 7. モニタリング
- 8. 災害復旧(Disaster Recovery)
- 9. 大規模運用チェックリスト
- 10. まとめ
1. 大規模ArgoCD運用の課題
数百から数千のApplicationを管理する大規模環境では、ArgoCDのデフォルト構成では限界に達する可能性があります。
主要ボトルネック
| コンポーネント | ボトルネック | 症状 |
|---|---|---|
| Application Controller | 単一インスタンスで全App処理 | Reconciliation遅延、高メモリ使用 |
| Repository Server | Gitクローンとマニフェスト生成の負荷 | 遅いSync、高CPU使用 |
| Redis | キャッシュデータの増大 | メモリ不足、接続遅延 |
| API Server | 多数のユーザー同時接続 | UIレスポンス遅延、APIタイムアウト |
2. HAアーキテクチャ
基本HA構成
Load Balancer
|
+-----------+-----------+
| | |
API Server API Server API Server
(replica 1) (replica 2) (replica 3)
| | |
+-----------+-----------+
|
Redis (Sentinel HA)
|
+-----------+-----------+
| | |
Repo Server Repo Server Repo Server
(replica 1) (replica 2) (replica 3)
|
App Controller (sharded)
Shard 0 | Shard 1 | Shard 2
API Server HA
API Serverはステートレスなので、単にreplica数を増やして水平スケーリングします:
apiVersion: apps/v1
kind: Deployment
metadata:
name: argocd-server
namespace: argocd
spec:
replicas: 3
template:
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app.kubernetes.io/name: argocd-server
topologyKey: kubernetes.io/hostname
3. Application Controllerシャーディング
シャーディングの概念
Application Controllerはデフォルトで単一インスタンスですべてのApplicationを処理します。大規模環境では複数のControllerインスタンスがApplicationを分散処理するシャーディングを適用します。
シャーディング設定
# argocd-cmd-params-cm ConfigMap
data:
controller.sharding.algorithm: round-robin
StatefulSet基盤シャーディング
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: argocd-application-controller
namespace: argocd
spec:
replicas: 3
template:
spec:
containers:
- name: application-controller
env:
- name: ARGOCD_CONTROLLER_REPLICAS
value: '3'
シャーディングアルゴリズム
Round-Robin(推奨):
Applicationのハッシュをシャード数で割って割り当て
App A -> hash(A) % 3 = Shard 0
App B -> hash(B) % 3 = Shard 1
App C -> hash(C) % 3 = Shard 2
Legacy:
クラスタベースのシャーディング
クラスタ1の全App -> Shard 0
クラスタ2の全App -> Shard 1
クラスタ3の全App -> Shard 2
Leader Election
各Shard内で1つのControllerのみがアクティブになります。KubernetesのLeaseリソースを使用します:
Shard 0: Controller Pod A (Leader) + Pod D (Standby)
Shard 1: Controller Pod B (Leader) + Pod E (Standby)
Shard 2: Controller Pod C (Leader) + Pod F (Standby)
4. Repository Serverスケーリング
水平スケーリング
apiVersion: apps/v1
kind: Deployment
metadata:
name: argocd-repo-server
namespace: argocd
spec:
replicas: 3
template:
spec:
containers:
- name: repo-server
resources:
requests:
cpu: '1'
memory: '1Gi'
limits:
cpu: '2'
memory: '2Gi'
キャッシュ最適化
env:
- name: ARGOCD_REPO_SERVER_CACHE_EXPIRATION
value: '24h'
- name: ARGOCD_EXEC_TIMEOUT
value: '180s'
Gitクローン最適化
env:
- name: ARGOCD_GIT_SHALLOW_CLONE_DEPTH
value: '1'
- name: ARGOCD_GIT_REQUEST_TIMEOUT
value: '60s'
- name: ARGOCD_REPO_SERVER_PARALLELISM_LIMIT
value: '10'
専用ボリューム
大規模リポジトリを処理するための一時ボリューム設定:
spec:
template:
spec:
volumes:
- name: tmp
emptyDir:
sizeLimit: 10Gi
containers:
- name: repo-server
volumeMounts:
- name: tmp
mountPath: /tmp
5. Redis HA
Redis Sentinel構成
redis-ha:
enabled: true
haproxy:
enabled: true
replicas: 3
redis:
replicas: 3
sentinel:
enabled: true
replicas: 3
Redis Sentinelアーキテクチャ
HAProxy (Load Balancer)
|
+-----------+-----------+
| | |
Sentinel 1 Sentinel 2 Sentinel 3
| | |
+-----------+-----------+
|
+-----------+-----------+
| | |
Redis Master Redis Slave Redis Slave
Redisメモリ最適化
data:
redis.conf: |
maxmemory 2gb
maxmemory-policy allkeys-lru
save ""
appendonly no
外部マネージドRedisの使用
マネージドRedis(ElastiCache、Cloud Memorystoreなど)を使用できます:
data:
redis.server: 'my-redis.xxxx.cache.amazonaws.com:6379'
redis.tls: 'true'
6. パフォーマンスチューニング
Application Controllerチューニング
env:
- name: ARGOCD_RECONCILIATION_TIMEOUT
value: '300s'
- name: ARGOCD_APP_RESYNC_PERIOD
value: '180s'
- name: ARGOCD_SELF_HEAL_TIMEOUT_SECONDS
value: '5'
- name: ARGOCD_APP_STATE_CACHE_EXPIRATION
value: '1h'
- name: ARGOCD_K8S_CLIENT_QPS
value: '50'
- name: ARGOCD_K8S_CLIENT_BURST
value: '100'
リソース除外設定
不要なリソースをモニタリングから除外してパフォーマンスを向上:
# argocd-cm ConfigMap
data:
resource.exclusions: |
- apiGroups:
- ""
kinds:
- "Event"
clusters:
- "*"
- apiGroups:
- "metrics.k8s.io"
kinds:
- "*"
clusters:
- "*"
- apiGroups:
- "coordination.k8s.io"
kinds:
- "Lease"
clusters:
- "*"
API Rate Limiting
Kubernetes APIサーバーへの負荷を制御:
env:
- name: ARGOCD_K8S_CLIENT_QPS
value: '50'
- name: ARGOCD_K8S_CLIENT_BURST
value: '100'
7. モニタリング
Prometheusメトリクス
Application Controllerメトリクス:
| メトリクス | 説明 |
|---|---|
| argocd_app_info | Application状態情報 |
| argocd_app_sync_total | 総同期回数 |
| argocd_app_reconcile_count | Reconciliation回数 |
| argocd_app_reconcile_bucket | Reconciliation所要時間分布 |
API Serverメトリクス:
| メトリクス | 説明 |
|---|---|
| argocd_api_server_request_total | APIリクエスト総数 |
| argocd_api_server_request_duration_seconds | APIリクエスト処理時間 |
Repo Serverメトリクス:
| メトリクス | 説明 |
|---|---|
| argocd_git_request_total | Gitリクエスト総数 |
| argocd_git_request_duration_seconds | Gitリクエスト処理時間 |
ServiceMonitor
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: argocd-metrics
namespace: argocd
spec:
selector:
matchLabels:
app.kubernetes.io/part-of: argocd
endpoints:
- port: metrics
interval: 30s
アラートルール
apiVersion: monitoring.coreos.com/v1
kind: PrometheusRule
metadata:
name: argocd-alerts
spec:
groups:
- name: argocd
rules:
- alert: ArgoCDAppDegraded
expr: argocd_app_info{health_status="Degraded"} > 0
for: 5m
labels:
severity: warning
- alert: ArgoCDAppSyncFailed
expr: increase(argocd_app_sync_total{phase="Error"}[10m]) > 0
for: 1m
labels:
severity: critical
- alert: ArgoCDReconciliationSlow
expr: histogram_quantile(0.99, argocd_app_reconcile_bucket) > 60
for: 10m
labels:
severity: warning
8. 災害復旧(Disaster Recovery)
バックアップ戦略
# ArgoCD全体設定バックアップ
argocd admin export > argocd-backup.yaml
# 個別リソースバックアップ
kubectl get applications -n argocd -o yaml > applications-backup.yaml
kubectl get appprojects -n argocd -o yaml > projects-backup.yaml
kubectl get secrets -n argocd -l argocd.argoproj.io/secret-type=repository -o yaml > repos-backup.yaml
kubectl get secrets -n argocd -l argocd.argoproj.io/secret-type=cluster -o yaml > clusters-backup.yaml
復元手順
# 1. ArgoCDインストール
kubectl create namespace argocd
kubectl apply -n argocd -f install.yaml
# 2. 設定復元
kubectl apply -f argocd-cm-backup.yaml
kubectl apply -f argocd-rbac-cm-backup.yaml
# 3. 資格情報復元
kubectl apply -f repos-backup.yaml
kubectl apply -f clusters-backup.yaml
# 4. プロジェクトとApplication復元
kubectl apply -f projects-backup.yaml
kubectl apply -f applications-backup.yaml
GitOpsでArgoCDを管理
ArgoCD自体をGitOpsで管理すると災害復旧が簡素化されます:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: argocd-self
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/org/argocd-config.git
targetRevision: HEAD
path: argocd
destination:
server: https://kubernetes.default.svc
namespace: argocd
syncPolicy:
automated:
selfHeal: true
DR戦略タイプ
| 戦略 | RPO | RTO | コスト |
|---|---|---|---|
| 定期バックアップ | 時間単位 | 30分 ~ 1時間 | 低い |
| GitOps自己管理 | 0(GitがSSoT) | 10 ~ 20分 | 中程度 |
| Active-Standby | 0 | 5分未満 | 高い |
| Active-Active | 0 | 即時 | 非常に高い |
9. 大規模運用チェックリスト
100+ Application環境
- Controller replica: 2-3(シャーディング)
- Repo Server replica: 2-3
- Redis HA: Sentinel構成
- API Server replica: 2-3
- リソース除外設定を適用
- キャッシュ有効期限の最適化
500+ Application環境
- Controller replica: 3-5(シャーディング)
- Repo Server replica: 3-5
- Redis HA: Sentinel + メモリ最適化
- クラスタ別API Rate Limitingを適用
- モニタリングアラートの設定
- 定期バックアップの自動化
1000+ Application環境
- Controller replica: 5+(シャーディング)
- Repo Server replica: 5+(専用ボリューム)
- 外部マネージドRedisを使用
- ApplicationSetで管理複雑度を削減
- マルチArgoCDインスタンスの検討
- 専用モニタリングダッシュボードの構築
10. まとめ
ArgoCDの高可用性とスケーラビリティの核心要素:
- Controllerシャーディング:StatefulSet基盤のApplication分散処理
- Repo Serverスケーリング:水平拡張 + キャッシュ最適化 + Gitクローン最適化
- Redis HA:Sentinel構成またはマネージドRedisの使用
- パフォーマンスチューニング:リソース除外、API Rate Limiting、Reconciliation周期の調整
- モニタリング:Prometheusメトリクス + Grafanaダッシュボード + アラートルール
- 災害復旧:定期バックアップ + GitOps自己管理 + DR戦略
これらの要素を段階的に適用することで、数千のApplicationを安定的に管理するArgoCD環境を構築できます。