๐ฏ ๊ฐ์
์ด ๊ธ์์๋ ArgoCD๋ฅผ ํ์ฉํ์ฌ Kubernetes ์ ํ๋ฆฌ์ผ์ด์ ์ GitOps ๋ฐฉ์์ผ๋ก ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
Git์ ๋จ์ผ ์์ค๋ก ์ฌ์ฉํ๊ณ , ArgoCD๊ฐ Git ์ ์ฅ์ ๋ณ๊ฒฝ ์ฌํญ์ ๊ฐ์งํ์ฌ ์๋์ผ๋ก Kubernetes์ ๋ฐฐํฌํ๋ ๋ฐฉ์์ ๋๋ค.
โ ๋ชฉํ
• Helm์ ์ฌ์ฉํ์ฌ ArgoCD ์ค์น
• ArgoCD UI ๋ฐ CLI๋ฅผ ํตํด ๋ฐฐํฌ ๊ด๋ฆฌ
• GitHub ์ ์ฅ์์ ์ฐ๊ฒฐํ์ฌ GitOps ๋ฐฉ์์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์๋ ๋ฐฐํฌ
• Helm values.yaml์ ํ์ฉํ์ฌ ํ๊ฒฝ๋ณ ์ค์ ๊ด๋ฆฌ
๐ 1๏ธโฃ ArgoCD ์ค์น (Helm ์ฌ์ฉ)
ArgoCD๋ Kubernetes์ ๋ฐฐํฌ๋๋ฉฐ, Helm์ ์ฌ์ฉํ๋ฉด ๊ฐํธํ๊ฒ ์ค์นํ ์ ์์ต๋๋ค.
โ 1-1. Helm Chart๋ฅผ ์ด์ฉํ ArgoCD ์ค์น
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
helm install argocd argo/argo-cd -n argocd --create-namespace
โ ์ค์น๋ ArgoCD ํ์ธ
kubectl get pods -n argocd
์ถ๋ ฅ ์์:
NAME READY STATUS RESTARTS AGE
argocd-application-controller-0 1/1 Running 0 30s
argocd-redis-xxxxxxxxxx-xxxxx 1/1 Running 0 30s
argocd-repo-server-xxxxxxxxxx-xxxxx 1/1 Running 0 30s
argocd-server-xxxxxxxxxx-xxxxx 1/1 Running 0 30s
๐น ๋ชจ๋ Pod๊ฐ Running ์ํ์ด๋ฉด ์ค์น๊ฐ ์ ์์ ์ผ๋ก ์๋ฃ๋จ!
โ 1-2. ArgoCD ์น UI ์ ์
ArgoCD์ ๊ธฐ๋ณธ argocd-server ์๋น์ค๋ ClusterIP๋ก ๋ฐฐํฌ๋๋ฏ๋ก,
์ธ๋ถ์์ ์ ๊ทผํ๋ ค๋ฉด ํฌํธ๋ฅผ ๋ณ๊ฒฝํด์ผ ํฉ๋๋ค.
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
โ ๋ณ๊ฒฝ ํ, EXTERNAL-IP ํ์ธ
kubectl get svc -n argocd
์ถ๋ ฅ ์์:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S)
argocd-server LoadBalancer 10.43.150.132 192.168.1.100 8070:30343/TCP
๐น ๋ธ๋ผ์ฐ์ ์์ http://192.168.1.100:8070์ ์ ์ ๊ฐ๋ฅ!
โ 1-3. ArgoCD ๋ก๊ทธ์ธ
kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 --decode
โ ์ด๊ธฐ ๊ณ์ ์ ๋ณด
• ID: admin
• PW: (์์์ ์กฐํํ ๋น๋ฐ๋ฒํธ)
CLI์์ ๋ก๊ทธ์ธํ๋ ค๋ฉด:
argocd login http://192.168.1.100:8070 --username admin --password <PASSWORD> --insecure
๐ 2๏ธโฃ ArgoCD Application ๊ตฌ์ฑ ๋ฐ ๋ฐฐํฌ
์ด์ ArgoCD์์ Git ์ ์ฅ์์ ์ฐ๊ฒฐํ๊ณ , Kubernetes ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ Application์ ์์ฑํฉ๋๋ค.
โ 2-1. GitHub ์ ์ฅ์ ๋ฑ๋ก
๋จผ์ GitHub ์ฌ์ฉ์ ์ด๋ฆ ๋ฐ Personal Access Token(PAT)์ ์ง์ ์ ๋ ฅํ์ง ์๋๋ก ํ๊ฒฝ ๋ณ์๋ก ๊ด๋ฆฌํฉ๋๋ค.
export GIT_USERNAME="your-username"
export GIT_PASSWORD="your-token"
export GIT_REPO_URL="https://github.com/your-org/your-repo.git"
โ ArgoCD์ Git ์ ์ฅ์ ๋ฑ๋ก
argocd repo add $GIT_REPO_URL --username $GIT_USERNAME --password $GIT_PASSWORD
โ ArgoCD์์ ์ ์ฅ์ ํ์ธ
argocd repo list
์ถ๋ ฅ ์์:
TYPE NAME REPO USERNAME
git gitops https://github.com/your-org/your-repo.git your-username
โ 2-2. ArgoCD Application YAML ์์ฑ
์๋ YAML์ ์ฌ์ฉํ์ฌ Helm Chart๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํฉ๋๋ค.
๐ argocd-application.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: rag-fastapi # ArgoCD์์ ๊ด๋ฆฌํ ์ ํ๋ฆฌ์ผ์ด์
์ด๋ฆ
namespace: argocd # ArgoCD๊ฐ ๊ด๋ฆฌํ๋ ๋ค์์คํ์ด์ค
spec:
project: default # ๊ธฐ๋ณธ ํ๋ก์ ํธ (์ฌ๋ฌ ํ๋ก์ ํธ๋ฅผ ์ด์ํ๋ ๊ฒฝ์ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅ)
source:
repoURL: https://github.com/your-org/your-repo.git # Git ์ ์ฅ์ URL
path: rag-fastapi-structured/helm # Git ์ ์ฅ์ ๋ด Helm Chart ๊ฒฝ๋ก
targetRevision: main # Git์ ํน์ ๋ธ๋์น ๋๋ ํ๊ทธ (๋ณดํต `main` ๋๋ `develop`)
helm:
valueFiles:
- values.yaml # Helm ๋ฐฐํฌ ์ ์ฌ์ฉํ values ํ์ผ ์ง์
destination:
namespace: fastapi # ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ฐฐํฌ๋ ๋ค์์คํ์ด์ค
server: https://kubernetes.default.svc # ๋ฐฐํฌํ Kubernetes ํด๋ฌ์คํฐ ์ฃผ์
syncPolicy:
automated:
prune: true # Git์์ ์ญ์ ๋ ๋ฆฌ์์ค๋ฅผ ์๋์ผ๋ก ์ญ์
selfHeal: true # ํด๋ฌ์คํฐ ์ํ๊ฐ Git๊ณผ ๋ค๋ฅด๋ฉด ์๋ ๋ณต๊ตฌ
โ ์ ํ๋ฆฌ์ผ์ด์ ์ ArgoCD์ ์ ์ฉ
kubectl apply -f argocd-application.yaml
โ 2-3. ArgoCD์์ ๋ฐฐํฌ ์ํ ํ์ธ
argocd app get rag-fastapi
โ ์ถ๋ ฅ ์์
Name: rag-fastapi
Repo: https://github.com/your-org/your-repo.git
Target: main
Path: rag-fastapi-structured/helm
Sync Status: Synced
Health Status: Healthy
๐ SYNCED ์ํ์ด๋ฉด GitHub์ ๋๊ธฐํ ์๋ฃ!
๐ฏ ์ต์ข ์ ๋ฆฌ
1. Helm์ ์ฌ์ฉํ์ฌ ArgoCD ์ค์น (helm install argocd argo/argo-cd -n argocd)
2. ArgoCD ์น UI ๋ฐ CLI์์ ๋ก๊ทธ์ธ (argocd login)
3. GitHub ์ ์ฅ์๋ฅผ ํ๊ฒฝ ๋ณ์๋ก ๊ด๋ฆฌํ์ฌ ArgoCD์ ๋ฑ๋ก (argocd repo add $GIT_REPO_URL ...)
4. Helm Chart ๊ธฐ๋ฐ์ Application์ ์์ฑํ์ฌ ์๋ ๋ฐฐํฌ (kubectl apply -f argocd-application.yaml)
5. argocd app get rag-fastapi๋ฅผ ์คํํ์ฌ ๋ฐฐํฌ ์ํ ํ์ธ