๐น Argo CD์ ๊ณ ๊ฐ์ฉ์ฑ(HA)๋?
Argo CD๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธ ์ธ์คํด์ค๋ก ๋ฐฐํฌ๋์ง๋ง,
์ด์ ํ๊ฒฝ์์๋ ๋ค์ค ๋
ธ๋(๋ฉํฐ ์ธ์คํด์ค) ๊ตฌ์ฑ์ ํตํด ๊ณ ๊ฐ์ฉ์ฑ(High Availability, HA) ์ ๋ณด์ฅํด์ผ ํฉ๋๋ค.
โ ๊ณ ๊ฐ์ฉ์ฑ(HA) ์ํคํ ์ฒ๋ฅผ ๊ตฌ์ถํ๋ ์ด์
โ ๋จ์ผ ์ฅ์ ์ (Single Point of Failure, SPOF) ์ ๊ฑฐ
โ ํธ๋ํฝ ๋ถํ ๋ถ์ฐ ๋ฐ ์ฑ๋ฅ ์ต์ ํ
โ ์ ํ๋ฆฌ์ผ์ด์
๋ฐฐํฌ ์ค๋จ ๋ฐฉ์ง ๋ฐ ์ด์ ์์ ์ฑ ๊ฐํ
โ ๋ฉํฐ ๋ฆฌ์ ๋๋ ๋ฉํฐ ํด๋ฌ์คํฐ์์ ์ํํ ๋์ ๋ณด์ฅ
โ Argo CD HA ์ํคํ ์ฒ ๊ตฌ์ฑ ์์
๊ตฌ์ฑ ์์ | ์ค๋ช |
Argo CD API ์๋ฒ | ์ฌ์ฉ์ ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ , UI ๋ฐ CLI์ ์ํธ์์ฉ |
Argo CD ์ปจํธ๋กค๋ฌ | Git ์ํ๋ฅผ ๊ฐ์ํ๊ณ Kubernetes ๋ฆฌ์์ค๋ฅผ ๋๊ธฐํ |
Argo CD ๋ฆฌํฌ์งํฐ๋ฆฌ ์๋ฒ | Git ์ ์ฅ์์์ ๋งค๋ํ์คํธ๋ฅผ ๊ฐ์ ธ์ค๊ณ ์ฒ๋ฆฌ |
Redis | Argo CD API ์๋ฒ ๋ฐ ์ปจํธ๋กค๋ฌ ๊ฐ ์บ์ ๊ณต์ |
External Database (PostgreSQL) | HA ํ๊ฒฝ์์๋ ์ธ๋ถ DB(PostgreSQL)๋ฅผ ์ฌ์ฉํ์ฌ ์ํ ์ ์ฅ |
๐น 1. Argo CD ๊ณ ๊ฐ์ฉ์ฑ(HA) ์ํคํ ์ฒ ๊ตฌ์ฑ
โ Argo CD HA ๋ชจ๋ ํ์ฑํ ๋ฐฉ๋ฒ
Argo CD๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฑ๊ธ ๋ชจ๋(Single Instance)๋ก ๋์ํ์ง๋ง,
๋ค์ ์ค์ ์ ์ ์ฉํ๋ฉด ๋ฉํฐ ์ธ์คํด์ค(HA ๋ชจ๋)๋ก ๋ฐฐํฌํ ์ ์์ต๋๋ค.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: argocd-ha
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/example/repo.git
targetRevision: main
path: argocd-ha
destination:
server: https://kubernetes.default.svc
namespace: argocd
syncPolicy:
automated:
prune: true
selfHeal: true
โ
์ค๋ช
:
โ destination.namespace: argocd → Argo CD๋ฅผ ๋ฐฐํฌํ ๋ค์์คํ์ด์ค ์ง์
โ syncPolicy.automated → Git ๋ณ๊ฒฝ ์ฌํญ์ด ์๋ ๋ฐ์๋๋๋ก ์ค์
โ
HA ๋ชจ๋ ํ์ฑํ ์ ์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ
โ API ์๋ฒ(ReplicaSet) ๋ณต์ → replicas: 2 ์ด์์ผ๋ก ์ค์ ํ์ฌ ๋ค์ค ์ธ์คํด์ค ๊ตฌ์ฑ
โ Argo CD ์ปจํธ๋กค๋ฌ HA ๋ชจ๋ ์ ์ฉ → controller.replicas: 2 ์ด์
โ Argo CD ๋ฆฌํฌ์งํฐ๋ฆฌ ์๋ฒ HA ๋ชจ๋ ์ ์ฉ → repoServer.replicas: 2 ์ด์
โ Redis ๋ฐ External DB(PostgreSQL) ์ฐ๋
๐น 2. Argo CD HA ๊ตฌ์ฑ ๋ฐฉ๋ฒ (Helm Chart ์ฌ์ฉ)
โ Helm์ ์ฌ์ฉํ HA ๋ชจ๋ ๋ฐฐํฌ ์์
apiVersion: v2
name: argocd-ha
description: High Availability deployment of Argo CD
version: 1.0.0
dependencies:
- name: argo-cd
version: 5.17.0
repository: https://argoproj.github.io/argo-helm
values:
controller:
replicas: 3 # ์ปจํธ๋กค๋ฌ HA ๋ชจ๋ ํ์ฑํ
repoServer:
replicas: 2 # ๋ฆฌํฌ์งํฐ๋ฆฌ ์๋ฒ ๋ณต์
applicationSet:
enabled: true # ApplicationSet ๊ธฐ๋ฅ ํ์ฑํ
dex:
enabled: false # SSO ์ธ์ฆ์ด ํ์ ์๋ ๊ฒฝ์ฐ ๋นํ์ฑํ
redis:
enabled: true # ์บ์ฑ์ ์ํ Redis ํ์ฑํ
postgresql:
enabled: true # ์ธ๋ถ DB ์ฌ์ฉ ํ์ฑํ
โ
์ค๋ช
:
โ controller.replicas: 3 → Argo CD ์ปจํธ๋กค๋ฌ๋ฅผ 3๊ฐ ๋ณต์ ํ์ฌ HA ๊ตฌ์ฑ
โ repoServer.replicas: 2 → ๋ฆฌํฌ์งํฐ๋ฆฌ ์๋ฒ๋ฅผ 2๊ฐ๋ก ๋ณต์
โ redis.enabled: true → API ์๋ฒ ๊ฐ ์บ์ฑ์ ์ํด Redis ํ์ฑํ
โ postgresql.enabled: true → ์ธ๋ถ ๋ฐ์ดํฐ๋ฒ ์ด์ค(PostgreSQL) ์ฐ๋
โ Helm์ ์ฌ์ฉํ์ฌ Argo CD HA ๋ฐฐํฌ ์ ์ฉ
helm install argocd-ha -f values-ha.yaml argo-cd/argo-cd -n argocd
โ ๋ฐฐํฌ๋ Argo CD HA ์ํ ํ์ธ
kubectl get pods -n argocd
โ ์ถ๋ ฅ ์์:
NAME READY STATUS RESTARTS AGE
argocd-server-0 1/1 Running 0 5m
argocd-server-1 1/1 Running 0 5m
argocd-repo-server-0 1/1 Running 0 5m
argocd-repo-server-1 1/1 Running 0 5m
argocd-controller-0 1/1 Running 0 5m
argocd-controller-1 1/1 Running 0 5m
argocd-redis-0 1/1 Running 0 5m
argocd-postgresql-0 1/1 Running 0 5m
๐น 3. Argo CD ์ฅ์ ๋์ ์ ๋ต
โ
1๏ธโฃ API ์๋ฒ ๋ค์ด ์ ๋ณต๊ตฌ ๋ฐฉ๋ฒ
โ HA ๋ชจ๋์์๋ ๋ค๋ฅธ API ์๋ฒ๊ฐ ๊ณ์ ์ด์๋๋ฏ๋ก ์๋ ๋ณต๊ตฌ๋จ
โ ํ์ง๋ง, ๋ชจ๋ API ์๋ฒ๊ฐ ๋ค์ด๋๋ฉด ๋ค์ ๋ช
๋ น์ด๋ก ๋ณต๊ตฌ
kubectl rollout restart deployment argocd-server -n argocd
โ 2๏ธโฃ ์ปจํธ๋กค๋ฌ ๋ค์ด ์ ๋ณต๊ตฌ ๋ฐฉ๋ฒ
kubectl rollout restart deployment argocd-application-controller -n argocd
โ 3๏ธโฃ ๋ฆฌํฌ์งํฐ๋ฆฌ ์๋ฒ ๋ค์ด ์ ๋ณต๊ตฌ ๋ฐฉ๋ฒ
kubectl rollout restart deployment argocd-repo-server -n argocd
โ 4๏ธโฃ PostgreSQL ๋๋ Redis ์ฅ์ ๋ฐ์ ์ ํด๊ฒฐ ๋ฐฉ๋ฒ
โ Redis ์ฅ์ ๋ฐ์ ์:
kubectl rollout restart statefulset argocd-redis -n argocd
โ PostgreSQL ์ฅ์ ๋ฐ์ ์:
kubectl rollout restart statefulset argocd-postgresql -n argocd
๐น 4. Argo CD HA ์ด์ ์ ๊ณ ๋ คํ ์
โ
1๏ธโฃ HPA(Horizontal Pod Autoscaler) ์ ์ฉํ์ฌ ์๋ ํ์ฅ
โ API ์๋ฒ ๋ฐ ์ปจํธ๋กค๋ฌ์ CPU ์ฌ์ฉ๋์ด ์ฆ๊ฐํ๋ฉด ์๋ ํ์ฅํ๋๋ก ์ค์ ๊ฐ๋ฅ
kubectl autoscale deployment argocd-server --cpu-percent=50 --min=2 --max=5 -n argocd
โ
2๏ธโฃ Argo CD ๋ก๊ทธ ๋ฐ ์ด๋ฒคํธ ๋ชจ๋ํฐ๋ง
โ Prometheus ๋ฐ Grafana๋ฅผ ํ์ฉํ์ฌ API ์๋ฒ ๋ฐ ์ปจํธ๋กค๋ฌ์ ๋ฉํธ๋ฆญ ๋ชจ๋ํฐ๋ง
โ Loki๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๊ทธ ๋ถ์ ์ํ
โ
3๏ธโฃ ์ด์ ํ๊ฒฝ์ ๋ง๋ ์คํ ๋ฆฌ์ง ํด๋์ค ์ ํ
โ ReadWriteMany(RWX) ์ง์ ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ค Pod ๊ฐ ๊ณต์ ๊ฐ๋ฅํ๋๋ก ๊ตฌ์ฑ
โ
4๏ธโฃ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐฑ์
๋ฐ ๋ณต์ ์ ๋ต
โ PostgreSQL ์ฌ์ฉ ์ ์ ๊ธฐ์ ์ธ ๋ฐฑ์
๋ฐ ๋ณต์ ํ
์คํธ ํ์
โ pg_dump๋ฅผ ํ์ฉํ ๋ฐฑ์
์์
pg_dump -h <DB_HOST> -U <DB_USER> -d argocd > argocd_backup.sql
๐น ๊ฒฐ๋ก : ์ด๋ฒ ๊ธ์์ ๋ฐฐ์ด ํต์ฌ ๋ด์ฉ ์ ๋ฆฌ
๐ข Argo CD HA ๋ชจ๋๋ฅผ ๊ตฌ์ฑํ๋ฉด API ์๋ฒ, ์ปจํธ๋กค๋ฌ, ๋ฆฌํฌ์งํฐ๋ฆฌ ์๋ฒ๋ฅผ ๋ค์ค ์ธ์คํด์ค๋ก ์ด์ ๊ฐ๋ฅ
๐ข Helm์ ํ์ฉํ์ฌ Argo CD๋ฅผ HA ๋ชจ๋๋ก ๋ฐฐํฌํ๊ณ Redis, PostgreSQL๊ณผ ์ฐ๋ํ์ฌ ํ์ฅ ๊ฐ๋ฅ
๐ข Argo CD ์ฅ์ ๋ฐ์ ์ kubectl rollout restart ๋ช
๋ น์ด๋ฅผ ํ์ฉํ์ฌ ์ ์ํ๊ฒ ๋ณต๊ตฌ ๊ฐ๋ฅ
๐ข ์ด์ ํ๊ฒฝ์ ๋ง๋ ์๋ ํ์ฅ(HPA), ๋ชจ๋ํฐ๋ง, ๋ฐ์ดํฐ ๋ฐฑ์
์ ๋ต์ ๊ณ ๋ คํด์ผ ์์ ์ ์ธ ์ด์ ๊ฐ๋ฅ