๐น GitOps์ ํต์ฌ ์์น
GitOps๋ ๋จ์ํ Git์ ํ์ฉํ ๋ฐฐํฌ ๋ฐฉ์์ด ์๋๋ผ, Kubernetes์์ CI/CD๋ฅผ ์๋ํํ๋ ์ด์ ๋ชจ๋ธ์
๋๋ค.
GitOps ๋ฐฉ์์ด ํจ๊ณผ์ ์ผ๋ก ์๋ํ๋ ค๋ฉด ๋ฐ๋์ 4๊ฐ์ง ํต์ฌ ์์น์ ๋ฐ๋ผ์ผ ํฉ๋๋ค.
โ 1. ์ ์ธ์ (Declarative) ๊ตฌ์ฑ
GitOps์์๋ ๋ชจ๋ ์ธํ๋ผ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ธ์ (Declarative) ๋ฐฉ์์ผ๋ก ์ ์ํด์ผ ํฉ๋๋ค.
- ์ ์ธ์ ๋ฐฉ์์ด๋, "์ด๋ ๊ฒ ๋์ด์ผ ํ๋ค" ๋ผ๋ ์ต์ข ์ํ๋ฅผ ์ ์ํ๋ ๋ฐฉ์์ ๋๋ค.
- Kubernetes์ Deployment, Service, ConfigMap, Secret ๋ฑ ๋ชจ๋ ๋ฆฌ์์ค๋ฅผ YAML ํ์ผ๋ก ์ ์ธํฉ๋๋ค.
- Git ์ ์ฅ์์ ์ ์ธ๋ YAML ํ์ผ์ ๋ณ๊ฒฝํ๋ฉด, ์๋์ผ๋ก Kubernetes ํด๋ฌ์คํฐ๊ฐ ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
# ์ ์ธ์ ๋ฐฉ์ ์์ (Deployment ์ ์)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
namespace: default
spec:
replicas: 3 # ํญ์ 3๊ฐ์ Pod์ ์ ์งํ๋๋ก ์ ์ธ
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:v1.0
๐น ๋ช ๋ นํ vs ์ ์ธํ ๋น๊ต
๋น๊ต ํญ๋ชฉ ๋ช ๋ นํ (Imperative) ์ ์ธํ (Declarative)
๋ฐฉ์ | kubectl ๋ช ๋ น์ด ์ง์ ์คํ | YAML ํ์ผ๋ก ์ํ๋ ์ํ ์ ์ธ |
๋ณ๊ฒฝ ์ ์ฉ | ์ด์์๊ฐ ์ง์ ์คํํด์ผ ์ ์ฉ๋จ | Git์์ ๋ณ๊ฒฝํ๋ฉด ์๋ ์ ์ฉ |
๋กค๋ฐฑ | ์ด์ ์ํ๋ฅผ ๊ธฐ์ตํ๊ธฐ ์ด๋ ค์ | Git์์ ํน์ ์ปค๋ฐ์ผ๋ก ์ฝ๊ฒ ๋กค๋ฐฑ ๊ฐ๋ฅ |
์ผ๊ด์ฑ | ์ฌ๋์ด ์ง์ ์คํํด์ผ ํ๋ฏ๋ก ๋ถ์์ | Git์ ์ ์ฅ๋ ์ํ์ ํญ์ ์ผ์น |
GitOps์์๋ Kubernetes์ ์ ์ธ์ ๊ตฌ์ฑ ๋ฐฉ์์ ํ์ฉํ์ฌ Git์ ๋ณ๊ฒฝ ์ฌํญ์ด ๊ณง ์ด์ ํ๊ฒฝ์ ๋ณ๊ฒฝ ์ฌํญ์ด ๋๋๋ก ํฉ๋๋ค.
โ 2. Git์ ๋จ์ผ ์ ๋ขฐ ์์ฒ(Single Source of Truth)์ผ๋ก ํ์ฉ
GitOps์์๋ Git ์ ์ฅ์๊ฐ ์ด์ ํ๊ฒฝ์ ๋จ์ผ ์ ๋ขฐ ์์ฒ์ด ๋ฉ๋๋ค.
์ฆ, Git ์ ์ฅ์์ ์ ์ฅ๋ ์ํ๊ฐ Kubernetes ํด๋ฌ์คํฐ์ ํ์ฌ ์ํ์ ํญ์ ์ผ์นํด์ผ ํฉ๋๋ค.
๐น GitOps์์ Git์ ์ญํ
- Git์ ์ ์ฅ๋ ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐฐํฌ์ ์ฐ๋๋จ
- Git์ ์ปค๋ฐ ๋ก๊ทธ๋ฅผ ํตํด ๋ณ๊ฒฝ ์ด๋ ฅ์ ์ถ์ ํ ์ ์์
- Git ๋ธ๋์น ๋ฐ PR(Pull Request) ์ํฌํ๋ก์ฐ๋ฅผ ํ์ฉํ์ฌ ๋ฐฐํฌ ์์ ์ฑ์ ๊ฐํ
# GitOps ๋ฐฉ์์ ๋ฐฐํฌ ์์
git add .
git commit -m "Update deployment to v1.1"
git push origin main
- GitOps๋ฅผ ํ์ฉํ๋ฉด git push๋ง์ผ๋ก ๋ฐฐํฌ๊ฐ ์๋ํ๋ฉ๋๋ค.
- ์ด์์๋ kubectl ๋ช ๋ น์ ์ง์ ์คํํ ํ์๊ฐ ์์ต๋๋ค.
- GitOps ๋๊ตฌ(์: Argo CD)๊ฐ ์๋์ผ๋ก Git ์ํ๋ฅผ ๊ฐ์งํ๊ณ Kubernetes ํด๋ฌ์คํฐ๋ฅผ ์ ๋ฐ์ดํธํฉ๋๋ค.
โ 3. ์๋ ๋๊ธฐํ(Automated Syncing) ๋ฐ ์ง์์ ์ธ ๊ฒ์ฆ(Continuous Reconciliation)
GitOps ๋ฐฉ์์์๋ Kubernetes ํด๋ฌ์คํฐ๊ฐ Git ์ ์ฅ์์ ์ํ์ ํญ์ ๋๊ธฐํ(Automated Sync)๋๋๋ก ๋ณด์ฅํด์ผ ํฉ๋๋ค.
์ด๋ฅผ ์ํด GitOps ๋๊ตฌ(Argo CD ๋ฑ)๋ Git ์ ์ฅ์๋ฅผ ์ง์์ ์ผ๋ก ๊ฐ์ํ๊ณ , ๋ณ๊ฒฝ ์ฌํญ์ด ๊ฐ์ง๋๋ฉด ์๋์ผ๋ก Kubernetes ํ๊ฒฝ์ ์
๋ฐ์ดํธํฉ๋๋ค.
๐น GitOps ์๋ ๋๊ธฐํ ๊ณผ์
1๏ธโฃ ์ด์์๊ฐ Git ์ ์ฅ์์์ YAML ํ์ผ ๋ณ๊ฒฝ ํ ์ปค๋ฐ(Push)
2๏ธโฃ GitOps ๋๊ตฌ(Argo CD)๊ฐ Git ์ ์ฅ์์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์ง
3๏ธโฃ ๋ณ๊ฒฝ๋ YAML ํ์ผ์ Kubernetes ํด๋ฌ์คํฐ์ ์๋ ์ ์ฉ
4๏ธโฃ Kubernetes ํด๋ฌ์คํฐ๊ฐ ์ ์ธ๋ ์ํ์ ์ผ์นํ๋๋ก ์กฐ์
syncPolicy:
automated:
prune: true # ๋ถํ์ํ ๋ฆฌ์์ค ์๋ ์ญ์
selfHeal: true # Kubernetes ๋ฆฌ์์ค ๋ณ๊ฒฝ ์ ์๋ ์ํ๋ก ๋ณต๊ตฌ
- prune: true → Git์ ์๋ ๋ฆฌ์์ค๋ ์๋ ์ญ์
- selfHeal: true → Kubernetes ๋ฆฌ์์ค๊ฐ ์๋ ๋ณ๊ฒฝ๋๋ฉด ์๋ ๋ณต๊ตฌ
์๋ ๋๊ธฐํ๋ฅผ ํตํด Git๊ณผ Kubernetes ์ํ๊ฐ **๋ถ์ผ์นํ ๊ฒฝ์ฐ ์๋์ผ๋ก ๋ณต๊ตฌ(Self-Healing)**๋ฉ๋๋ค.
โ 4. ๊ฐ์ฌ ๊ฐ๋ฅ(Auditability) ๋ฐ ์์ฌ์ด ๋กค๋ฐฑ(Rollback)
GitOps์ ๊ฐ์ฅ ํฐ ์ฅ์ ์ค ํ๋๋ Git ์ปค๋ฐ ํ์คํ ๋ฆฌ๋ฅผ ํ์ฉํ์ฌ ๋ฐฐํฌ ์ด๋ ฅ์ ์ถ์ ํ๊ณ , ์ฝ๊ฒ ๋กค๋ฐฑํ ์ ์๋ค๋ ์ ์ ๋๋ค.
๐น GitOps ๋ฐฉ์์ ๋กค๋ฐฑ ์๋ฆฌ
- Git์ ์ปค๋ฐ ํ์คํ ๋ฆฌ๋ฅผ ํ์ฉํ๋ฉด ํน์ ์์ ์ ์ค์ ์ ์ธ์ ๋ ์ง ๋ณต๊ตฌํ ์ ์์ต๋๋ค.
- ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ฉด ์ด์ ์ปค๋ฐ์ผ๋ก ๋๋๋ฆฌ๋ ๊ฒ๋ง์ผ๋ก Kubernetes ํด๋ฌ์คํฐ๋ฅผ ์๋ ์ํ๋ก ๋ณต๊ตฌํ ์ ์์ต๋๋ค.
# GitOps ๋ฐฉ์์ ๋กค๋ฐฑ ์์
git revert HEAD # ๊ฐ์ฅ ์ต๊ทผ ๋ณ๊ฒฝ ์ฌํญ ๋กค๋ฐฑ
git push origin main # ๋ณ๊ฒฝ ์ฌํญ์ ๋ค์ Git์ ์ ์ฉ
Argo CD ๊ฐ์ GitOps ๋๊ตฌ๋ ์๋์ผ๋ก ์ด์ ์ํ๋ก ๋ณต๊ตฌํ๋ฉฐ,
์ด์์๋ ์ถ๊ฐ์ ์ธ kubectl ๋ช
๋ น์ด ์คํ ์์ด Git ์ปค๋ฐ๋ง์ผ๋ก ๋กค๋ฐฑ์ด ๊ฐ๋ฅํฉ๋๋ค.
๐น GitOps์ ์ค์ ํ์ฉ: Kubernetes์์ ์ด๋ป๊ฒ ์ ์ฉํ ๊น?
GitOps์ 4๊ฐ์ง ์์น์ Kubernetes ํ๊ฒฝ์์ ์ด๋ป๊ฒ ์คํํ ์ ์๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค.
โ GitOps ํ์ฉ์ ์ํ ํ์ ์์
์์ ์ญํ
Git ์ ์ฅ์ | ๋ชจ๋ ๋ฐฐํฌ ๋ฐ ์ธํ๋ผ ์ค์ ์ ์ ์ฅํ๋ ๊ณณ |
GitOps ๋๊ตฌ (Argo CD) | Git๊ณผ Kubernetes์ ๋๊ธฐํ๋ฅผ ๋ด๋น |
Kubernetes ํด๋ฌ์คํฐ | GitOps๋ฅผ ์ ์ฉํ ์ค์ ํ๊ฒฝ |
โ GitOps ๋ฐฉ์์ Kubernetes ๋ฐฐํฌ ํ๋ฆ
1๏ธโฃ Git ์ ์ฅ์์์ ์ ์ธ์ YAML ์์ฑ
2๏ธโฃ Argo CD๊ฐ Git ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์งํ์ฌ ์๋ ๋๊ธฐํ ์ํ
3๏ธโฃ Kubernetes ํด๋ฌ์คํฐ๊ฐ Git๊ณผ ์ผ์นํ๋ ์ํ๋ก ์ ์ง
# GitOps๋ฅผ ํ์ฉํ ๋ฐฐํฌ ๊ณผ์
git add deployment.yaml
git commit -m "Update my-app to v1.2"
git push origin main
Git์ ํธ์ํ๋ ๊ฒ๋ง์ผ๋ก ๋ฐฐํฌ, ๋ณ๊ฒฝ, ๋กค๋ฐฑ์ด ์๋์ผ๋ก ์ํ๋ฉ๋๋ค.
๐น ๊ฒฐ๋ก : ์ด๋ฒ ๊ธ์์ ๋ฐฐ์ด ํต์ฌ ๋ด์ฉ ์ ๋ฆฌ
๐ข GitOps๋ ์ ์ธ์ ๊ตฌ์ฑ, Git ๊ธฐ๋ฐ ๋ณ๊ฒฝ ๊ด๋ฆฌ, ์๋ ๋๊ธฐํ, ๊ฐ์ฌ ๊ฐ๋ฅ์ฑ์ ํต์ฌ ์์น์ผ๋ก ์ผ์
๐ข Git์ ๋จ์ผ ์ ๋ขฐ ์์ฒ์ผ๋ก ์ฌ์ฉํ์ฌ Kubernetes ์ํ๋ฅผ ์๋์ผ๋ก ๋๊ธฐํ
๐ข Argo CD ๊ฐ์ GitOps ๋๊ตฌ๋ฅผ ํ์ฉํ๋ฉด ๋ฐฐํฌ๋ฅผ ์๋ํํ๊ณ , Kubernetes ํ๊ฒฝ์ ํญ์ Git๊ณผ ์ผ์นํ๋๋ก ์ ์ง ๊ฐ๋ฅ
๐ข Git ์ปค๋ฐ ๊ธฐ๋ฐ ๋กค๋ฐฑ์ด ๊ฐ๋ฅํ์ฌ ์ด์ ๋ถ๋ด์ ์ค์ด๊ณ ์ ๋ขฐ์ฑ์ ๋์