๐Ÿ“ฆ

๐Ÿ“ฆ Docker Hub ์ œํ•œ ํƒˆ์ถœ โ€” ์˜จํ”„๋ ˆ๋ฏธ์Šค Nexus Registry ๊ตฌ์ถ•๊ธฐ

์ตœ๋ฏผ์„ยท2026-03-05

๐Ÿ“ฆ Docker Hub ์ œํ•œ ํƒˆ์ถœ โ€” ์˜จํ”„๋ ˆ๋ฏธ์Šค Nexus Registry ๊ตฌ์ถ•๊ธฐ

Docker Hub์˜ Free ํ”Œ๋žœ์—์„œ๋Š” Private Repository๋ฅผ 1๊ฐœ๋งŒ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค. ์„œ๋น„์Šค๊ฐ€ ํ•˜๋‚˜์ผ ๋•Œ๋Š” ๋ฌธ์ œ๊ฐ€ ์—†์ง€๋งŒ, backend์™€ frontend์ฒ˜๋Ÿผ ์ด๋ฏธ์ง€๊ฐ€ 2๊ฐœ ์ด์ƒ ํ•„์š”ํ•ด์ง€๋ฉด ์œ ๋ฃŒ ํ”Œ๋žœ์„ ๊ณ ๋ คํ•˜๊ฑฐ๋‚˜, ์ž์ฒด Registry๋ฅผ ์šด์˜ํ•ด์•ผ ํ•œ๋‹ค.

์ด ๊ธ€์—์„œ๋Š” ์˜จํ”„๋ ˆ๋ฏธ์Šค Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์— Nexus Repository Manager๋ฅผ ๋ฐฐํฌํ•˜๊ณ , ๊ธฐ์กด Docker Hub ๊ธฐ๋ฐ˜ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ Nexus๋กœ ์ „ํ™˜ํ•œ ๊ณผ์ •์„ ์ •๋ฆฌํ•œ๋‹ค.

๊ธฐ์กด ๊ตฌ์กฐ์™€ ๋ฌธ์ œ์ 

๊ธฐ์กด์—๋Š” Jenkins(Kaniko)๊ฐ€ Docker Hub์— ์ด๋ฏธ์ง€๋ฅผ pushํ•˜๊ณ , ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ Docker Hub์—์„œ pullํ•˜๋Š” ๊ตฌ์กฐ์˜€๋‹ค.

graph LR A[Jenkins / Kaniko] -->|push| B[Docker Hub] B -->|pull| C[K8s Pod]

์ด ๊ตฌ์กฐ์˜ ๋ฌธ์ œ:

  • Private Repository 1๊ฐœ ์ œํ•œ (Free ํ”Œ๋žœ): backend, frontend ๋‘ ์ด๋ฏธ์ง€๋ฅผ private์œผ๋กœ ๊ด€๋ฆฌํ•  ์ˆ˜ ์—†์Œ
  • Pull Rate Limit: ์ต๋ช… 100 pulls/6h, ์ธ์ฆ 200 pulls/6h
  • ์™ธ๋ถ€ ์˜์กด์„ฑ: Docker Hub ์žฅ์•  ์‹œ ๋ฐฐํฌ ๋ถˆ๊ฐ€

์™œ Nexus์ธ๊ฐ€

์ž์ฒด Docker Registry๋ฅผ ์šด์˜ํ•˜๋Š” ์„ ํƒ์ง€๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.

์†”๋ฃจ์…˜ ์žฅ์  ๋‹จ์ 
Docker Registry (OSS) ๊ฐ€๋ณ๊ณ  ๋‹จ์ˆœ UI ์—†์Œ, ๊ธฐ๋Šฅ ์ตœ์†Œ
Harbor ๋ณด์•ˆ ์Šค์บ๋‹, RBAC ๋ฆฌ์†Œ์Šค ๋ฌด๊ฑฐ์›€, PostgreSQL/Redis ํ•„์š”
Nexus Docker ์™ธ Maven/npm ๋“ฑ ๋‹ค๋ชฉ์ , ๊ฐ€๋ฒผ์šด ๋‹จ์ผ ์ธ์Šคํ„ด์Šค ์ผ๋ถ€ ๊ธฐ๋Šฅ Pro ํ•œ์ •

๊ฐœ์ธ ์ธํ”„๋ผ ๊ทœ๋ชจ์—์„œ๋Š” ๋‹จ์ผ ์ธ์Šคํ„ด์Šค๋กœ ์šด์˜ ๊ฐ€๋Šฅํ•˜๊ณ , Docker ์™ธ ๋‹ค๋ฅธ ํŒจํ‚ค์ง€ ์ €์žฅ์†Œ๋„ ๊ฒธํ•  ์ˆ˜ ์žˆ๋Š” Nexus๊ฐ€ ์ ํ•ฉํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ์— Nexus ๋ฐฐํฌํ•˜๊ธฐ

