모험가

AEWS 10주차 - K8S Secret Update(ArgoCD 패턴) 본문

쿠버네티스/AEWS

AEWS 10주차 - K8S Secret Update(ArgoCD 패턴)

라리음 2025. 4. 11. 15:23
본 글은 가시다님이 진행하시는 AEWS(AWS EKS Workshop Study)를 참여하여 정리한 글입니다. 
모르는 부분이 많아서 틀린 내용이 있다면 말씀 부탁드리겠습니다!

 

 

 

 

 


Vault + ArgoCD Plugin 패턴

 

 

💡 배경: GitOps 환경의 Secret 관리 고민

ArgoCD는 GitOps 툴로서 Git 저장소의 상태를 Kubernetes 클러스터에 동기화해 줍니다. 그런데 Secret도 Git에 올려두면?

🚨 큰일 납니다! 민감 정보가 노출될 수 있어요.

그래서 많은 팀이 HashiCorp Vault 같은 외부 Secret Manager를 사용해 민감 정보를 보관하고, 애플리케이션이 실행될 때 동적으로 주입하는 방식을 채택합니다.


🔌 ArgoCD Vault Plugin 이란?

ArgoCD Vault Plugin은 ArgoCD가 Vault로부터 Secret을 읽어와 Kubernetes Manifest에 주입할 수 있게 도와주는 플러그인입니다. Helm이나 Kustomize를 사용하는 앱 배포 시, 템플릿 내에 Vault 경로를 지정하고, 동적으로 값을 채워줍니다.

 

apiVersion: v1
kind: Secret
metadata:
  name: db-secret
type: Opaque
stringData:
  username: "{{ vaultkvpath "secret/data/sampleapp/config" "username" }}"
  password: "{{ vaultkvpath "secret/data/sampleapp/config" "password" }}"

템플릿은 Git에 올라가 있지만 실제 값은 Vault에서 주입되므로 Git에 민감 정보가 저장되지 않습니다.

 

 

🏗️ 구성 아키텍처

                ┌────────────────┐
                │     Vault      │
                └────────┬───────┘
                         │ (AppRole, Token 등)
                         ▼
┌─────────────┐   ┌──────────────┐       ┌────────────────────┐
│   Git Repo  ├──►│   ArgoCD     ├──────►│ Kubernetes Cluster  │
└─────────────┘   │ + Vault Plugin│       └────────────────────┘
                  └──────────────┘

 

  • Vault는 실제 Secret을 저장
  • Git에는 템플릿과 Vault 경로만 저장
  • ArgoCD Vault Plugin이 Git 템플릿을 렌더링할 때 Vault로부터 값을 주입

 

 

🧪 인증 방식: Vault와 ArgoCD의 연결

Vault는 다양한 인증 방식을 제공합니다. 이 중 Kubernetes Auth MethodAppRole 방식이 많이 사용됩니다.

예: AppRole 방식 설정 요약

  1. Vault에서 AppRole 생성 (vault write auth/approle/role/my-role ...)
  2. role_id, secret_id 발급
  3. ArgoCD Vault Plugin Pod에 이 정보 전달 (ConfigMap, Secret, 또는 sidecar agent 방식 등)

✅ 장점 요약

장점 설명
🔐 Git에 Secret 없음 민감한 정보는 Vault에서 관리
🔁 동적 주입 앱 배포 시점에 최신 Secret 자동 주입
⚙️ 다양한 Vault 인증 연동 Kubernetes, AppRole, Token 등 유연한 인증 방식
🔄 GitOps 흐름 유지 GitOps 방식 그대로 유지하면서 보안 강화 가능

🧩 추천 패턴: Sidecar Vault Agent vs ArgoCD Plugin

패턴 특징
ArgoCD Vault Plugin 배포 시점에 Secret을 주입하는 방식 (정적 주입)
Vault Agent Sidecar Pod 실행 시마다 Vault로부터 Secret을 주입하는 방식 (동적 주입)

보안이 중요하지만 주입 주기가 긴 경우 → ArgoCD Vault Plugin
동적으로 Secret이 자주 바뀌는 경우 → Vault Agent Sidecar

 

 

 


 

kubectl apply -f - <<EOF
kind: Secret
apiVersion: v1
metadata:
  name: argocd-vault-plugin-credentials
  namespace: argocd
type: Opaque
stringData:
  VAULT_ADDR: "http://vault.vault:8200"
  AVP_TYPE: "vault"
  AVP_AUTH_TYPE: "approle"
  AVP_ROLE_ID: c0661d63-ca5f-d22d-fb1a-a38382bff931 #Role_ID
  AVP_SECRET_ID: b03c167e-224e-1ea7-463e-1c5fe25fdf94 #Secret_ID
EOF

 

 

 

AgroCD vault Plugin 설치

git clone https://github.com/hyungwook0221/argocd-vault-plugin.git
cd argocd-vault-plugin/manifests/cmp-sidecar

# argocd 네임스페이스 설정
kubens argocd

# 생성될 메니페스트 파일에 대한 확인
kubectl kustomize .

# -k 옵션으로 kusomize 실행
kubectl apply -n argocd -k .

 

 

샘플 Application 배포하여 Vault와 동기화

 

GitHub에 저장된 Helm Repo을 배포하며, Helm 메니페스트 내에 변수로 치환된 값(username/password)을 CD 단계에서 Vault 통해서 읽고 렌더링하여 배포

kubectl apply -n argocd -f - <<EOF
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
  name: demo
  namespace: argocd
  finalizers:
  - resources-finalizer.argocd.argoproj.io
spec:
  destination:
    namespace: argocd
    server: https://kubernetes.default.svc
  project: default
  source:
    path: infra/helm
    repoURL: https://github.com/hyungwook0221/spring-boot-debug-app
    targetRevision: main
    plugin:
      name: argocd-vault-plugin-helm
      env:
        - name: HELM_ARGS
          value: -f new-values.yaml
  syncPolicy:
    automated:
      prune: true
      selfHeal: true
EOF

 

 

 

 

 

이렇게 application을 배포하여 vault와 동기화 되는 것을 확인했습니다.

해당 argocd는 sidecar 형태로 vault와 연동이 되어있습니다. 이후 많은 패턴을 공부해보아야겠습니다.