Kubernetes Tools/ArgoCD

[Ep.36] [Argo CD ์šด์˜ ์ตœ์ ํ™” #6] Argo CD์—์„œ Secret ๋ฐ ConfigMap ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๊ธฐ

ygtoken 2025. 3. 17. 13:13
728x90

๐Ÿ”น 1. Argo CD์—์„œ ConfigMap์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

โœ… ํ™˜๊ฒฝ๋ณ„ ConfigMap ์ ์šฉ (Kustomize ํ™œ์šฉ)

๐Ÿ“Œ ๊ธฐ๋ณธ ConfigMap (base/configmap.yaml)

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config  # ConfigMap ์ด๋ฆ„
data:
  LOG_LEVEL: "info"  # ๊ธฐ๋ณธ ๋กœ๊ทธ ๋ ˆ๋ฒจ
  DATABASE_URL: "postgres://db:5432/dev"  # ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค URL

 

๐Ÿ“Œ ์šด์˜ ํ™˜๊ฒฝ ์˜ค๋ฒ„๋ ˆ์ด (overlays/prod/kustomization.yaml)

apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
bases:
  - ../../base  # ๊ธฐ๋ณธ ConfigMap์„ ์ฐธ์กฐ

patches:  # ์šด์˜ ํ™˜๊ฒฝ์— ๋งž๊ฒŒ ์„ค์ • ๋ณ€๊ฒฝ
  - target:
      kind: ConfigMap
      name: app-config
    patch: |-
      - op: replace
        path: /data/LOG_LEVEL
        value: "error"  # ์šด์˜ ํ™˜๊ฒฝ์—์„œ๋Š” ๋กœ๊ทธ ๋ ˆ๋ฒจ์„ "error"๋กœ ๋ณ€๊ฒฝ
      - op: replace
        path: /data/DATABASE_URL
        value: "postgres://db:5432/prod"  # ์šด์˜ ํ™˜๊ฒฝ DB URL ์ ์šฉ

 

๐Ÿ“Œ Argo CD์—์„œ Kustomize ๊ธฐ๋ฐ˜์œผ๋กœ ConfigMap์„ ๊ด€๋ฆฌํ•˜๋Š” Application ์ •์˜

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: example-configmap-app  # Argo CD์—์„œ ๊ด€๋ฆฌํ•  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„
  namespace: argocd  # Argo CD๊ฐ€ ๋ฐฐํฌํ•  ๋„ค์ž„์ŠคํŽ˜์ด์Šค
spec:
  project: default
  source:
    repoURL: https://github.com/example/repo.git  # Git ์ €์žฅ์†Œ URL
    targetRevision: main  # ์‚ฌ์šฉํ•  Git ๋ธŒ๋žœ์น˜
    path: kustomize/overlays/prod  # ์šด์˜ ํ™˜๊ฒฝ ConfigMap ์ ์šฉ
  destination:
    server: https://kubernetes.default.svc  # ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์ฃผ์†Œ
    namespace: example  # ๋ฐฐํฌํ•  ๋„ค์ž„์ŠคํŽ˜์ด์Šค
  syncPolicy:
    automated:
      prune: true  # Git์—์„œ ์‚ญ์ œ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ Kubernetes์—์„œ๋„ ์‚ญ์ œ
      selfHeal: true  # Kubernetes ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฒฝ์šฐ Git ์ƒํƒœ๋กœ ์ž๋™ ๋ณต๊ตฌ

๐Ÿ”น 2. Argo CD์—์„œ Secret์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•

GitOps ํ™˜๊ฒฝ์—์„œ๋Š” Secret์„ ์ง์ ‘ Git ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๋Š” ๊ฒƒ์ด ๋ณด์•ˆ์ƒ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Sealed Secrets ๋˜๋Š” External Secrets์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… ๋ฐฉ๋ฒ• 1: Sealed Secrets์„ ํ™œ์šฉํ•œ Secret ๊ด€๋ฆฌ

๐Ÿ“Œ Sealed Secrets ์ปจํŠธ๋กค๋Ÿฌ ์„ค์น˜ (Helm Chart ์‚ฌ์šฉ)

helm install sealed-secrets bitnami-labs/sealed-secrets -n kube-system

 

๐Ÿ“Œ Sealed Secrets๋ฅผ ํ™œ์šฉํ•œ ์•”ํ˜ธํ™”๋œ Secret ์ƒ์„ฑ

kubectl create secret generic db-secret --from-literal=DB_PASSWORD='supersecret' -n example
kubectl label secret db-secret sealedsecrets.bitnami.com/sealed="true"  # Sealed Secrets ์ ์šฉ
kubeseal --format yaml < db-secret.yaml > sealed-secret.yaml  # Secret์„ ์•”ํ˜ธํ™”ํ•˜์—ฌ Git์— ์ €์žฅ ๊ฐ€๋Šฅ

 

๐Ÿ“Œ Git์— ์ €์žฅํ•  ์•”ํ˜ธํ™”๋œ Sealed Secret ์˜ˆ์ œ

apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
  name: db-secret  # Sealed Secret ์ด๋ฆ„
  namespace: example
spec:
  encryptedData:
    DB_PASSWORD: AgAGXt...  # ์•”ํ˜ธํ™”๋œ ๋ฐ์ดํ„ฐ (๋ณตํ˜ธํ™” ๋ถˆ๊ฐ€)

 

๐Ÿ“Œ Argo CD์—์„œ Sealed Secrets๋ฅผ ํ™œ์šฉํ•œ Application ์ •์˜

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: example-sealed-secrets  # Argo CD์—์„œ ๊ด€๋ฆฌํ•  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/repo.git  # Git ์ €์žฅ์†Œ URL
    targetRevision: main  # ์‚ฌ์šฉํ•  Git ๋ธŒ๋žœ์น˜
    path: sealed-secrets  # Sealed Secrets์ด ์ €์žฅ๋œ ๊ฒฝ๋กœ
  destination:
    server: https://kubernetes.default.svc  # ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์ฃผ์†Œ
    namespace: example  # ๋ฐฐํฌํ•  ๋„ค์ž„์ŠคํŽ˜์ด์Šค
  syncPolicy:
    automated:
      prune: true  # Git์—์„œ ์‚ญ์ œ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ Kubernetes์—์„œ๋„ ์‚ญ์ œ
      selfHeal: true  # Kubernetes ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฒฝ์šฐ Git ์ƒํƒœ๋กœ ์ž๋™ ๋ณต๊ตฌ

โœ… ๋ฐฉ๋ฒ• 2: External Secrets์„ ํ™œ์šฉํ•œ Secret ๊ด€๋ฆฌ

๐Ÿ“Œ External Secrets ์ปจํŠธ๋กค๋Ÿฌ ์„ค์น˜

helm install external-secrets external-secrets/external-secrets -n kube-system

 

๐Ÿ“Œ AWS Secrets Manager๋ฅผ ํ™œ์šฉํ•œ Secret ์—ฐ๋™ ์˜ˆ์ œ

apiVersion: external-secrets.io/v1alpha1
kind: ExternalSecret
metadata:
  name: db-secret  # External Secret ์ด๋ฆ„
  namespace: example
spec:
  secretStoreRef:
    name: aws-secrets  # AWS Secrets Manager์™€ ์—ฐ๋™
    kind: ClusterSecretStore
  target:
    name: db-secret  # ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค Secret์œผ๋กœ ์ƒ์„ฑํ•  ์ด๋ฆ„
    creationPolicy: Owner  # Secret์ด ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด ์ƒ์„ฑ
  data:
    - secretKey: DB_PASSWORD  # ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค Secret์—์„œ ์‚ฌ์šฉํ•  ํ‚ค
      remoteRef:
        key: production/db-password  # AWS Secrets Manager์— ์ €์žฅ๋œ Secret ํ‚ค

 

๐Ÿ“Œ Argo CD์—์„œ External Secrets๋ฅผ ํ™œ์šฉํ•œ Application ์ •์˜

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: example-external-secrets  # Argo CD์—์„œ ๊ด€๋ฆฌํ•  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ด๋ฆ„
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/repo.git  # Git ์ €์žฅ์†Œ URL
    targetRevision: main  # ์‚ฌ์šฉํ•  Git ๋ธŒ๋žœ์น˜
    path: external-secrets  # External Secrets ์„ค์ •์ด ์ €์žฅ๋œ ๊ฒฝ๋กœ
  destination:
    server: https://kubernetes.default.svc  # ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ์ฃผ์†Œ
    namespace: example  # ๋ฐฐํฌํ•  ๋„ค์ž„์ŠคํŽ˜์ด์Šค
  syncPolicy:
    automated:
      prune: true  # Git์—์„œ ์‚ญ์ œ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ Kubernetes์—์„œ๋„ ์‚ญ์ œ
      selfHeal: true  # Kubernetes ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๊ฒฝ์šฐ Git ์ƒํƒœ๋กœ ์ž๋™ ๋ณต๊ตฌ

๐Ÿ”น 4. Secret ๋ฐ ConfigMap ์šด์˜ ์‹œ ๊ณ ๋ คํ•  ์ 

โœ… 1๏ธโƒฃ GitOps ๋ณด์•ˆ ์›์น™ ์ค€์ˆ˜
โœ” Secret์„ Git์— ์ง์ ‘ ์ €์žฅํ•˜์ง€ ๋ง๊ณ , Sealed Secrets ๋˜๋Š” External Secrets์„ ์‚ฌ์šฉ

 

โœ… 2๏ธโƒฃ ํ™˜๊ฒฝ๋ณ„ ConfigMap ๊ด€๋ฆฌ ์ „๋žต
โœ” Kustomize ์˜ค๋ฒ„๋ ˆ์ด๋ฅผ ํ™œ์šฉํ•˜์—ฌ Dev, Staging, Prod ํ™˜๊ฒฝ์„ ๋ถ„๋ฆฌ

 

โœ… 3๏ธโƒฃ CI/CD ํŒŒ์ดํ”„๋ผ์ธ ์—ฐ๋™
โœ” Sealed Secrets ์•”ํ˜ธํ™”๋ฅผ ์ž๋™ํ™”ํ•˜๊ณ , External Secrets์„ ํ†ตํ•œ ์™ธ๋ถ€ ์ธ์ฆ ๊ด€๋ฆฌ

 

โœ… 4๏ธโƒฃ Argo CD์™€ ์—ฐ๋™ํ•˜์—ฌ ์ž๋™ํ™” ์œ ์ง€
โœ” selfHeal: true ์˜ต์…˜์„ ํ™œ์„ฑํ™”ํ•˜์—ฌ Secret์ด ์†์ƒ๋  ๊ฒฝ์šฐ ์ž๋™ ๋ณต๊ตฌ


๐Ÿ”น ๊ฒฐ๋ก : ์ด๋ฒˆ ๊ธ€์—์„œ ๋ฐฐ์šด ํ•ต์‹ฌ ๋‚ด์šฉ ์ •๋ฆฌ

๐ŸŸข Kubernetes์˜ ConfigMap๊ณผ Secret์„ GitOps ๋ฐฉ์‹์œผ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šต
๐ŸŸข Sealed Secrets, External Secrets์„ ํ™œ์šฉํ•˜์—ฌ GitOps ๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ๊ฐ€๋Šฅ
๐ŸŸข ํ™˜๊ฒฝ๋ณ„ ConfigMap์„ Kustomize๋ฅผ ํ†ตํ•ด ๋ถ„๋ฆฌํ•˜์—ฌ ์œ ์—ฐํ•˜๊ฒŒ ์šด์˜ ๊ฐ€๋Šฅ
๐ŸŸข GitOps ์›์น™์„ ์œ ์ง€ํ•˜๋ฉด์„œ๋„ Secret์„ ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•˜๊ณ  ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ ์šฉ ๊ฐ€๋Šฅ

728x90