ArgoCD + Helm ๋ฐฐํฌ ๊ตฌ์„ฑ

๊ธฐ์กด ์ธํ”„๋ผ๊ฐ€ ArgoCD์˜ App of Apps ํŒจํ„ด์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, Nexus๋„ ๋™์ผํ•˜๊ฒŒ ๊ตฌ์„ฑํ–ˆ๋‹ค.

๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ:

argocd-cluster/
โ”œโ”€โ”€ nexus/
โ”‚   โ”œโ”€โ”€ values.yaml              # Helm values
โ”‚   โ””โ”€โ”€ manifests/
โ”‚       โ””โ”€โ”€ pvc.yaml             # PVC (๋ณ„๋„ ๊ด€๋ฆฌ)
โ”œโ”€โ”€ argocd/addons/apps/
โ”‚   โ””โ”€โ”€ nexus.yaml               # ArgoCD Application
โ””โ”€โ”€ routes/nexus/
    โ”œโ”€โ”€ httproute-nexus.yaml     # nexus.minseoky.me (Web UI)
    โ”œโ”€โ”€ httproute-registry.yaml  # registry.minseoky.me (Docker API)
    โ””โ”€โ”€ ...

ArgoCD Application ์ •์˜

Jenkins์™€ ๋™์ผํ•œ multi-source ํŒจํ„ด์„ ์‚ฌ์šฉํ–ˆ๋‹ค. Helm chart + values.yaml ์ฐธ์กฐ + ์ถ”๊ฐ€ ๋งค๋‹ˆํŽ˜์ŠคํŠธ(PVC)๋ฅผ 3๊ฐœ์˜ source๋กœ ๊ตฌ์„ฑํ•œ๋‹ค.

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: nexus
  namespace: argocd
spec:
  project: default
  destination:
    server: https://kubernetes.default.svc
    namespace: nexus
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
    syncOptions:
      - CreateNamespace=true
  sources:
    - repoURL: https://sonatype.github.io/helm3-charts/
      chart: nexus-repository-manager
      targetRevision: 64.2.0
      helm:
        releaseName: nexus
        valueFiles:
          - $values/nexus/values.yaml
    - repoURL: https://github.com/minseoky/argocd-cluster.git
      targetRevision: prod
      ref: values
    - repoURL: https://github.com/minseoky/argocd-cluster.git
      targetRevision: prod
      path: nexus/manifests

Helm Values

image:
  repository: sonatype/nexus3
  tag: "3.89.1"

nexus:
  docker:
    enabled: true
    registries:
      - host: null
        port: 5000

  env:
    - name: INSTALL4J_ADD_VM_PARAMS
      value: "-Xms1g -Xmx2g -XX:MaxDirectMemorySize=2g"

resources:
  requests:
    cpu: "500m"
    memory: "2Gi"
  limits:
    cpu: "2"
    memory: "4Gi"

persistence:
  enabled: true
  existingClaim: nexus-data

deploymentStrategy: Recreate

ํ•ต์‹ฌ ํฌ์ธํŠธ:

  • ์ด๋ฏธ์ง€ ๋ฒ„์ „: 3.89.1 ์‚ฌ์šฉ. ๊ตฌ ๋ฒ„์ „(3.64.0)์€ ๋ณด์•ˆ ์ทจ์•ฝ์  ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋˜๋ฉฐ, 3.68.0 ์ด์ „ ๋ฒ„์ „์—์„œ ์ƒ์„ฑ๋œ OrientDB ๋ฐ์ดํ„ฐ๋Š” ์ตœ์‹  ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค.
  • Docker registry ํฌํŠธ: 5000๋ฒˆ์œผ๋กœ ์„ค์ •. Helm ์ฐจํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ๋ณ„๋„ Service๋ฅผ ์ƒ์„ฑํ•ด์ค€๋‹ค.
  • existingClaim: Helm ์ฐจํŠธ๊ฐ€ PVC annotation์„ ์ง€์›ํ•˜์ง€ ์•Š์•„, PVC๋ฅผ ๋ณ„๋„ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋กœ ๋ถ„๋ฆฌํ–ˆ๋‹ค.
  • Recreate ์ „๋žต: Nexus๋Š” ๋‹จ์ผ ์ธ์Šคํ„ด์Šค์ด๋ฏ€๋กœ RollingUpdate ๋ถˆ๊ฐ€.

