๐น GitOps๋ ๋ฌด์์ธ๊ฐ?
โ GitOps์ ์ ์
GitOps๋ ์ ํ๋ฆฌ์ผ์ด์
๋ฐ ์ธํ๋ผ๋ฅผ Git ์ ์ฅ์๋ฅผ ๋จ์ผ ์ ๋ขฐ ์์ฒ(Single Source of Truth)์ผ๋ก ์ผ์ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ์ด์ ๋ฐฉ์์
๋๋ค.
์ฆ, Kubernetes ํ๊ฒฝ์์ Git์ ์ ์ฅ๋ ์ ์ธ์ (Declarative) ์ค์ ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฐฐํฌ์ ์ด์์ ์๋ํํ๋ ๋ฐฉ๋ฒ๋ก ์
๋๋ค.
โ GitOps์ ํต์ฌ ๋ชฉํ
1๏ธโฃ Git ์ ์ฅ์๋ฅผ ๋จ์ผ ์ด์ ์์ฒ์ผ๋ก ์ฌ์ฉ → ๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ด Git์์ ๊ด๋ฆฌ๋จ
2๏ธโฃ ์ ์ธ์ (Declarative) ๋ฐฉ์์ผ๋ก ์ธํ๋ผ ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
์ค์ ๊ด๋ฆฌ
3๏ธโฃ ์๋ํ๋ ๋๊ธฐํ ๋ฐ ๋ฐฐํฌ → Git์ ๋ณ๊ฒฝ ์ฌํญ์ด ์๋์ผ๋ก Kubernetes์ ์ ์ฉ๋จ
4๏ธโฃ ๊ฐ์ฌ ๊ฐ๋ฅ(Auditability) ๋ฐ ๋กค๋ฐฑ ์ง์ → Git ์ปค๋ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๊ณผ๊ฑฐ ์ํ๋ก ๋ณต๊ตฌ ๊ฐ๋ฅ
GitOps๋ Kubernetes ํ๊ฒฝ์์ CI/CD๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ธ ๊ฐ๋ ์ด๋ฉฐ, Argo CD ๊ฐ์ ๋๊ตฌ๋ฅผ ํ์ฉํ๋ฉด ์ด๋ฅผ ์ฝ๊ฒ ์ ์ฉํ ์ ์์ต๋๋ค.
๐น ๊ธฐ์กด Kubernetes ๋ฐฐํฌ ๋ฐฉ์๊ณผ GitOps ๋ฐฉ์ ๋น๊ต
Kubernetes์ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์๋ ํฌ๊ฒ ๋ช
๋ นํ(Imperative) ๋ฐฉ์๊ณผ ์ ์ธํ(Declarative) ๋ฐฉ์์ด ์์ต๋๋ค.
GitOps๋ ์ ์ธํ ๋ฐฉ์์ ๊ฐ์ ์ ๊ทน๋ํํ์ฌ CI/CD๋ฅผ ์๋ํํ๋ ์ ๊ทผ๋ฒ์
๋๋ค.
โ ๊ธฐ์กด Kubernetes ๋ฐฐํฌ ๋ฐฉ์ (๋ช ๋ นํ ๋ฐฉ์)
๐น ๋ช ๋ นํ(Imperative) ๋ฐฐํฌ ๋ฐฉ์์ด๋?
- ์ด์์๊ฐ kubectl apply ๋ฑ์ ๋ช ๋ น์ด๋ฅผ ์ง์ ์คํํ์ฌ ๋ฆฌ์์ค๋ฅผ ๋ฐฐํฌ
- ํน์ ์ํ๋ฅผ ์ ์งํ๊ธฐ ์ํด ์ฌ๋์ด ์ง์ ํด๋ฌ์คํฐ๋ฅผ ๊ด๋ฆฌํด์ผ ํจ
- ๋ณ๊ฒฝ ์ฌํญ์ด Kubernetes ํด๋ฌ์คํฐ์์ ์ฆ๊ฐ ์ ์ฉ๋์ง๋ง, ๊ธฐ๋ก์ด ๋จ์ง ์์
๐น ๋ช
๋ นํ ๋ฐฉ์์ ๋ฌธ์ ์
โ ๋ณ๊ฒฝ ์ด๋ ฅ ๊ด๋ฆฌ๊ฐ ์ด๋ ค์ → ์ด๋ค ์ค์ ์ด ์ ์ฉ๋์๋์ง ์ถ์ ๋ถ๊ฐ๋ฅ
โ ์ด์์์ ์ค์ ๊ฐ๋ฅ์ฑ → ์ฌ๋์ด ์ง์ ์คํํด์ผ ํ๋ฏ๋ก ์ค์ ๊ฐ๋ฅ์ฑ์ด ๋์
โ ์๋ํ ๋ถ์กฑ → ์ง์์ ์ธ ์ด์ ๋ฐ ์ ์ง๋ณด์์ ๋ง์ ์๊ฐ์ด ํ์
# ๋ช
๋ นํ ๋ฐฉ์ ์์ (kubectl ๋ช
๋ น์ด ์คํ)
kubectl apply -f deployment.yaml
kubectl scale deployment my-app --replicas=3
kubectl delete pod my-pod
โ GitOps ๊ธฐ๋ฐ Kubernetes ๋ฐฐํฌ ๋ฐฉ์ (์ ์ธํ ๋ฐฉ์)
๐น ์ ์ธํ(Declarative) ๋ฐฐํฌ ๋ฐฉ์์ด๋?
- Git ์ ์ฅ์์ Kubernetes ๋งค๋ํ์คํธ๋ฅผ ์ ์ฅํ๊ณ , ๋ณ๊ฒฝ ์ฌํญ์ ์๋์ผ๋ก ํด๋ฌ์คํฐ์ ์ ์ฉ
- ์ด์์๋ Git์์ ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ๋ ๊ฒ๋ง์ผ๋ก Kubernetes ์ํ๋ฅผ ์กฐ์ ๊ฐ๋ฅ
- CI/CD์ ์ฐ๊ณํ์ฌ ์๋ํ๋ ๋ฐฐํฌ ๋ฐ ๋กค๋ฐฑ ์ง์
๐น GitOps ๋ฐฉ์์ ์ฅ์
โ
๋ชจ๋ ๋ณ๊ฒฝ ์ฌํญ์ Git์์ ์ถ์ ๊ฐ๋ฅ → ๋ฐฐํฌ ์ด๋ ฅ์ด ๋จ์ ๊ฐ์ฌ(Audit)๊ฐ ๊ฐ๋ฅ
โ
์๋ํ๋ ๋ฐฐํฌ → ์ฌ๋์ด ๊ฐ์
ํ ํ์ ์์ด CI/CD ํ์ดํ๋ผ์ธ์์ ์๋ ์คํ
โ
๋กค๋ฐฑ์ด ๊ฐํธ → ํน์ ์ปค๋ฐ์ผ๋ก ๋๋๋ฆฌ๋ฉด Kubernetes ์ํ๋ ์๋์ผ๋ก ๋กค๋ฐฑ๋จ
# GitOps ๋ฐฉ์ ์์ (Git์ ์ ์ฅ๋ deployment.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
namespace: default
spec:
replicas: 3 # ์ํ๋ ์ํ ์ ์ธ (Git์ ์ ์ฅ)
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: my-app
image: my-app:v1.0
GitOps ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด, ๊ฐ๋ฐ์๋ **Git์ git push**ํ๋ ๊ฒ๋ง์ผ๋ก ๋ฐฐํฌ๋ฅผ ์งํํ ์ ์์ผ๋ฉฐ,
Argo CD ๊ฐ์ ๋๊ตฌ๊ฐ ์ด๋ฅผ ๊ฐ์งํ๊ณ ์๋์ผ๋ก Kubernetes์ ๋ฐ์ํด ์ค๋๋ค.
๐น GitOps vs ๊ธฐ์กด CI/CD ๋ฐฉ์ ๋น๊ต
๋น๊ต ํญ๋ชฉ ๊ธฐ์กด CI/CD ๋ฐฉ์ GitOps ๋ฐฉ์
๋ฐฐํฌ ๋ฐฉ์ | ์๋(๋ช ๋ นํ) | ์๋(์ ์ธํ) |
๋ณ๊ฒฝ ์ฌํญ ๊ด๋ฆฌ | ์ผ๋ถ CI/CD ๋ก๊ทธ์์๋ง ํ์ธ ๊ฐ๋ฅ | Git์์ ๋ณ๊ฒฝ ์ด๋ ฅ ์ถ์ ๊ฐ๋ฅ |
๋กค๋ฐฑ ๋ฐฉ์ | ์๋์ผ๋ก ํน์ ๋ฒ์ ์ฌ์ ์ฉ ํ์ | Git ์ปค๋ฐ ๋๋๋ฆฌ๊ธฐ๋ง ํ๋ฉด ์๋ ๋กค๋ฐฑ |
์๋ํ ์์ค | CI/CD ํ์, ์ฌ๋์ด ์ง์ ๋ช ๋ น ์คํ | Git๊ณผ Argo CD๊ฐ ์๋์ผ๋ก ๋๊ธฐํ |
์ด์ ๋ถ๋ด | ์ด์์๊ฐ ์ง์ ๊ด๋ฆฌํด์ผ ํจ | ์๋ํ๋ก ์ด์ ๋ถ๋ด ๊ฐ์ |
GitOps๋ CI/CD์ ํต์ฌ ๊ฐ๋
์ธ **Infrastructure as Code(IaC)**๋ฅผ ์คํํ๋ฉฐ,
Kubernetes ํด๋ฌ์คํฐ ์ด์์ ๋์ฑ ํจ์จ์ ์ด๊ณ ์์ ํ๊ฒ ๋ง๋ค์ด ์ค๋๋ค.
๐น GitOps๋ฅผ ์คํํ๋ ๋๊ตฌ: Argo CD
GitOps๋ฅผ Kubernetes์์ ์ ์ฉํ๋ ค๋ฉด, Git๊ณผ Kubernetes๋ฅผ ์๋์ผ๋ก ๋๊ธฐํํด ์ค ์ ์๋ ๋๊ตฌ๊ฐ ํ์ํฉ๋๋ค.
๊ฐ์ฅ ๋ํ์ ์ธ ๋๊ตฌ๊ฐ ๋ฐ๋ก Argo CD์
๋๋ค.
โ Argo CD์ ์ญํ
- Git ์ ์ฅ์์ ์ํ๋ฅผ Kubernetes ํด๋ฌ์คํฐ์ ์๋์ผ๋ก ๋๊ธฐํ
- Kubernetes ๋ฆฌ์์ค ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์งํ๊ณ , ํ์ ์ ๋กค๋ฐฑ ์ง์
- UI ๋ฐ CLI๋ฅผ ์ ๊ณตํ์ฌ ๋ฐฐํฌ ์ํ๋ฅผ ์ฝ๊ฒ ๋ชจ๋ํฐ๋ง ๊ฐ๋ฅ
- Helm, Kustomize ๋ฑ ๋ค์ํ ๋ฐฐํฌ ๋ฐฉ์์ ์ง์
๐น ๊ฒฐ๋ก : ์ด๋ฒ ๊ธ์์ ๋ฐฐ์ด ํต์ฌ ๋ด์ฉ ์ ๋ฆฌ
๐ข GitOps๋ Git์ ๋จ์ผ ์ ๋ขฐ ์์ฒ์ผ๋ก ์ผ์ Kubernetes ๋ฐฐํฌ๋ฅผ ์๋ํํ๋ ๋ฐฉ๋ฒ๋ก
๐ข ๊ธฐ์กด ๋ช
๋ นํ ๋ฐฐํฌ ๋ฐฉ์๊ณผ ๋น๊ตํ์ ๋ GitOps๋ ์๋ํ, ๋กค๋ฐฑ, ๋ณ๊ฒฝ ์ด๋ ฅ ์ถ์ ์ด ํจ์ฌ ํจ์จ์
๐ข GitOps๋ฅผ ์คํํ๋ ๋ํ์ ์ธ ๋๊ตฌ๋ก Argo CD๊ฐ ์์ผ๋ฉฐ, ์ด๋ฅผ ํตํด Kubernetes ํด๋ฌ์คํฐ๋ฅผ ์๋ ๊ด๋ฆฌ ๊ฐ๋ฅ