๐น CI/CD๋ ๋ฌด์์ธ๊ฐ?
CI/CD(Continuous Integration / Continuous Deployment)๋ ์ํํธ์จ์ด ๊ฐ๋ฐ ๋ฐ ๋ฐฐํฌ๋ฅผ ์๋ํํ๋ ํต์ฌ ๊ฐ๋
์
๋๋ค.
GitOps์ Argo CD๋ฅผ ํ์ฉํ๋ฉด CI/CD ํ์ดํ๋ผ์ธ์ ๋์ฑ ํจ์จ์ ์ผ๋ก ๊ตฌ์ถํ ์ ์์ต๋๋ค.
โ GitOps ๊ธฐ๋ฐ CI/CD ํ์ดํ๋ผ์ธ์ ํต์ฌ ์์
๊ตฌ์ฑ ์์ | ์ค๋ช |
Git ์ ์ฅ์ (Git Repository) | ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ ๋ฐ Kubernetes ๋งค๋ํ์คํธ๋ฅผ ๊ด๋ฆฌ |
CI ์์คํ (GitHub Actions, Jenkins, Argo Workflows) | ์ฝ๋ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋น๋ |
์ด๋ฏธ์ง ๋ ์ง์คํธ๋ฆฌ (Docker Hub, ECR, GCR) | ๋น๋๋ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅ |
GitOps ๋๊ตฌ (Argo CD) | Git ์ํ๋ฅผ ๊ฐ์ํ๊ณ Kubernetes ํด๋ฌ์คํฐ์ ์๋ ๋ฐฐํฌ |
Kubernetes ํด๋ฌ์คํฐ | ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐฐํฌ๋ ํ๊ฒฝ |
๐น GitOps ๊ธฐ๋ฐ CI/CD ํ์ดํ๋ผ์ธ์ ๋์ ์๋ฆฌ
1๏ธโฃ ๊ฐ๋ฐ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋๋ฅผ Git ์ ์ฅ์์ Push
2๏ธโฃ CI ์์คํ
์ด ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์งํ๊ณ ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ์ฌ ์ด๋ฏธ์ง ๋ ์ง์คํธ๋ฆฌ์ Push
3๏ธโฃ GitOps ๋ฐฉ์์ผ๋ก Kubernetes ๋งค๋ํ์คํธ๊ฐ ์
๋ฐ์ดํธ๋จ
4๏ธโฃ Argo CD๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์งํ๊ณ Kubernetes ํด๋ฌ์คํฐ์ ์๋ ๋๊ธฐํ
๐น 1. GitOps ๊ธฐ๋ฐ CI/CD ํ์ดํ๋ผ์ธ ๊ตฌ์ถ ๋ฐฉ๋ฒ
GitOps ๋ฐฉ์์ผ๋ก CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๋ ค๋ฉด ๋ค์ ๋จ๊ณ๋ฅผ ์ํํด์ผ ํฉ๋๋ค.
โ 1๏ธโฃ Argo CD ์๋ ๋๊ธฐํ ํ์ฑํ
Argo CD์์ Git ๋ณ๊ฒฝ ์ฌํญ์ด ์๋์ผ๋ก Kubernetes์ ๋ฐ์๋๋๋ก ์๋ ๋๊ธฐํ(Automated Sync) ์ค์ ์ ํ์ฑํํด์ผ ํฉ๋๋ค.
syncPolicy:
automated:
prune: true # Git์์ ์ญ์ ๋ ๋ฆฌ์์ค๋ฅผ Kubernetes์์๋ ์๋ ์ญ์
selfHeal: true # Kubernetes ๋ฆฌ์์ค๊ฐ ๋ณ๊ฒฝ๋์์ ๊ฒฝ์ฐ ์๋ ์ํ๋ก ์๋ ๋ณต๊ตฌ
syncOptions:
- CreateNamespace=true # ๋ค์์คํ์ด์ค๊ฐ ์์ผ๋ฉด ์๋ ์์ฑ
โ
์ค๋ช
:
โ prune: true → Git์์ ์ญ์ ๋ ๋ฆฌ์์ค๊ฐ Kubernetes์์๋ ์ญ์ ๋จ
โ selfHeal: true → Kubernetes ๋ฆฌ์์ค๊ฐ ๋ณ๊ฒฝ๋๋ฉด Git ์ํ๋ก ์๋ ๋ณต๊ตฌ
โ CreateNamespace=true → ๋ค์์คํ์ด์ค๊ฐ ์์ ๊ฒฝ์ฐ ์๋ ์์ฑ
โ 2๏ธโฃ GitHub Actions๋ฅผ ํ์ฉํ CI/CD ํ์ดํ๋ผ์ธ ๊ตฌ์ถ
GitHub Actions๋ฅผ ์ฌ์ฉํ์ฌ Git ๋ณ๊ฒฝ ์ฌํญ์ด ๋ฐ์ํ๋ฉด ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ ,
Argo CD๊ฐ ์ด๋ฅผ ์๋์ผ๋ก ๋ฐฐํฌํ๋๋ก ์ค์ ํ ์ ์์ต๋๋ค.
โ GitHub Actions CI/CD ํ์ดํ๋ผ์ธ ์์ (.github/workflows/deploy.yml)
name: Deploy to Kubernetes with Argo CD
on:
push:
branches:
- main # main ๋ธ๋์น์ Push ์ด๋ฒคํธ ๋ฐ์ ์ ์คํ
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2 # ํ์ฌ Git ์ ์ฅ์๋ฅผ ๊ฐ์ ธ์ด
- name: Build Docker image
run: |
docker build -t ghcr.io/example/app:${{ github.sha }} . # Docker ์ด๋ฏธ์ง ๋น๋
docker push ghcr.io/example/app:${{ github.sha }} # ๋น๋๋ ์ด๋ฏธ์ง ์
๋ก๋
- name: Update Kubernetes manifests
run: |
sed -i "s|image: ghcr.io/example/app:.*|image: ghcr.io/example/app:${{ github.sha }}|g" k8s/deployment.yaml
git config user.name "GitHub Actions"
git config user.email "actions@github.com"
git add k8s/deployment.yaml
git commit -m "Update deployment image to ${{ github.sha }}"
git push origin main
โ
์ค๋ช
:
โ docker build → GitHub Actions์์ Docker ์ด๋ฏธ์ง๋ฅผ ๋น๋
โ docker push → ๋น๋๋ ์ด๋ฏธ์ง๋ฅผ GitHub Container Registry(GHCR)์ Push
โ sed -i → Kubernetes ๋งค๋ํ์คํธ์ ์ด๋ฏธ์ง๋ฅผ ์ต์ ๋ฒ์ ์ผ๋ก ์
๋ฐ์ดํธ
โ git commit & push → ์
๋ฐ์ดํธ๋ ๋งค๋ํ์คํธ๋ฅผ Git ์ ์ฅ์์ ๋ค์ Push
โ ๋์ ๊ณผ์ :
- GitHub Actions๊ฐ ์ฝ๋๋ฅผ ๋น๋ํ๊ณ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋ ์ง์คํธ๋ฆฌ์ Push
- ์ ๋ฐ์ดํธ๋ ์ด๋ฏธ์ง ํ๊ทธ๊ฐ Git ์ ์ฅ์์ Kubernetes ๋งค๋ํ์คํธ์ ๋ฐ์๋จ
- Argo CD๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์งํ๊ณ ์๋ ๋ฐฐํฌ ์คํ
๐น 2. Argo CD์์ ์๋ ๋ฐฐํฌ ํ์ธ
Argo CD๊ฐ GitOps ๋ฐฉ์์ผ๋ก ๋ฐฐํฌ๋ฅผ ์ ์์ ์ผ๋ก ์ํํ๋์ง ํ์ธํด์ผ ํฉ๋๋ค.
โ Argo CD CLI๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐํฌ ์ํ ํ์ธ
argocd app get example-app
โ ์ถ๋ ฅ ์์
Name: example-app
Project: default
Sync Status: Synced
Health Status: Healthy
Revision: 8f7c2d1
๐น 3. Argo CD ์๋ํ ๋ฐฐํฌ ์ ๊ณ ๋ คํ ์
โ 1๏ธโฃ ๋ณด์ ๋ฐ ์ธ์ฆ ๊ด๋ฆฌ
- Argo CD์ CI/CD ์์คํ ๊ฐ์ ์ธ์ฆ์ ์์ ํ๊ฒ ๊ด๋ฆฌํด์ผ ํจ
- GitHub Actions์์ secrets์ ํ์ฉํ์ฌ ์ธ์ฆ ์ ๋ณด๋ฅผ ๋ณดํธ
โ 2๏ธโฃ ๋ฐฐํฌ ์น์ธ(Manual Approval) ๋จ๊ณ ์ถ๊ฐ
- ์ด์ ํ๊ฒฝ์์๋ ์๋ ๋ฐฐํฌ ์ ์ ๊ฒํ ๋ฐ ์น์ธ ๋จ๊ณ๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ข์
- Argo CD์์ Webhook์ ํ์ฉํ Slack ์๋ฆผ ๋ฐ ์น์ธ ํ๋ก์ธ์ค ๊ตฌ์ถ ๊ฐ๋ฅ
โ 3๏ธโฃ ๋ฆฌ์์ค ์ต์ ํ ๋ฐ ๋ชจ๋ํฐ๋ง
- Prometheus & Grafana๋ฅผ ํ์ฉํ์ฌ Argo CD ๋ฐฐํฌ ์ํ๋ฅผ ๋ชจ๋ํฐ๋ง
- ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ ํ Kubernetes ๋ฆฌ์์ค ์ฌ์ฉ๋ ์ต์ ํ
๐น Argo CD ์๋ํ ๋ฐฐํฌ CLI ๋ช ๋ น์ด ์ ๋ฆฌ
๋ช ๋ น์ด | ์ค๋ช |
argocd app list | ๋ฑ๋ก๋ ์ ํ๋ฆฌ์ผ์ด์ ๋ชฉ๋ก ์กฐํ |
argocd app sync <APP> | ์ ํ๋ฆฌ์ผ์ด์ ๋๊ธฐํ ์คํ |
argocd app get <APP> | ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ ์ํ ํ์ธ |
argocd app rollback <APP> <VERSION> | ํน์ ๋ฒ์ ์ผ๋ก ๋กค๋ฐฑ |
argocd app delete <APP> | ์ ํ๋ฆฌ์ผ์ด์ ์ญ์ |
โ ์๋ ๋๊ธฐํ ์ํ ํ์ธ
argocd app get example-app
โ ์ ํ๋ฆฌ์ผ์ด์ ๋๊ธฐํ ์คํ
argocd app sync example-app
โ GitOps ๋ฐฉ์์ผ๋ก Kubernetes ๋ฐฐํฌ ์ํ ํ์ธ
kubectl get deployments -n example-namespace
๐น ๊ฒฐ๋ก : ์ด๋ฒ ๊ธ์์ ๋ฐฐ์ด ํต์ฌ ๋ด์ฉ ์ ๋ฆฌ
๐ข GitOps ๊ธฐ๋ฐ์ CI/CD ํ์ดํ๋ผ์ธ์ ๊ตฌํํ๋ฉด ์ด์ ๋น์ฉ์ ์ ๊ฐํ๊ณ ๋ฐฐํฌ ์๋๋ฅผ ํฅ์ ๊ฐ๋ฅ
๐ข Argo CD์ ์๋ ๋๊ธฐํ(Automated Sync) ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ Kubernetes ์ํ๋ฅผ Git๊ณผ ํญ์ ์ผ์นํ๋๋ก ์ ์ง ๊ฐ๋ฅ
๐ข GitHub Actions์ Argo CD๋ฅผ ์ฐ๋ํ์ฌ ์ฝ๋ ๋ณ๊ฒฝ ์ ์๋์ผ๋ก ๋ฐฐํฌ๊ฐ ์ด๋ฃจ์ด์ง๋๋ก ์ค์ ๊ฐ๋ฅ
๐ข CI/CD ํ์ดํ๋ผ์ธ์ ์ต์ ํํ๋ฉด ๋ฐฐํฌ ์น์ธ, ๋ณด์ ๊ด๋ฆฌ, ๋ชจ๋ํฐ๋ง๊น์ง ํฌํจํ ์๋ ํฌ ์๋(End-to-End) GitOps ๊ตฌ์ถ ๊ฐ๋ฅ