๐น ์์ ์๋ํ ๋ฐฐํฌ๋?
์์ ์๋ํ ๋ฐฐํฌ(Full Automated Deployment)๋ GitOps ์์น์ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋ ๋ณ๊ฒฝ์ด ์๋์ผ๋ก ๋ฐฐํฌ๋๋ ์์คํ
์ ์๋ฏธํฉ๋๋ค.
Argo CD๋ฅผ ํ์ฉํ๋ฉด Git ์ ์ฅ์์ ์ํ๋ฅผ Kubernetes ํด๋ฌ์คํฐ์ ์๋์ผ๋ก ๋ฐ์ํ์ฌ ๋ฐฐํฌ ๊ณผ์ ์ ์์ ํ ์๋ํํ ์ ์์ต๋๋ค.
โ
์์ ์๋ํ ๋ฐฐํฌ์ ์ฃผ์ ํน์ง
โ Git ์ ์ฅ์๋ฅผ ๋จ์ผ ์ ๋ขฐ ์์ฒ(Source of Truth)์ผ๋ก ์ฌ์ฉ
โ ์ฝ๋ ๋ณ๊ฒฝ์ด ๊ฐ์ง๋๋ฉด ์๋์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ฐฐํฌ๋จ
โ ์๋ ๊ฐ์
์์ด Kubernetes ํด๋ฌ์คํฐ ์ํ๋ฅผ ์ ์ง ๋ฐ ๋ณต๊ตฌ ๊ฐ๋ฅ
โ CI/CD ํ์ดํ๋ผ์ธ๊ณผ ํตํฉํ์ฌ ์ต์ ํ๋ GitOps ์ํฌํ๋ก์ฐ ๊ตฌ์ถ ๊ฐ๋ฅ
๐น GitOps ๊ธฐ๋ฐ์ ์๋ํ ๋ฐฐํฌ ๊ตฌ์ฑ ์์
GitOps ๋ฐฉ์์ผ๋ก ์์ ์๋ํ ๋ฐฐํฌ๋ฅผ ๊ตฌ์ฑํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ ํต์ฌ ์์๊ฐ ํ์ํฉ๋๋ค.
๊ตฌ์ฑ ์์ | ์ค๋ช |
Git ์ ์ฅ์ (Git Repository) | Kubernetes ๋งค๋ํ์คํธ ๋๋ Helm ์ฐจํธ ๊ด๋ฆฌ |
Argo CD | Git ์ํ๋ฅผ ๊ฐ์ํ๊ณ Kubernetes์ ์๋ ๋ฐฐํฌ |
CI/CD ์์คํ (GitHub Actions, Jenkins, Argo Workflows) | ์ฝ๋ ๋ณ๊ฒฝ์ ๊ฐ์งํ๊ณ Git ์ ์ฅ์์ ์ ๋ฐ์ดํธ |
์ด๋ฏธ์ง ๋ ์ง์คํธ๋ฆฌ (Docker Hub, ECR, GCR) | ๋น๋๋ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅ |
Kubernetes ํด๋ฌ์คํฐ | ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฐฐํฌ๋ ํ๊ฒฝ |
โ
์๋ํ ํ๋ฆ:
1๏ธโฃ ๊ฐ๋ฐ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์
์ฝ๋๋ฅผ Git ์ ์ฅ์์ Push
2๏ธโฃ CI/CD ์์คํ
์ด ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์งํ๊ณ ์ปจํ
์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ์ฌ ๋ ์ง์คํธ๋ฆฌ์ Push
3๏ธโฃ GitOps ๋ฐฉ์์ผ๋ก Kubernetes ๋งค๋ํ์คํธ๊ฐ ์
๋ฐ์ดํธ๋จ
4๏ธโฃ Argo CD๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์งํ๊ณ Kubernetes ํด๋ฌ์คํฐ์ ์๋ ๋๊ธฐํ
๐น Argo CD๋ฅผ ํ์ฉํ ์์ ์๋ํ ๋ฐฐํฌ ๊ตฌ์ถ
โ 1. ์๋ ๋๊ธฐํ(Automated Sync) ํ์ฑํ
Argo CD์์ Git ๋ณ๊ฒฝ ์ฌํญ์ด ์๋์ผ๋ก Kubernetes์ ๋ฐ์๋๋๋ก ์๋ ๋๊ธฐํ(Automated Sync) ์ค์ ์ ํ์ฑํํด์ผ ํฉ๋๋ค.
apiVersion: argoproj.io/v1alpha1 # Argo CD์ API ๋ฒ์
kind: Application # Argo CD์์ ๊ด๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์
๋ฆฌ์์ค
metadata:
name: example-app # ์ ํ๋ฆฌ์ผ์ด์
์ด๋ฆ
namespace: argocd # Argo CD๊ฐ ์คํ๋๋ ๋ค์์คํ์ด์ค
spec:
project: default # Argo CD์์ ๊ด๋ฆฌํ๋ ํ๋ก์ ํธ ์ง์
source:
repoURL: https://github.com/example/repo.git # Git ์ ์ฅ์ URL
targetRevision: main # ์ฌ์ฉํ Git ๋ธ๋์น (์: main, develop)
path: manifests # Git ์ ์ฅ์ ๋ด์์ ๋งค๋ํ์คํธ ํ์ผ์ด ์์นํ ๋๋ ํฐ๋ฆฌ
destination:
server: https://kubernetes.default.svc # ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ฐฐํฌ๋ Kubernetes ํด๋ฌ์คํฐ์ API ์๋ฒ
namespace: example-namespace # ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ฐฐํฌ๋ ๋ค์์คํ์ด์ค
syncPolicy:
automated:
prune: true # Git์์ ์ญ์ ๋ ๋ฆฌ์์ค๋ฅผ Kubernetes์์๋ ์๋ ์ญ์
selfHeal: true # Kubernetes ๋ฆฌ์์ค๊ฐ ๋ณ๊ฒฝ๋์์ ๊ฒฝ์ฐ Git ์ํ๋ก ์๋ ๋ณต๊ตฌ
syncOptions:
- CreateNamespace=true # ๋ค์์คํ์ด์ค๊ฐ ์์ผ๋ฉด ์๋ ์์ฑ
โ 2. GitHub Actions๋ฅผ ํ์ฉํ ์๋ํ ๋ฐฐํฌ ํ์ดํ๋ผ์ธ ๊ตฌ์ถ
name: Deploy to Kubernetes with Argo CD # GitHub Actions ์ํฌํ๋ก์ฐ ์ด๋ฆ
on:
push:
branches:
- main # main ๋ธ๋์น์ ์ฝ๋๊ฐ push๋ ๋ ์คํ
jobs:
build:
runs-on: ubuntu-latest # GitHub Actions ์คํ ํ๊ฒฝ
steps:
- name: Checkout repository
uses: actions/checkout@v2 # Git ์ ์ฅ์์ ์ฝ๋ ์ฒดํฌ์์
- name: Build Docker image
run: |
docker build -t ghcr.io/example/app:${{ github.sha }} . # ์ปจํ
์ด๋ ์ด๋ฏธ์ง ๋น๋
docker push ghcr.io/example/app:${{ github.sha }} # ๋น๋๋ ์ด๋ฏธ์ง๋ฅผ GitHub Container Registry์ Push
- 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 ์ค์
git config user.email "actions@github.com"
git add k8s/deployment.yaml # ๋ณ๊ฒฝ๋ ๋งค๋ํ์คํธ๋ฅผ Git์ ์ถ๊ฐ
git commit -m "Update deployment image to ${{ github.sha }}" # ๋ณ๊ฒฝ ์ฌํญ ์ปค๋ฐ
git push origin main # ๋ณ๊ฒฝ ์ฌํญ GitHub ์ ์ฅ์์ Push
๐น 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 ๊ธฐ๋ฐ์ ์์ ์๋ํ ๋ฐฐํฌ๋ฅผ ๊ตฌํํ๋ฉด ์ด์ ๋น์ฉ์ ์ ๊ฐํ๊ณ ๋ฐฐํฌ ์๋๋ฅผ ํฅ์ ๊ฐ๋ฅ
๐ข Argo CD์ ์๋ ๋๊ธฐํ(Automated Sync) ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ Kubernetes ์ํ๋ฅผ Git๊ณผ ํญ์ ์ผ์นํ๋๋ก ์ ์ง ๊ฐ๋ฅ
๐ข GitHub Actions์ Argo CD๋ฅผ ์ฐ๋ํ์ฌ ์ฝ๋ ๋ณ๊ฒฝ ์ ์๋์ผ๋ก ๋ฐฐํฌ๊ฐ ์ด๋ฃจ์ด์ง๋๋ก ์ค์ ๊ฐ๋ฅ