Kubernetes Tools/ArgoCD

[Ep.19] [Argo CD ๋ฐฐํฌ & ์ž๋™ํ™” #4] Argo CD์™€ ์™ธ๋ถ€ ์‹œํฌ๋ฆฟ ๊ด€๋ฆฌ(Sealed Secrets & External Secrets)

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

๐Ÿ”น ์‹œํฌ๋ฆฟ(Secret) ๊ด€๋ฆฌ๋ž€?

Kubernetes์—์„œ๋Š” ์‹œํฌ๋ฆฟ(Secret) ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API ํ‚ค, ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋น„๋ฐ€๋ฒˆํ˜ธ, ์ธ์ฆ ํ† ํฐ ๋“ฑ์˜ ๋ฏผ๊ฐํ•œ ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ Kubernetes์˜ ๊ธฐ๋ณธ Secret ๋ฆฌ์†Œ์Šค๋Š” Base64 ์ธ์ฝ”๋”ฉ๋œ ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜๋ฏ€๋กœ ๋ณด์•ˆ์— ์ทจ์•ฝํ•ฉ๋‹ˆ๋‹ค.

 

โœ… GitOps ํ™˜๊ฒฝ์—์„œ ์‹œํฌ๋ฆฟ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ด€๋ฆฌํ•˜๋ ค๋ฉด?
โœ” Git ์ €์žฅ์†Œ์— ์‹œํฌ๋ฆฟ์„ ์ง์ ‘ ์ €์žฅํ•˜๋ฉด ์•ˆ ๋จ
โœ” GitOps ๊ธฐ๋ฐ˜์˜ CI/CD ํŒŒ์ดํ”„๋ผ์ธ์—์„œ๋„ ๋ณด์•ˆ์„ฑ์„ ์œ ์ง€ํ•ด์•ผ ํ•จ
โœ” ๋ณ€๊ฒฝ๋œ ์‹œํฌ๋ฆฟ์ด ์ž๋™์œผ๋กœ Kubernetes์— ๋ฐ˜์˜๋˜๋„๋ก ๊ตฌ์„ฑํ•ด์•ผ ํ•จ

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Sealed Secrets๊ณผ External Secrets ๊ฐ™์€ ์†”๋ฃจ์…˜์„ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๐Ÿ”น ๊ธฐ๋ณธ Kubernetes Secret์˜ ํ•œ๊ณ„

Kubernetes์˜ ๊ธฐ๋ณธ Secret ๋ฆฌ์†Œ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ •์˜๋ฉ๋‹ˆ๋‹ค.

apiVersion: v1
kind: Secret
metadata:
  name: my-secret
  namespace: default
type: Opaque
data:
  username: YWRtaW4=  # "admin"์„ Base64 ์ธ์ฝ”๋”ฉ
  password: cGFzc3dvcmQ=  # "password"๋ฅผ Base64 ์ธ์ฝ”๋”ฉ

 

โœ… ๋ฌธ์ œ์ :
โŒ Base64 ์ธ์ฝ”๋”ฉ์ด๋ฏ€๋กœ ์‰ฝ๊ฒŒ ๋””์ฝ”๋”ฉ ๊ฐ€๋Šฅ โ†’ ๋ณด์•ˆ ์ทจ์•ฝ
โŒ GitOps ํ™˜๊ฒฝ์—์„œ Secret์„ Git์— ์ €์žฅํ•  ์ˆ˜ ์—†์Œ
โŒ Secret ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด GitOps ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์ž๋™์œผ๋กœ ๋ฐ˜์˜๋˜์ง€ ์•Š์Œ

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Sealed Secrets๊ณผ External Secrets์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.


๐Ÿ”น Sealed Secrets: Git ์ €์žฅ์†Œ์— ์•ˆ์ „ํ•˜๊ฒŒ ์‹œํฌ๋ฆฟ ์ €์žฅ

Sealed Secrets๋Š” Bitnami์˜ Sealed Secrets ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Git ์ €์žฅ์†Œ์— ์•ˆ์ „ํ•˜๊ฒŒ ์‹œํฌ๋ฆฟ์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
์ด ๋ฐฉ์‹์—์„œ๋Š” Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์•”ํ˜ธํ™” ๋ฐ ๋ณตํ˜ธํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

โœ… 1. Sealed Secrets ์ปจํŠธ๋กค๋Ÿฌ ์„ค์น˜

kubectl apply -f https://github.com/bitnami-labs/sealed-secrets/releases/latest/download/controller.yaml

 

โœ… ์„ค์น˜ ํ™•์ธ:

kubectl get pods -n kube-system | grep sealed-secrets

โœ… 2. ์‹œํฌ๋ฆฟ์„ Sealed Secret์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ

kubectl create secret generic my-secret --from-literal=username=admin --from-literal=password=mypassword -n default --dry-run=client -o yaml > my-secret.yaml

 

๐Ÿ”น Sealed Secrets๋กœ ๋ณ€ํ™˜

kubeseal --controller-name=sealed-secrets --controller-namespace=kube-system --format=yaml < my-secret.yaml > my-sealed-secret.yaml

 

โœ… Git ์ €์žฅ์†Œ์— ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” Sealed Secret ์˜ˆ์ œ:

apiVersion: bitnami.com/v1alpha1
kind: SealedSecret
metadata:
  name: my-secret
  namespace: default
spec:
  encryptedData:
    username: AgB0z...encrypted-value...  # ์•”ํ˜ธํ™”๋œ ๊ฐ’
    password: AgC2h...encrypted-value...

 

โœ… ๋ฐฐํฌ ํ›„ Sealed Secret์ด ์ž๋™ ๋ณตํ˜ธํ™”๋จ:

kubectl get secret my-secret -n default -o yaml

 

โœ… Sealed Secrets์˜ ์žฅ์ :
โœ” GitOps์™€ ์™„๋ฒฝํ•˜๊ฒŒ ํ˜ธํ™˜๋จ
โœ” Git ์ €์žฅ์†Œ์— ์ €์žฅํ•ด๋„ ์•ˆ์ „ํ•จ (๋ณตํ˜ธํ™” ๋ถˆ๊ฐ€๋Šฅ)
โœ” Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ž๋™ ๋ณตํ˜ธํ™” ๊ฐ€๋Šฅ


๐Ÿ”น External Secrets: ์™ธ๋ถ€ ๋น„๋ฐ€ ์ €์žฅ์†Œ์™€ ์—ฐ๋™

External Secrets์€ AWS Secrets Manager, HashiCorp Vault, Azure Key Vault ๊ฐ™์€ ์™ธ๋ถ€ ์‹œํฌ๋ฆฟ ์ €์žฅ์†Œ๋ฅผ Kubernetes ์‹œํฌ๋ฆฟ๊ณผ ์—ฐ๋™ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค.
์ฆ‰, ์‹œํฌ๋ฆฟ์„ Kubernetes๊ฐ€ ์•„๋‹Œ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜์˜ ์•ˆ์ „ํ•œ ์ €์žฅ์†Œ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โœ… 1. External Secrets Operator ์„ค์น˜

kubectl apply -f https://github.com/external-secrets/external-secrets/releases/latest/download/install.yaml

 

โœ… ์„ค์น˜ ํ™•์ธ:

kubectl get pods -n external-secrets

โœ… 2. AWS Secrets Manager์™€ ์—ฐ๋™ ์˜ˆ์ œ

โœ… AWS IAM ์ •์ฑ… ์ถ”๊ฐ€ (AWS CLI ์‚ฌ์šฉ)

aws iam attach-role-policy --role-name my-role --policy-arn arn:aws:iam::aws:policy/AmazonSecretsManagerReadOnly

 

โœ… Kubernetes์—์„œ AWS Secrets Manager ์—ฐ๋™ ์„ค์ •

apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata:
  name: my-external-secret
  namespace: default
spec:
  refreshInterval: 1h  # 1์‹œ๊ฐ„๋งˆ๋‹ค ์‹œํฌ๋ฆฟ์„ ๋™๊ธฐํ™”
  secretStoreRef:
    name: my-secret-store
    kind: ClusterSecretStore
  target:
    name: my-secret  # Kubernetes์—์„œ ์ƒ์„ฑ๋  ์‹œํฌ๋ฆฟ ์ด๋ฆ„
  data:
    - secretKey: password  # Kubernetes ์‹œํฌ๋ฆฟ์—์„œ ์‚ฌ์šฉ๋  ํ‚ค
      remoteRef:
        key: my-secret-key  # AWS Secrets Manager์˜ ํ‚ค

 

โœ… External Secrets์˜ ์žฅ์ :
โœ” ์‹œํฌ๋ฆฟ์„ Git ์ €์žฅ์†Œ์— ์ €์žฅํ•  ํ•„์š” ์—†์Œ
โœ” ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜์˜ ๋ณด์•ˆ ๊ธฐ๋Šฅ์„ ํ™œ์šฉ ๊ฐ€๋Šฅ
โœ” ์ž๋™ ๋™๊ธฐํ™”๋กœ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ฆ‰์‹œ ๋ฐ˜์˜๋จ


๐Ÿ”น Argo CD์—์„œ Sealed Secrets ๋ฐ External Secrets ๊ด€๋ฆฌ

Argo CD๋Š” GitOps ๋ฐฉ์‹์œผ๋กœ Sealed Secrets ๋ฐ External Secrets์„ ์ž๋™ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

โœ… Sealed Secrets ๊ด€๋ฆฌ ์˜ˆ์ œ

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: sealed-secrets
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/repo.git
    targetRevision: main
    path: secrets
  destination:
    server: https://kubernetes.default.svc
    namespace: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

 

โœ… External Secrets ๊ด€๋ฆฌ ์˜ˆ์ œ

apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: external-secrets
  namespace: argocd
spec:
  project: default
  source:
    repoURL: https://github.com/example/repo.git
    targetRevision: main
    path: external-secrets
  destination:
    server: https://kubernetes.default.svc
    namespace: default
  syncPolicy:
    automated:
      prune: true
      selfHeal: true

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

๐ŸŸข ๊ธฐ๋ณธ Kubernetes Secret์€ ๋ณด์•ˆ์ด ์ทจ์•ฝํ•˜์—ฌ GitOps ํ™˜๊ฒฝ์—์„œ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ค์›€
๐ŸŸข Sealed Secrets๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์‹œํฌ๋ฆฟ์„ Git ์ €์žฅ์†Œ์— ์•ˆ์ „ํ•˜๊ฒŒ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ
๐ŸŸข External Secrets๋Š” AWS Secrets Manager, Vault ๋“ฑ์˜ ์™ธ๋ถ€ ์‹œํฌ๋ฆฟ ์ €์žฅ์†Œ์™€ Kubernetes๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ์Œ
๐ŸŸข Argo CD๋Š” Sealed Secrets ๋ฐ External Secrets๊ณผ ์™„๋ฒฝํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด GitOps ํ™˜๊ฒฝ์—์„œ ์•ˆ์ „ํ•œ ๋ฐฐํฌ๋ฅผ ์ง€์›

 

728x90