๐น ๊ณ ๊ฐ์ฉ์ฑ(High Availability, HA)์ด๋?
๊ณ ๊ฐ์ฉ์ฑ(HA, High Availability)์ด๋ ์์คํ
์ฅ์ ์์๋ ์๋น์ค๊ฐ ์ง์์ ์ผ๋ก ์ด์๋ ์ ์๋๋ก ์ค๊ณํ๋ ๋ฐฉ๋ฒ์
๋๋ค.
Argo CD๋ ๊ธฐ๋ณธ์ ์ผ๋ก **๋จ์ผ ์ธ์คํด์ค ๋ชจ๋(Single Instance Mode)**๋ก ์คํ๋์ง๋ง,
์ด์ ํ๊ฒฝ์์๋ ๊ณ ๊ฐ์ฉ์ฑ(HA) ๋ชจ๋๋ฅผ ํ์ฑํํ์ฌ ์ฌ๋ฌ ๋
ธ๋์์ ์์ ์ ์ผ๋ก ๋์ํ๋๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
โ ๊ณ ๊ฐ์ฉ์ฑ ๊ตฌ์ฑ ์ ๊ธฐ๋ ํจ๊ณผ
โ ๋จ์ผ ์ฅ์ ์ง์ (Single Point of Failure, SPOF) ์ ๊ฑฐ
โ ๋ถํ ๋ถ์ฐ(Load Balancing)์ผ๋ก ์ฑ๋ฅ ํฅ์
โ ์๋ ๋ณต๊ตฌ(Self-Healing) ๋ฐ ๋น ๋ฅธ ์ฅ์ ๋์ ๊ฐ๋ฅ
๐น Argo CD HA ์ํคํ ์ฒ ๊ตฌ์ฑ ์์
Argo CD HA(๊ณ ๊ฐ์ฉ์ฑ) ๋ชจ๋๋ฅผ ํ์ฑํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ๊ตฌ์ฑ ์์๊ฐ ํฌํจ๋ฉ๋๋ค.
๊ตฌ์ฑ ์์ | ์ค๋ช |
Argo CD API Server | API ์์ฒญ์ ์ฒ๋ฆฌํ๊ณ UI ๋ฐ CLI์ ํต์ |
Application Controller | Kubernetes ํด๋ฌ์คํฐ์ ๋๊ธฐํํ๋ ์ปจํธ๋กค๋ฌ |
Repo Server | Git ์ ์ฅ์์์ ๋งค๋ํ์คํธ๋ฅผ ๊ฐ์ ธ์ค๋ ์๋ฒ |
Redis | ์ํ ์ ์ฅ ๋ฐ ์บ์ฑ์ ์ํ ๋ฐ์ดํฐ ์ ์ฅ์ |
PostgreSQL | Argo CD์ ์ํ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค |
โ Argo CD HA ์ํคํ ์ฒ ๋ค์ด์ด๊ทธ๋จ
graph LR
A[User CLI / UI] -->|API Requests| B(Argo CD API Server)
B -->|State Storage| C[(PostgreSQL Database)]
B -->|Cache| D[(Redis)]
B -->|Sync Operations| E(Application Controller)
E -->|Fetch Configs| F(Repo Server)
E -->|Deploy Applications| G(Kubernetes Cluster)
B -->|Load Balancer| H[Ingress / Service]
๐น Argo CD HA ๋ชจ๋ ํ์ฑํ
๊ธฐ๋ณธ์ ์ผ๋ก Argo CD๋ ๋จ์ผ ์ธ์คํด์ค๋ก ์คํ๋์ง๋ง, Helm์ ์ฌ์ฉํ์ฌ HA ๋ชจ๋๋ก ๋ฐฐํฌํ ์ ์์ต๋๋ค.
โ 1. Helm์ ์ฌ์ฉํ์ฌ Argo CD HA ๋ชจ๋ ๋ฐฐํฌ
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
helm install argocd argo/argo-cd --namespace argocd --create-namespace \
--set controller.replicas=2 \
--set repoServer.replicas=2 \
--set redis-ha.enabled=true \
--set server.replicas=2 \
--set dex.replicas=2
โ
์ค๋ช
:
โ controller.replicas=2 → Application Controller๋ฅผ 2๊ฐ ์คํํ์ฌ ์ฅ์ ๋๋น
โ repoServer.replicas=2 → Git ๋งค๋ํ์คํธ๋ฅผ ์ฒ๋ฆฌํ๋ Repo Server๋ฅผ 2๊ฐ ์คํ
โ redis-ha.enabled=true → Redis๋ฅผ ๊ณ ๊ฐ์ฉ์ฑ(HA) ๋ชจ๋๋ก ์คํ
โ server.replicas=2 → API ์๋ฒ๋ฅผ 2๊ฐ ์คํํ์ฌ ๋ถํ ๋ถ์ฐ
โ ์ค์น ํ์ธ:
kubectl get pods -n argocd
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 2m
argocd-application-controller-1 1/1 Running 0 2m
argocd-repo-server-0 1/1 Running 0 2m
argocd-repo-server-1 1/1 Running 0 2m
argocd-redis-ha-server-0 1/1 Running 0 2m
argocd-redis-ha-server-1 1/1 Running 0 2m
argocd-server-0 1/1 Running 0 2m
argocd-server-1 1/1 Running 0 2m
โ 2. Redis HA ๊ตฌ์ฑ (์ธ์ ์ ์ง ๋ฐ ์บ์ฑ ๊ฐ์ )
Argo CD๋ Redis๋ฅผ ์ฌ์ฉํ์ฌ ์ธ์ ๋ฐ ์บ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ฏ๋ก, ๊ณ ๊ฐ์ฉ์ฑ์ ์ํด Redis HA ๋ชจ๋๋ฅผ ํ์ฑํํด์ผ ํฉ๋๋ค.
โ Redis HA ํ์ฑํ:
kubectl edit configmap argocd-cm -n argocd
โ ์ค์ ์ถ๊ฐ:
data:
redis.enabled: "true"
โ ์ ์ฉ ํ Redis ์ํ ํ์ธ:
kubectl get pods -n argocd -l app.kubernetes.io/name=redis-ha
โ 3. PostgreSQL ์ธ๋ถ DB ์ฐ๋ (์ ํ ์ฌํญ)
๊ธฐ๋ณธ์ ์ผ๋ก Argo CD๋ ๋ด๋ถ SQLite๋ฅผ ์ฌ์ฉํ์ง๋ง, HA ํ๊ฒฝ์์๋ PostgreSQL์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ถ์ฅ๋ฉ๋๋ค.
โ PostgreSQL ์ฐ๋์ ์ํ Secret ์์ฑ
apiVersion: v1
kind: Secret
metadata:
name: argocd-postgres-config
namespace: argocd
stringData:
host: "postgres.example.com"
database: "argocd"
username: "argocd"
password: "securepassword"
โ PostgreSQL ์ฐ๊ฒฐ ์ค์ (argocd-cm ์์ )
data:
configManagementPlugins: |
db.host=postgres.example.com
db.name=argocd
db.user=argocd
db.passwordFromSecret=argocd-postgres-config
โ PostgreSQL ์ ์ฉ ํ Argo CD ์ฌ์์:
kubectl rollout restart deployment argocd-server -n argocd
๐น Argo CD HA ๋ชจ๋ ์ด์ ํ
โ
1. Ingress๋ฅผ ํ์ฉํ API ์๋ฒ ๋ถํ ๋ถ์ฐ
HA ํ๊ฒฝ์์๋ Argo CD API ์๋ฒ ์์ Ingress ๋๋ LoadBalancer๋ฅผ ๋ฐฐ์นํ์ฌ ํธ๋ํฝ์ ๋ถ์ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
โ
2. ์ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ ๋ก๊น
ํ์ฑํ
Argo CD ์ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ์ ๋์์ ๋ชจ๋ํฐ๋งํ๋ ค๋ฉด ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
kubectl logs -f -l app.kubernetes.io/name=argocd-application-controller -n argocd
โ
3. ์ํ ํ์ธ ๋ฐ ํธ๋ฌ๋ธ์ํ
HA ํ๊ฒฝ์์ Argo CD ์ํ๋ฅผ ํ์ธํ๋ ค๋ฉด ๋ค์ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํฉ๋๋ค.
kubectl get pods -n argocd -o wide
kubectl get svc -n argocd
kubectl get endpoints -n argocd
๐น Argo CD HA ์ด์์ ์ํ CLI ๋ช ๋ น์ด ์ ๋ฆฌ
๋ช ๋ น์ด | ์ค๋ช |
kubectl get pods -n argocd | Argo CD ์คํ ์ํ ํ์ธ |
kubectl get svc -n argocd | Argo CD ์๋น์ค ๋ชฉ๋ก ํ์ธ |
kubectl edit configmap argocd-cm -n argocd | Argo CD ์ค์ ์์ |
kubectl rollout restart deployment argocd-server -n argocd | Argo CD ์๋ฒ ์ฌ์์ |
kubectl logs -f -l app.kubernetes.io/name=argocd-application-controller -n argocd | ์ปจํธ๋กค๋ฌ ๋ก๊ทธ ํ์ธ |
๐น ๊ฒฐ๋ก : ์ด๋ฒ ๊ธ์์ ๋ฐฐ์ด ํต์ฌ ๋ด์ฉ ์ ๋ฆฌ
๐ข Argo CD HA ๋ชจ๋๋ฅผ ๊ตฌ์ฑํ๋ฉด ์ฅ์ ๋ฐ์ ์์๋ ์๋น์ค๊ฐ ์ค๋จ๋์ง ์๊ณ ์ง์์ ์ผ๋ก ์ด์ ๊ฐ๋ฅ
๐ข Helm์ ์ฌ์ฉํ์ฌ Argo CD๋ฅผ HA ๋ชจ๋๋ก ๋ฐฐํฌ ๊ฐ๋ฅํ๋ฉฐ, Redis ๋ฐ PostgreSQL ์ฐ๋์ผ๋ก ์์ ์ฑ์ ํฅ์ ๊ฐ๋ฅ
๐ข Ingress ๋๋ LoadBalancer๋ฅผ ํ์ฉํ์ฌ Argo CD API ์๋ฒ์ ํธ๋ํฝ์ ํจ์จ์ ์ผ๋ก ๋ถ์ฐ ๊ฐ๋ฅ
๐ข ์ ํ๋ฆฌ์ผ์ด์
์ปจํธ๋กค๋ฌ, Repo Server, Redis๋ฅผ ๋ค์คํํ์ฌ ํ์ฅ์ฑ๊ณผ ์์ ์ฑ์ ํ๋ณดํ ์ ์์