PVC์™€ NFS ์Šคํ† ๋ฆฌ์ง€

ํด๋Ÿฌ์Šคํ„ฐ๋Š” NFS ๋™์  ํ”„๋กœ๋น„์ €๋‹(nfs-client StorageClass)์„ ์‚ฌ์šฉํ•œ๋‹ค. PVC๋ฅผ ๋ณ„๋„๋กœ ์ƒ์„ฑํ•˜๊ณ  existingClaim์œผ๋กœ ์ฐธ์กฐํ•˜๋Š” ์ด์œ ๋Š”, Helm ์ฐจํŠธ๊ฐ€ PVC์— ์ปค์Šคํ…€ annotation์„ ๋„ฃ๋Š” ๊ฒƒ์„ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nexus-data
  namespace: nexus
  annotations:
    nfs.io/storage-path: "nexus-data"
spec:
  accessModes: [ReadWriteOnce]
  storageClassName: nfs-client
  resources:
    requests:
      storage: 50Gi

NFS ํŠน์„ฑ์ƒ PVC์— ์„ค์ •ํ•œ ์šฉ๋Ÿ‰(50Gi)์€ ๋…ผ๋ฆฌ์  ์„ ์–ธ์ผ ๋ฟ, ์‹ค์ œ๋กœ๋Š” NAS ์ „์ฒด ๋ณผ๋ฅจ์ด ๋งˆ์šดํŠธ๋œ๋‹ค. Nexus UI์—์„œ๋„ Blob Store ์šฉ๋Ÿ‰์ด NAS ์ „์ฒด ์šฉ๋Ÿ‰์œผ๋กœ ํ‘œ์‹œ๋œ๋‹ค.

๋ฐ์ดํ„ฐ ์•ˆ์ „์„ฑ ์ธก๋ฉด์—์„œ๋Š” StorageClass์˜ reclaimPolicy: Retain + archiveOnDelete: true ์„ค์ • ๋•๋ถ„์—, PVC๋ฅผ ์‚ญ์ œํ•ด๋„ NAS ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ archived- ์ ‘๋‘์‚ฌ๋กœ ๋ณด์กด๋œ๋‹ค.

Nexus ๋ฐ์ดํ„ฐ ์˜์†์„ฑ

Nexus์˜ ๋ชจ๋“  ๋ฐ์ดํ„ฐ(์„ค์ •, ์‚ฌ์šฉ์ž, ๋น„๋ฐ€๋ฒˆํ˜ธ, Blob Store)๋Š” /nexus-data/ ์— ์ €์žฅ๋˜๋ฉฐ, ์ด ๊ฒฝ๋กœ๊ฐ€ PVC์— ๋งˆ์šดํŠธ๋œ๋‹ค.

  • admin ๋น„๋ฐ€๋ฒˆํ˜ธ: ์ตœ์ดˆ ๊ธฐ๋™ ์‹œ /nexus-data/admin.password ํŒŒ์ผ๋กœ ์ƒ์„ฑ. UI์—์„œ ๋ณ€๊ฒฝํ•˜๋ฉด ํŒŒ์ผ์ด ์‚ญ์ œ๋˜๊ณ  H2 DB์— ์ €์žฅ๋จ.
  • Pod ์žฌ์‹œ์ž‘: PVC๊ฐ€ ์œ ์ง€๋˜๋Š” ํ•œ ๋ชจ๋“  ์„ค์ •์ด ๋ณด์กด๋œ๋‹ค.

Gateway์™€ HTTPRoute ๊ตฌ์„ฑ

์™ธ๋ถ€ ์ ‘๊ทผ์„ ์œ„ํ•ด ๋‘ ๊ฐœ์˜ ์„œ๋ธŒ๋„๋ฉ”์ธ์„ ๊ตฌ์„ฑํ–ˆ๋‹ค.

์„œ๋ธŒ๋„๋ฉ”์ธ ์šฉ๋„ ๋ฐฑ์—”๋“œ Service ํฌํŠธ
nexus.minseoky.me Web UI / REST API nexus-nexus-repository-manager 8081
registry.minseoky.me Docker push/pull nexus-nexus-repository-manager-docker-5000 5000

