πΉ Argo CDμμ μ ν리μΌμ΄μ μ μ μνλ λ°©λ²
Argo CDλ **Application CRD(Custom Resource Definition)**λ₯Ό ν΅ν΄ μ ν리μΌμ΄μ
μ μ μΈμ μΌλ‘ κ΄λ¦¬ν©λλ€.
μ¦, YAML 맀λνμ€νΈλ₯Ό μμ±νμ¬ Git μ μ₯μμ Kubernetes ν΄λ¬μ€ν° κ°μ λκΈ°νλ₯Ό μ€μ ν μ μμ΅λλ€.
μ΄λ² κΈμμλ Argo CD μ ν리μΌμ΄μ
μ μ μνλ YAMLμ μ£Όμ ꡬ쑰μ μ€μ μ΅μ
μ λΆμνκ³ ,
κ° νλͺ©μ΄ μ΄λ€ μν μ μννλμ§ μμΈν μ€λͺ
νκ² μ΅λλ€.
πΉ Argo CD μ ν리μΌμ΄μ YAMLμ μ£Όμ κ΅¬μ± μμ
Argo CDμμ μ ν리μΌμ΄μ μ μ μνλ YAMLμ λ€μκ³Ό κ°μ μ£Όμ μΉμ μΌλ‘ ꡬμ±λ©λλ€.
1οΈβ£ λ©νλ°μ΄ν°(metadata) β μ ν리μΌμ΄μ
μ μ΄λ¦ λ° λ€μμ€νμ΄μ€ μ€μ
2οΈβ£ μ¬μ(spec) β μ ν리μΌμ΄μ
μ μ격 μ μ₯μ, λμ ν΄λ¬μ€ν°, λκΈ°ν μ μ±
λ±μ μ€μ
3οΈβ£ μμ€(source) β Git μ μ₯μ, Helm μ°¨νΈ, Kustomize λ±μ λ°°ν¬ λ°©μ μ μ
4οΈβ£ λμ(destination) β μ ν리μΌμ΄μ
μ΄ λ°°ν¬λ Kubernetes ν΄λ¬μ€ν° λ° λ€μμ€νμ΄μ€ μ§μ
5οΈβ£ λκΈ°ν μ μ±
(syncPolicy) β μλ λκΈ°ν μ¬λΆ λ° λ¦¬μμ€ μ 리 μ μ±
μ€μ
πΉ Argo CD μ ν리μΌμ΄μ YAML μμ λΆμ
μλλ Helm κΈ°λ° μ ν리μΌμ΄μ μ Argo CDμμ κ΄λ¦¬νλ YAML μμ μ λλ€.
apiVersion: argoproj.io/v1alpha1 # Argo CDμ API λ²μ μ§μ
kind: Application # μ ν리μΌμ΄μ
리μμ€ μ μΈ
metadata:
name: example-app # μ ν리μΌμ΄μ
μ΄λ¦
namespace: argocd # Argo CDκ° κ΄λ¦¬νλ λ€μμ€νμ΄μ€
spec:
project: default # Argo CDμμ κ΄λ¦¬νλ νλ‘μ νΈ μ§μ
source: # μμ€(Git μ μ₯μ λλ Helm μ°¨νΈ) μ€μ
repoURL: https://github.com/example/repo.git # Git μ μ₯μ URL
targetRevision: main # μ¬μ©ν λΈλμΉ λλ νκ·Έ
path: charts/example # Helm μ°¨νΈ λλ 맀λνμ€νΈκ° μμΉν λλ ν°λ¦¬
helm:
valueFiles: # Helm μ°¨νΈμ values νμΌ μ§μ
- values.yaml
- values-production.yaml
destination: # Kubernetes ν΄λ¬μ€ν° λ° λ€μμ€νμ΄μ€ μ§μ
server: https://kubernetes.default.svc # κΈ°λ³Έ ν΄λ¬μ€ν°(Kubernetes API μλ²)
namespace: example-namespace # μ ν리μΌμ΄μ
μ΄ λ°°ν¬λ λ€μμ€νμ΄μ€
syncPolicy: # λκΈ°ν μ μ±
μ μ
automated:
prune: true # Gitμμ μμ λ 리μμ€λ₯Ό Kubernetesμμλ μμ
selfHeal: true # Kubernetes 리μμ€κ° λ³κ²½λμμ κ²½μ° μλ μνλ‘ μλ 볡ꡬ
syncOptions:
- CreateNamespace=true # λ€μμ€νμ΄μ€κ° μμΌλ©΄ μλ μμ±
- PrunePropagationPolicy=foreground # Prune λμ λ°©μ μ€μ
- PruneLast=true # μμ μμ
μ λ§μ§λ§μ μ€ν
πΉ YAML μ£Όμ νλͺ© μμΈ λΆμ
β 1. metadata: μ ν리μΌμ΄μ μ κΈ°λ³Έ μ 보
metadata:
name: example-app # μ ν리μΌμ΄μ
μ΄λ¦
namespace: argocd # Argo CD λ€μμ€νμ΄μ€
- name β Argo CDμμ κ΄λ¦¬ν μ ν리μΌμ΄μ μ μ΄λ¦
- namespace β Argo CDκ° μ€νλλ λ€μμ€νμ΄μ€ (κΈ°λ³Έκ°: argocd)
β 2. spec.project: μ ν리μΌμ΄μ μ΄ μν νλ‘μ νΈ
spec:
project: default # Argo CDμμ κ΄λ¦¬νλ νλ‘μ νΈ μ΄λ¦
- Argo CDμμ μ ν리μΌμ΄μ μ κ·Έλ£Ήνν λ μ¬μ©νλ νλ‘μ νΈ
- κΈ°λ³Έμ μΌλ‘ default νλ‘μ νΈλ₯Ό μ¬μ©νμ§λ§, νμμ λ°λΌ λ€λ₯Έ νλ‘μ νΈλ₯Ό μμ±ν μλ μμ
β 3. source: μ ν리μΌμ΄μ μ μμ€ μ½λ μ μ₯μ
source:
repoURL: https://github.com/example/repo.git # Git μ μ₯μ URL
targetRevision: main # μ¬μ©ν λΈλμΉ λλ νκ·Έ
path: charts/example # Helm μ°¨νΈ λλ 맀λνμ€νΈκ° μμΉν λλ ν°λ¦¬
- repoURL β Git μ μ₯μμ URL
- targetRevision β μ¬μ©ν Git λΈλμΉ(main, develop) λλ νΉμ νκ·Έ
- path β Git μ μ₯μ λ΄μμ 맀λνμ€νΈ νμΌμ΄ μμΉν λλ ν°λ¦¬
π Helmμ μ¬μ©νλ κ²½μ°
Helm μ°¨νΈλ₯Ό μ¬μ©νλ κ²½μ°, helm μ΅μ μ μΆκ°νμ¬ values νμΌμ μ§μ ν μ μμ΅λλ€.
helm:
valueFiles:
- values.yaml
- values-production.yaml
β 4. destination: μ ν리μΌμ΄μ μ΄ λ°°ν¬λ Kubernetes ν΄λ¬μ€ν°
destination:
server: https://kubernetes.default.svc # κΈ°λ³Έ ν΄λ¬μ€ν°(Kubernetes API μλ²)
namespace: example-namespace # μ ν리μΌμ΄μ
μ΄ λ°°ν¬λ λ€μμ€νμ΄μ€
- server β μ ν리μΌμ΄μ
μ΄ λ°°ν¬λ Kubernetes ν΄λ¬μ€ν° μ£Όμ
- https://kubernetes.default.svc: κΈ°λ³Έ ν΄λ¬μ€ν° (Argo CDμ λμΌν ν΄λ¬μ€ν°)
- λ€λ₯Έ ν΄λ¬μ€ν°λ₯Ό μ¬μ©ν κ²½μ°, ν΄λΉ ν΄λ¬μ€ν°μ API μλ² μ£Όμ μ λ ₯
- namespace β μ ν리μΌμ΄μ μ΄ λ°°ν¬λ λ€μμ€νμ΄μ€
β 5. syncPolicy: μ ν리μΌμ΄μ λκΈ°ν μ μ± μ€μ
syncPolicy:
automated:
prune: true # Gitμμ μμ λ 리μμ€λ₯Ό Kubernetesμμλ μμ
selfHeal: true # Kubernetes 리μμ€κ° λ³κ²½λμμ κ²½μ° μλ μνλ‘ μλ 볡ꡬ
syncOptions:
- CreateNamespace=true # λ€μμ€νμ΄μ€κ° μμΌλ©΄ μλ μμ±
- PrunePropagationPolicy=foreground # Prune λμ λ°©μ μ€μ
- PruneLast=true # μμ μμ
μ λ§μ§λ§μ μ€ν
- μλ λκΈ°ν μ΅μ
- prune: true β Gitμμ μμ λ 리μμ€λ₯Ό Kubernetesμμλ μμ
- selfHeal: true β μλ λ³κ²½λ 리μμ€λ₯Ό Git μνλ‘ μλ 볡ꡬ
- μΆκ° λκΈ°ν μ΅μ
- CreateNamespace=true β λ€μμ€νμ΄μ€κ° μμΌλ©΄ μλ μμ±
- PrunePropagationPolicy=foreground β 리μμ€ μμ μμ μ§μ
- PruneLast=true β μμ μμ μ λ§μ§λ§μ μ€ν
πΉ Argo CD CLIλ₯Ό νμ©ν μ ν리μΌμ΄μ μμ±
YAML μμ΄ CLIλ₯Ό μ¬μ©νμ¬ μ ν리μΌμ΄μ μ μμ±ν μλ μμ΅λλ€.
argocd app create example-app \
--repo https://github.com/example/repo.git \
--path charts/example \
--dest-server https://kubernetes.default.svc \
--dest-namespace example-namespace \
--sync-policy automated
μ΄ λͺ λ Ήμ΄λ μμμ μ€λͺ ν YAMLκ³Ό λμΌν μν μ μνν©λλ€.
πΉ νλ‘μ νΈκ° μμ κ²½μ° μλ μμ±νλ Application & AppProject YAML
# π Argo CDμμ νλ‘μ νΈ(AppProject)μ μ ν리μΌμ΄μ
(Application)μ λμμ μμ±νλ 맀λνμ€νΈ
# - 'database' νλ‘μ νΈκ° μμΌλ©΄ μλμΌλ‘ μμ±
# - 'chromadb' μ ν리μΌμ΄μ
μ λ°°ν¬
# - νλ‘μ νΈκ° μ΄λ―Έ μ‘΄μ¬νλ©΄ κΈ°μ‘΄ μ€μ μ μ μ§ν μ± μ ν리μΌμ΄μ
μ λ°°ν¬
---
apiVersion: argoproj.io/v1alpha1 # Argo CDμ API λ²μ μ§μ
kind: AppProject # Argo CD νλ‘μ νΈ λ¦¬μμ€ μ μ
metadata:
name: database # νλ‘μ νΈ μ΄λ¦ (μ΄λ¦μ΄ 'database'μΈ νλ‘μ νΈ μμ±)
namespace: argocd # Argo CDκ° λ°°ν¬λλ λ€μμ€νμ΄μ€ (κΈ°λ³Έμ μΌλ‘ 'argocd' μ¬μ©)
spec:
description: "Project for managing database applications" # νλ‘μ νΈ μ€λͺ
sourceRepos:
- "*" # μ΄ νλ‘μ νΈμμ κ΄λ¦¬ν μ μλ Git μ μ₯μ (λͺ¨λ μ μ₯μ νμ©)
destinations:
- namespace: database # μ ν리μΌμ΄μ
μ΄ λ°°ν¬λ λ€μμ€νμ΄μ€ ('database' λ€μμ€νμ΄μ€)
server: https://kubernetes.default.svc # λ°°ν¬ λμ Kubernetes ν΄λ¬μ€ν° (κΈ°λ³Έ ν΄λ¬μ€ν°)
clusterResourceWhitelist:
- group: "*" # λͺ¨λ API κ·Έλ£Ήμ 리μμ€λ₯Ό νμ©
kind: "*" # λͺ¨λ μ’
λ₯μ 리μμ€λ₯Ό νμ© (μ: Deployments, Services λ±)
namespaceResourceWhitelist:
- group: "*" # λͺ¨λ λ€μμ€νμ΄μ€ 리μμ€ νμ©
kind: "*" # λͺ¨λ μ’
λ₯μ λ€μμ€νμ΄μ€ 리μμ€ νμ©
roles:
- name: admin # 'database' νλ‘μ νΈμ λν κ΄λ¦¬(Admin) μν μμ±
description: "Admin access to the database project" # μν μ€λͺ
policies:
- "p, proj:database:admin, applications, *, database/*, allow"
# μ΄ νλ‘μ νΈ λ΄μ λͺ¨λ μ ν리μΌμ΄μ
μ κ΄λ¦¬ν μ μλλ‘ κΆν λΆμ¬
---
apiVersion: argoproj.io/v1alpha1 # Argo CDμ API λ²μ μ§μ
kind: Application # Argo CDμμ κ΄λ¦¬νλ μ ν리μΌμ΄μ
리μμ€ μ μ
metadata:
name: chromadb # μ ν리μΌμ΄μ
μ΄λ¦ (Argo CD UI λ° CLIμμ νμλ¨)
namespace: argocd # μ ν리μΌμ΄μ
μ΄ μμ±λ λ€μμ€νμ΄μ€ (Argo CDκ° κ΄λ¦¬)
spec:
project: database # μμμ μμ±ν 'database' νλ‘μ νΈλ₯Ό μ¬μ©
source:
repoURL: https://github.com/ch0992/gitops.git # μ ν리μΌμ΄μ
μ΄ λ°°ν¬λ Git μ μ₯μ
targetRevision: HEAD # Git μ μ₯μμμ μ¬μ©ν λΈλμΉ λλ νκ·Έ (HEADλ μ΅μ μνλ₯Ό μλ―Έ)
path: argocd/chromadb/helm # Git μ μ₯μ λ΄μμ 맀λνμ€νΈ λλ Helm μ°¨νΈκ° μμΉν λλ ν°λ¦¬
destination:
server: https://kubernetes.default.svc # Kubernetes API μλ² (κΈ°λ³Έ ν΄λ¬μ€ν°)
namespace: database # μ ν리μΌμ΄μ
μ΄ λ°°ν¬λ λ€μμ€νμ΄μ€
syncPolicy: # Argo CDμ λκΈ°ν μ μ±
μ μ
automated:
prune: true # Git μ μ₯μμμ μμ λ 리μμ€λ₯Ό Kubernetesμμλ μμ
selfHeal: true # Kubernetes 리μμ€κ° λ³κ²½λμμ κ²½μ° Git μνλ‘ μλ 볡ꡬ
syncOptions:
- CreateNamespace=true # λ€μμ€νμ΄μ€(database)κ° μμΌλ©΄ μλμΌλ‘ μμ±
β μ£Όμ μ€λͺ
πΉ 1οΈβ£ νλ‘μ νΈ μμ± (AppProject)
β’ AppProject 리μμ€λ₯Ό μ¬μ©νμ¬ database νλ‘μ νΈλ₯Ό μμ±ν©λλ€.
β’ μ΄ νλ‘μ νΈλ₯Ό ν΅ν΄ μ ν리μΌμ΄μ μ κ·Έλ£Ήννκ³ μ κ·Ό μ μ΄λ₯Ό μνν μ μμ΅λλ€.
β’ sourceRepos: ["*"] β λͺ¨λ Git μ μ₯μμμ μμ€λ₯Ό νμ©ν©λλ€.
β’ destinations: ["database"] β database λ€μμ€νμ΄μ€μ λ°°ν¬λ₯Ό νμ©ν©λλ€.
β’ roles: β νλ‘μ νΈ μμ€μμ μ ν리μΌμ΄μ κ΄λ¦¬ κΆνμ μ€μ ν μ μμ΅λλ€.
πΉ 2οΈβ£ μ ν리μΌμ΄μ μ μ (Application)
β’ chromadb μ ν리μΌμ΄μ μ database νλ‘μ νΈ λ΄μμ κ΄λ¦¬νλλ‘ μ€μ ν©λλ€.
β’ repoURL β GitOps λ°©μμ μ¬μ©νμ¬ μ ν리μΌμ΄μ 맀λνμ€νΈλ₯Ό κ΄λ¦¬ν©λλ€.
β’ path β Helm μ°¨νΈ λλ Kubernetes 맀λνμ€νΈκ° μμΉν Git μ μ₯μ κ²½λ‘λ₯Ό μ§μ ν©λλ€.
β’ destination β μ ν리μΌμ΄μ μ΄ λ°°ν¬λ Kubernetes ν΄λ¬μ€ν°μ λ€μμ€νμ΄μ€λ₯Ό μ€μ ν©λλ€.
β’ syncPolicy β μ ν리μΌμ΄μ μ μλ λκΈ°ν μ μ± μ μ€μ νμ¬ GitOpsλ₯Ό κ°νν©λλ€.
π μ μ© λ°©λ²
μ YAMLμ μ μ©νλ €λ©΄ kubectl apply -f λͺ λ Ήμ΄λ₯Ό μ€νν©λλ€.
kubectl apply -f application.yaml
π‘ μμ μΆλ ₯ κ°
appproject.argoproj.io/database created
application.argoproj.io/chromadb created
πΉ κ²°λ‘ : μ΄λ² κΈμμ λ°°μ΄ ν΅μ¬ λ΄μ© μ 리
π’ Argo CD μ ν리μΌμ΄μ
μ Application CRDλ₯Ό ν΅ν΄ μ μλλ©°, GitOps μμΉμ λ°λΌ λμ
π’ YAML 맀λνμ€νΈμμ metadata, source, destination, syncPolicyλ₯Ό μ€μ νμ¬ λ°°ν¬λ₯Ό μλν κ°λ₯
π’ Helm, Kustomize λ±μ λ€μν λ°°ν¬ λ°©μμ μ§μνλ©°, CLIλ₯Ό μ¬μ©ν΄ μ ν리μΌμ΄μ
μ μμ±ν μλ μμ
π’ μλ λκΈ°ν(Automated Sync) λ° Prune μ΅μ
μ νμ©νμ¬ Kubernetes 리μμ€μ μνλ₯Ό μ μ§ κ°λ₯