[Daily morning study] GitOps์ ArgoCD ๊ฐ๋
#daily morning study
GitOps๋
GitOps๋ Git์ ์ธํ๋ผ์ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ์ ๋จ์ผ ์ง์ค ์์ค(Single Source of Truth)๋ก ์ผ๋ ์ด์ ๋ฐฉ์์ด๋ค. ์ฝ๊ฒ ๋งํ๋ฉด, โGit์ ์๋ ๊ฒ์ด ๊ณง ์ค์ ์์คํ ์ ์ํ์ฌ์ผ ํ๋คโ๋ ์์น์ด๋ค.
2017๋ Weaveworks๊ฐ ์ฒ์ ์ ์ํ ๊ฐ๋ ์ผ๋ก, ๋ค์ ๋ค ๊ฐ์ง ์์น์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ค.
| ์์น | ์ค๋ช |
|---|---|
| ์ ์ธ์ (Declarative) | ์ธํ๋ผ์ ์ฑ ์ํ๋ฅผ ์ฝ๋๋ก ์ ์ธ์ ์ผ๋ก ๊ธฐ์ |
| ๋ฒ์ ๊ด๋ฆฌ | ๋ชจ๋ ๋ณ๊ฒฝ ์ด๋ ฅ์ด Git์ ๊ธฐ๋ก๋จ |
| ์๋ ์ ์ฉ | Git ๋ณ๊ฒฝ ์ฌํญ์ด ์๋์ผ๋ก ์์คํ ์ ๋ฐ์ |
| ์ง์์ ๋๊ธฐํ | ์ค์ ์์คํ ์ํ์ Git ์ํ๋ฅผ ์ง์์ ์ผ๋ก ๋น๊ตยท๊ต์ |
GitOps vs ๊ธฐ์กด CI/CD
๊ธฐ์กด CI/CD ํ์ดํ๋ผ์ธ์ ๋ณดํต Push ๋ฐฉ์์ด๋ค. ์ฝ๋๊ฐ ํธ์๋๋ฉด CI ์๋ฒ๊ฐ ๋น๋ํ๊ณ , ์ง์ ํด๋ฌ์คํฐ์ ๋ฐฐํฌ ๋ช ๋ น์ ์คํํ๋ค.
[Git Push] โ [CI ์๋ฒ: ๋น๋/ํ
์คํธ] โ [kubectl apply] โ [k8s ํด๋ฌ์คํฐ]
GitOps๋ Pull ๋ฐฉ์์ผ๋ก ๋์ํ๋ค. ํด๋ฌ์คํฐ ๋ด๋ถ์ ์์ด์ ํธ๊ฐ Git์ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฐ์ํ๋ค๊ฐ, ์ฐจ์ด(diff)๊ฐ ์๊ธฐ๋ฉด ์ค์ค๋ก ๋๊ธฐํํ๋ค.
[Git Push] โ [CI ์๋ฒ: ๋น๋/์ด๋ฏธ์ง ํธ์] โ [Git ๋งค๋ํ์คํธ ์
๋ฐ์ดํธ]
โ
[์์ด์ ํธ๊ฐ diff ๊ฐ์ง ํ Pull & Apply]
ํต์ฌ ์ฐจ์ด์
- ๊ธฐ์กด ๋ฐฉ์: CI ์๋ฒ๊ฐ ํด๋ฌ์คํฐ์ ์ง์ ์ ๊ทผ(Push)ํด์ ๋ฐฐํฌ
- GitOps: ํด๋ฌ์คํฐ ์์ ์์ด์ ํธ๊ฐ Git์ Pullํด์ ์ค์ค๋ก ๋ฐ์
์ด ์ฐจ์ด ๋๋ถ์ ํด๋ฌ์คํฐ ์ธ๋ถ์์ ์ง์ ์ ๊ทผํ๋ ์๊ฒฉ์ฆ๋ช ์ CI ์๋ฒ์ ์ค ํ์๊ฐ ์์ด ๋ณด์์ด ํฅ์๋๋ค.
ArgoCD๋
ArgoCD๋ Kubernetes๋ฅผ ์ํ GitOps ๊ธฐ๋ฐ ์ง์์ ๋ฐฐํฌ(Continuous Delivery) ๋๊ตฌ๋ค.
Git ๋ฆฌํฌ์งํ ๋ฆฌ์ ์ ์๋ Kubernetes ๋งค๋ํ์คํธ(YAML)๋ฅผ ์ค์ ํด๋ฌ์คํฐ ์ํ์ ์ง์์ ์ผ๋ก ๋น๊ตํด์, ์ฐจ์ด๊ฐ ์๊ธฐ๋ฉด ์๋ ๋๋ ์๋์ผ๋ก ๋๊ธฐํํ๋ค.
์ฃผ์ ํน์ง
- ์ ์ธ์ ์ค์ : ๋ฐฐํฌํ ์ฑ์ ์์ค(Git URL, ๊ฒฝ๋ก)์ ๋์ ํด๋ฌ์คํฐ๋ฅผ ArgoCD Application ๋ฆฌ์์ค๋ก ์ ์ธ
- ์ค์๊ฐ ์ํ ํ์ธ: ์น UI์์ ์ฑ์ ํ์ฌ ๋ฐฐํฌ ์ํ, ๋ฆฌ์์ค ํธ๋ฆฌ๋ฅผ ์๊ฐ์ ์ผ๋ก ํ์ธ ๊ฐ๋ฅ
- ์๋/์๋ ๋๊ธฐํ: ์๋ ๋๊ธฐํ ์ค์ ์ Git ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ๋ก ํด๋ฌ์คํฐ์ ๋ฐ์
- ๋กค๋ฐฑ: Git ํ์คํ ๋ฆฌ๊ฐ ๊ณง ๋ฐฐํฌ ์ด๋ ฅ์ด๋ฏ๋ก, ์ํ๋ ์ปค๋ฐ์ผ๋ก ๊ฐ๋จํ ๋กค๋ฐฑ ๊ฐ๋ฅ
- ๋ฉํฐ ํด๋ฌ์คํฐ: ๋จ์ผ ArgoCD ์ธ์คํด์ค๋ก ์ฌ๋ฌ Kubernetes ํด๋ฌ์คํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์์
ArgoCD ํต์ฌ ๊ฐ๋
Application
ArgoCD์์ ๋ฐฐํฌ ๋จ์๋ฅผ Application์ด๋ผ ๋ถ๋ฅธ๋ค. ๋ค์ ์ ๋ณด๋ฅผ ๋ด๋๋ค.
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: my-app
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/my-org/my-app-config
targetRevision: HEAD
path: k8s/overlays/production
destination:
server: https://kubernetes.default.svc
namespace: production
syncPolicy:
automated:
prune: true # Git์์ ์ญ์ ๋ ๋ฆฌ์์ค๋ ํด๋ฌ์คํฐ์์๋ ์ญ์
selfHeal: true # ํด๋ฌ์คํฐ ์ํ๊ฐ ์๋์ผ๋ก ๋ฐ๋์ด๋ Git ์ํ๋ก ๋ณต์
Sync ์ํ
ArgoCD๋ Application์ ์ํ๋ฅผ ํญ์ ๋ ๊ฐ์ง๋ก ํ์ํ๋ค.
| ์ํ | ์ค๋ช |
|---|---|
| Synced | Git ์ํ = ํด๋ฌ์คํฐ ์ค์ ์ํ (์ ์) |
| OutOfSync | Git ์ํ โ ํด๋ฌ์คํฐ ์ค์ ์ํ (๋๊ธฐํ ํ์) |
Health ์ํ
| ์ํ | ์ค๋ช |
|---|---|
| Healthy | ๋ชจ๋ ๋ฆฌ์์ค๊ฐ ์ ์ ๋์ ์ค |
| Degraded | ์ผ๋ถ ๋ฆฌ์์ค๊ฐ ์ค๋ฅ ์ํ |
| Progressing | ๋ฐฐํฌ ์งํ ์ค |
| Missing | ๋ฆฌ์์ค๊ฐ ํด๋ฌ์คํฐ์ ์กด์ฌํ์ง ์์ |
ArgoCD ๋์ ํ๋ฆ
1. ๊ฐ๋ฐ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋ ๋ณ๊ฒฝ โ CI์์ ๋น๋ ํ Docker ์ด๋ฏธ์ง ํธ์
2. CI ๋๋ ๊ฐ๋ฐ์๊ฐ Git ๋งค๋ํ์คํธ ๋ฆฌํฌ์งํ ๋ฆฌ์ image ํ๊ทธ ์
๋ฐ์ดํธ
3. ArgoCD๊ฐ ์ฃผ๊ธฐ์ ์ผ๋ก(๊ธฐ๋ณธ 3๋ถ) ๋๋ webhook์ผ๋ก Git ๋ณ๊ฒฝ ๊ฐ์ง
4. Git ์ํ์ ํด๋ฌ์คํฐ ์ํ ๋น๊ต โ OutOfSync ๊ฐ์ง
5. ์๋ ๋๊ธฐํ ์ค์ ์ ์๋์ผ๋ก kubectl apply, ์๋์ด๋ฉด ๋๊ธฐ
6. ๋ฐฐํฌ ์๋ฃ ํ Synced + Healthy ์ํ๋ก ์ ํ
Kustomize / Helm ์ฐ๋
ArgoCD๋ raw YAML๋ฟ ์๋๋ผ Kustomize์ Helm์ ๊ธฐ๋ณธ ์ง์ํ๋ค.
Helm ์์
source:
repoURL: https://charts.bitnami.com/bitnami
chart: redis
targetRevision: 17.x.x
helm:
values: |
auth:
enabled: false
replica:
replicaCount: 2
Kustomize ์์
source:
repoURL: https://github.com/my-org/my-app-config
path: k8s/overlays/staging
targetRevision: HEAD
kustomize:
images:
- my-app=my-registry/my-app:v1.2.3
ArgoCD ์ค์น (๊ฐ๋จ ์์ฝ)
# argocd ๋ค์์คํ์ด์ค ์์ฑ ํ ์ค์น
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
# ์ด๊ธฐ admin ๋น๋ฐ๋ฒํธ ํ์ธ
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath="{.data.password}" | base64 -d
# ArgoCD CLI ๋ก๊ทธ์ธ
argocd login <ARGOCD_SERVER>
GitOps ๋ฆฌํฌ์งํ ๋ฆฌ ๊ตฌ์กฐ ํจํด
GitOps๋ฅผ ๋์ ํ ๋ ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ๊ตฌ์ฑํ ์ง๊ฐ ์ค์ํ๋ค.
๋ชจ๋ ธ๋ ํฌ ๋ฐฉ์
my-gitops-repo/
โโโ apps/
โ โโโ frontend/
โ โ โโโ deployment.yaml
โ โ โโโ service.yaml
โ โโโ backend/
โ โโโ deployment.yaml
โ โโโ service.yaml
โโโ infra/
โโโ namespaces.yaml
โโโ ingress.yaml
๋ฉํฐ๋ ํฌ ๋ฐฉ์
app-source-repo/ โ ์ ํ๋ฆฌ์ผ์ด์
์์ค ์ฝ๋ (CI๊ฐ ์ด๋ฏธ์ง ๋น๋)
app-config-repo/ โ Kubernetes ๋งค๋ํ์คํธ๋ง (ArgoCD๊ฐ ๊ฐ์)
๋ฉํฐ๋ ํฌ ๋ฐฉ์์ด ๋ ํํ ์ฌ์ฉ๋๋ค. ์์ค ์ฝ๋ ๋ณ๊ฒฝ๊ณผ ๋ฐฐํฌ ์ค์ ๋ณ๊ฒฝ์ ๋ถ๋ฆฌํ ์ ์๊ณ , ๋๊ฐ ์ธ์ ๋ฐฐํฌ ์ค์ ์ ๋ณ๊ฒฝํ๋์ง ์ถ์ ์ด ์ฝ๋ค.
GitOps์ ์ฅ์ ์ ๋ฆฌ
- ๊ฐ์ฌ ์ถ์ (Audit Trail): ๋ชจ๋ ๋ณ๊ฒฝ์ด Git ์ปค๋ฐ์ผ๋ก ๋จ์ โ๋๊ฐ, ์ธ์ , ๋ฌด์์โ ๋ฐ๊ฟจ๋์ง ๋ช ํ
- ๋กค๋ฐฑ ์ฉ์ด:
git revert๋๋ ์ด์ ์ปค๋ฐ์ผ๋ก ์ฒดํฌ์์ํ๋ฉด ์ฆ์ ์ด์ ์ํ๋ก ๋ณต์ - ๋๋ฆฌํํธ ๋ฐฉ์ง: ๋๊ตฐ๊ฐ ํด๋ฌ์คํฐ๋ฅผ ์๋์ผ๋ก ๊ฑด๋๋ ค๋
selfHeal์ด Git ์ํ๋ก ๋๋๋ฆผ - ๋ณด์ ํฅ์: CI ์๋ฒ๊ฐ ํด๋ฌ์คํฐ์ ์ง์ ์ ๊ทผํ ์๊ฒฉ์ฆ๋ช ์ด ํ์ ์์
- ํ์ ์นํ์ : Pull Request ๊ธฐ๋ฐ์ผ๋ก ๋ฐฐํฌ ๋ณ๊ฒฝ์ ๋ฆฌ๋ทฐํ๊ณ ์น์ธํ ์ ์์
์ ๋ฆฌ
GitOps = โGit์ด ๊ณง ๋ฐฐํฌ ์ํโ๋ผ๋ ์์น. ArgoCD๋ ๊ทธ ์์น์ Kubernetes์์ ๊ตฌํํ๋ ๋๊ตฌ๋ค. ์ฝ๋ ๋ฐฐํฌ๋ฟ ์๋๋ผ ํด๋ฌ์คํฐ ์ค์ , RBAC, ๋ค์์คํ์ด์ค ์์ฑ ๊ฐ์ ์ธํ๋ผ ๋ณ๊ฒฝ๋ Git์ ํตํด ๊ด๋ฆฌํ ์ ์์ด์, ๋๊ท๋ชจ Kubernetes ์ด์ ํ๊ฒฝ์์ ์ฌ์ค์ ํ์ค์ฒ๋ผ ์ฐ์ด๊ณ ์๋ค.