Web UI์™€ Docker Registry๋ฅผ ๋ถ„๋ฆฌํ•œ ์ด์œ ๋Š”, Docker ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ „์šฉ ํฌํŠธ(5000)๋กœ ํ†ต์‹ ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๊ฐ™์€ ๋„๋ฉ”์ธ์— ๋น„ํ‘œ์ค€ ํฌํŠธ๋ฅผ ์“ฐ๋Š” ๊ฒƒ๋ณด๋‹ค, ๋ณ„๋„ ์„œ๋ธŒ๋„๋ฉ”์ธ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๊ธฐ์กด Gateway ์™€์ผ๋“œ์นด๋“œ(*.minseoky.me) ๋ฆฌ์Šค๋„ˆ๋ฅผ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์–ด ๊น”๋”ํ•˜๋‹ค.

# Docker Registry์šฉ HTTPRoute
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: nexus-registry
  namespace: nexus
spec:
  parentRefs:
    - name: gw-public
      namespace: gateway
      sectionName: https
  hostnames:
    - registry.minseoky.me
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /
      backendRefs:
        - name: nexus-nexus-repository-manager-docker-5000
          port: 5000

CI/CD ํŒŒ์ดํ”„๋ผ์ธ ์ „ํ™˜

๋ณ€๊ฒฝ ์ „ vs ๋ณ€๊ฒฝ ํ›„

graph LR subgraph ๋ณ€๊ฒฝ ์ „ A1[Kaniko] -->|push| B1[Docker Hub] B1 -->|pull| C1[K8s Pod] end
graph LR subgraph ๋ณ€๊ฒฝ ํ›„ A2[Kaniko] -->|push| B2[Nexus Registry] B2 -->|pull| C2[K8s Pod] end

Jenkinsfile ๋ณ€๊ฒฝ

๋ณ€๊ฒฝ ํฌ์ธํŠธ๋Š” Build & Push ๋‹จ๊ณ„์™€ Deploy ๋‹จ๊ณ„ ๋‘ ๊ณณ์ด๋‹ค.

Build & Push โ€” ์ธ์ฆ ๋Œ€์ƒ๊ณผ destination ๋ณ€๊ฒฝ:

// ๋ณ€๊ฒฝ ์ „
withCredentials([usernamePassword(
    credentialsId: 'docker-hub-credentials',
    usernameVariable: 'DOCKER_USER',
    passwordVariable: 'DOCKER_PASS'
)]) {
    sh '''
        echo '{"auths":{"https://index.docker.io/v1/":{"username":"..."}}}' \
            > /kaniko/.docker/config.json
        /kaniko/executor \
            --destination=$DOCKER_USER/pullab-backend:$VERSION
    '''
}

// ๋ณ€๊ฒฝ ํ›„
withCredentials([usernamePassword(
    credentialsId: 'nexus-registry-credentials',
    usernameVariable: 'REGISTRY_USER',
    passwordVariable: 'REGISTRY_PASS'
)]) {
    sh '''
        echo '{"auths":{"registry.minseoky.me":{"username":"..."}}}' \
            > /kaniko/.docker/config.json
        /kaniko/executor \
            --destination=registry.minseoky.me/pullab-backend:$VERSION
    '''
}

Deploy โ€” sed ํŒจํ„ด ๋ณ€๊ฒฝ:

// ๋ณ€๊ฒฝ ์ „
sed -i 's|image: minseoky/pullab-backend:.*|...|'

// ๋ณ€๊ฒฝ ํ›„
sed -i 's|image: .*pullab-backend:.*|image: registry.minseoky.me/pullab-backend:'"$VERSION"'|'

sed ํŒจํ„ด์„ .*pullab-backend๋กœ ๋ณ€๊ฒฝํ•˜์—ฌ, ์ด์ „ ๊ฒฝ๋กœ(minseoky/)๋“  ์ƒˆ ๊ฒฝ๋กœ(registry.minseoky.me/)๋“  ๋ชจ๋‘ ๋งค์นญ๋˜๋„๋ก ํ–ˆ๋‹ค.

Deployment ๋งค๋‹ˆํŽ˜์ŠคํŠธ ๋ณ€๊ฒฝ

์ด๋ฏธ์ง€ ๊ฒฝ๋กœ ๋ณ€๊ฒฝ๊ณผ ํ•จ๊ป˜ imagePullSecrets๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•œ๋‹ค. Nexus๋Š” ์ธ์ฆ์ด ํ•„์š”ํ•œ private registry์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

spec:
  template:
    spec:
      imagePullSecrets:
        - name: nexus-pull-secret    # ๊ฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์ˆ˜๋™ ์ƒ์„ฑ
      containers:
        - image: registry.minseoky.me/pullab-backend:0.1.58

pull secret์€ ์ด๋ฏธ์ง€๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋งˆ๋‹ค ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค:

