본문 바로가기

DevOps

[AWS EKS] (28) EKS 스터디 10주차 (Vault + ArgoCD Plugin 패턴)

  • Argo CD에는 다양한 시크릿 관리 도구(HashiCorp Vault, IBM Cloud Secrets Manager, AWS Secrets Manager 등)플러그인을 통해 Kubernetes 리소스에 주입할 수 있도록 지원합니다.
  • 플러그인을 통해 Operator 또는 CRD(Custom Resource Definition)에 의존하지 않고 GitOps와 Argo CD로 시크릿 관리 문제를 해결할 수 있습니다.
  • 특히 Secret 뿐만 아니라, deployment, configMap 또는 기타 Kubernetes 리소스에도 사용할 수 있습니다.
CloudNet@팀의 EKS 스터디 AEWS 2기에 작성된 자료를 토대로 작성합니다.

 

  1. 사이드카 컨테이너를 통한 설치:
    • 사이드카 컨테이너를 추가하여 플러그인과 필요한 도구들을 포함시킵니다.
    • 또는 플러그인이 사전 설치된 커스텀 사이드카 이미지를 생성하여 사용합니다.

사이드카 컨테이너를 활용한 방법은 Argo CD v2.4.0부터 도입된 최신 방식으로, 보안성과 유지보수 측면에서 권장됩니다.

 

Vault + ArgoCD Plugin 패턴 실습

Step 1. ArgoCD Vault Plugin을 위한 Credentials 활성화 - AppRole 인증

# ttl이 1시간이기 때문에 새로 만들었습니다.
vault write auth/approle/role/sampleapp-role3 \
  token_policies="sampleapp-policy" \
  secret_id_ttl="1h" \
  token_ttl="1h" \
  token_max_ttl="4h"

Success! Data written to: auth/approle/role/sampleapp-role3

ROLE_ID=$(vault read -field=role_id auth/approle/role/sampleapp-role3/role-id)
SECRET_ID=$(vault write -f -field=secret_id auth/approle/role/sampleapp-role3/secret-id)


echo "ROLE_ID: $ROLE_ID"
echo "SECRET_ID: $SECRET_ID"

ROLE_ID: 0e8596ea-b507-fb08-1566-6bfa252751f1
SECRET_ID: 222b9c83-9584-5472-745e-9814086c39c9
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: 0e8596ea-b507-fb08-1566-6bfa252751f1 #Role_ID
  AVP_SECRET_ID: 222b9c83-9584-5472-745e-9814086c39c9 #Secret_ID
EOF

Step 2. ArgoCD Vault Plugin 설치 - Blog

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

# 예전 문법으로 적용된 부분을 edit fix 명령으로 현행화
# kustomize edit fix

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

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

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

Step 3. 샘플 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