kubectl create secret docker-registry nexus-pull-secret \
  -n <namespace> \
  --docker-server=registry.minseoky.me \
  --docker-username=admin \
  --docker-password=<password>

๋ฐฐํฌ ๊ณผ์ •์—์„œ ๋งŒ๋‚œ ์ด์Šˆ๋“ค

OrientDB ํ˜ธํ™˜์„ฑ ๋ฌธ์ œ

Helm ์ฐจํŠธ ๊ธฐ๋ณธ ๋ฒ„์ „(3.64.0)์œผ๋กœ ์ตœ์ดˆ ๊ธฐ๋™ํ•œ ํ›„, ๋ณด์•ˆ ์ทจ์•ฝ์  ๊ฒฝ๊ณ ๊ฐ€ ํ‘œ์‹œ๋˜์–ด 3.89.1๋กœ ์—…๊ทธ๋ ˆ์ด๋“œํ–ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ Pod๊ฐ€ CrashLoopBackOff์— ๋น ์กŒ๋‹ค.

This instance is using a legacy Orient database.
You must migrate to H2 or PostgreSQL before upgrading to this version.

3.64.0์ด OrientDB๋กœ ์ดˆ๊ธฐํ™”ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ PVC์— ๋‚จ์•„ ์žˆ์—ˆ๊ณ , 3.89.1์€ OrientDB๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ์‹ ๊ทœ ์„ค์น˜์˜€์œผ๋ฏ€๋กœ PVC ๋ฐ์ดํ„ฐ๋ฅผ ์ •๋ฆฌํ•˜๊ณ  ์žฌ์‹œ์ž‘ํ•˜์—ฌ ํ•ด๊ฒฐํ–ˆ๋‹ค.

๊ตํ›ˆ: Nexus ๋ฒ„์ „์„ ์˜ฌ๋ฆด ๋•Œ๋Š” DB ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ฐ˜๋“œ์‹œ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

Blob Store ์ดˆ๊ธฐํ™” ๋ˆ„๋ฝ

PVC ๋ฐ์ดํ„ฐ ์ •๋ฆฌ ์‹œ blobs ๋””๋ ‰ํ† ๋ฆฌ๊นŒ์ง€ ์‚ญ์ œ๋˜์–ด, Nexus ๊ธฐ๋™ ํ›„ ๊ธฐ๋ณธ Blob Store(default)๊ฐ€ "not available" ์ƒํƒœ๊ฐ€ ๋๋‹ค. Pod๋ฅผ ์žฌ์‹œ์ž‘ํ•˜์—ฌ ์ž๋™ ๋ณต๊ตฌ๋˜์—ˆ๋‹ค.

์ตœ์ข… ๊ตฌ์กฐ

graph TD subgraph CI J[Jenkins] --> K[Kaniko Container] K -->|push| N[Nexus Registry<br/>registry.minseoky.me] end subgraph GitOps K -->|update image tag| G[argocd-cluster repo] G --> A[ArgoCD] end subgraph Cluster A -->|sync| D[Deployment] D -->|pull| N end

์ •๋ฆฌ

ํ•ญ๋ชฉ ๋ณ€๊ฒฝ ์ „ ๋ณ€๊ฒฝ ํ›„
Registry Docker Hub Nexus (์ž์ฒด ํ˜ธ์ŠคํŒ…)
Private Image ์ œํ•œ 1๊ฐœ ๋ฌด์ œํ•œ
Pull Rate Limit 200/6h ์—†์Œ
์ด๋ฏธ์ง€ ์ „์†ก ์™ธ๋ถ€ ์ธํ„ฐ๋„ท ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ
์ถ”๊ฐ€ ๋น„์šฉ ์œ ๋ฃŒ ํ”Œ๋žœ ํ•„์š” ์‹œ ์—†์Œ (NAS ์Šคํ† ๋ฆฌ์ง€ ํ™œ์šฉ)
๊ด€๋ฆฌ ๋ถ€๋‹ด ์—†์Œ Nexus ์šด์˜ ํ•„์š”

Docker Hub์˜ ์ œํ•œ์„ ํ•ด๊ฒฐํ•˜๋ฉด์„œ, ์ด๋ฏธ์ง€๊ฐ€ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ์—์„œ ์ „์†ก๋˜๋ฏ€๋กœ pull ์†๋„๋„ ๋นจ๋ผ์กŒ๋‹ค. ๊ธฐ์กด ArgoCD + Helm ํŒจํ„ด์„ ๊ทธ๋Œ€๋กœ ํ™œ์šฉํ•˜์—ฌ ์ถ”๊ฐ€ ์šด์˜ ๋ณต์žก๋„๋„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.