Kubernetes에서 Vault 사용하기

Kubernetes에서 Vault 사용하기

🔟 Kubernetes에서 Vault 사용하기

Vault는 시크릿을 안전하게 관리하는 강력한 도구입니다. Kubernetes와 통합하면 Pod에 시크릿을 안전하게 자동 주입하거나 마운트할 수 있으며, 동적으로 갱신 가능한 보안 환경을 구축할 수 있습니다.

이 글에서는 Vault를 Kubernetes에서 사용하는 다양한 방법과 그 차이점, 실제 예제를 함께 다뤄보겠습니다.


1. Vault Agent Injector 패턴

Vault Agent Injector는 Kubernetes Admission Webhook을 활용하여 Pod에 자동으로 Vault Agent 사이드카를 주입해줍니다.

  • Vault Agent는 Vault에서 시크릿을 가져와 지정된 파일로 저장하거나 환경 변수로 전달합니다.
  • 주입되는 Vault Agent는 자동 인증(Token)과 갱신(Renewal)을 지원합니다.

🖼️ 아키텍처 구성도

┌────────────┐
│   Vault    │
└────┬───────┘
     │  (Auto Auth)
┌────▼─────┐        Injected
│ Vault Agent │<────────────────┐
└────┬─────┘                     │
     │   (fetch secrets)        │
┌────▼────┐                     │
│   App    │────────────────────┘
└──────────┘

🧪 예제: 어노테이션 기반 시크릿 자동 주입

apiVersion: v1
kind: Pod
metadata:
  name: vault-injected-app
  annotations:
    vault.hashicorp.com/agent-inject: "true"
    vault.hashicorp.com/role: "demo-role"
    vault.hashicorp.com/agent-inject-secret-config.txt: "secret/data/db-creds"
spec:
  containers:
    - name: app
      image: busybox
      command: ["cat", "/vault/secrets/config.txt"]
  • Vault에서 secret/data/db-creds에 접근하여 내용을 /vault/secrets/config.txt로 주입
  • Vault Agent는 토큰 갱신 및 시크릿 TTL에 따라 재로딩 가능

2. CSI 드라이버 기반 시크릿 마운트

Vault는 CSI(Container Storage Interface) 드라이버를 통해 시크릿을 볼륨으로 마운트할 수 있습니다.

  • Init 컨테이너가 시크릿을 먼저 가져오고, 해당 내용을 파일로 Pod에 마운트합니다.
  • Vault 인증은 Kubernetes ServiceAccount를 사용

🖼️ 구조 예시

[ Pod ]
 ├─ app-container
 └─ volumes:
     └─ /vault/secrets/db-creds
         └─ username, password (from Vault)

🧪 예제: CSI Vault Secret 마운트

apiVersion: v1
kind: Pod
metadata:
  name: csi-vault-app
spec:
  serviceAccountName: demo-sa
  containers:
    - name: app
      image: busybox
      command: ["cat", "/vault/secrets/username"]
      volumeMounts:
        - name: vault-secrets
          mountPath: "/vault/secrets"
          readOnly: true
  volumes:
    - name: vault-secrets
      csi:
        driver: secrets-store.csi.k8s.io
        readOnly: true
        volumeAttributes:
          secretProviderClass: "vault-db-creds"

3. Sidecar 방식 vs initContainer 방식

방식 설명 장점 단점
Sidecar (Agent Injector) Vault Agent가 사이드카로 계속 실행 시크릿 자동 갱신, TTL 처리 가능 리소스 사용 증가
initContainer 시크릿을 초기 한 번만 가져옴 리소스 절약, 간단함 갱신 불가, 재시작 필요
CSI Driver 외부 볼륨으로 시크릿 주입 커뮤니티 기반 유지, 재사용 쉬움 복잡한 구성 시 트러블슈팅 필요

4. 예제: Pod가 DB credentials 자동 주입받기

1️⃣ Vault 시크릿 생성

vault kv put secret/db-creds username="admin" password="s3cret123"

2️⃣ Kubernetes Role 및 Auth 설정

vault auth enable kubernetes
vault write auth/kubernetes/role/demo-role \
    bound_service_account_names=demo-sa \
    bound_service_account_namespaces=default \
    policies=default \
    ttl=1h

3️⃣ 애플리케이션 배포

apiVersion: v1
kind: Pod
metadata:
  name: db-app
  annotations:
    vault.hashicorp.com/agent-inject: "true"
    vault.hashicorp.com/role: "demo-role"
    vault.hashicorp.com/agent-inject-secret-db.txt: "secret/data/db-creds"
spec:
  serviceAccountName: demo-sa
  containers:
    - name: app
      image: busybox
      command: ["sh", "-c", "cat /vault/secrets/db.txt; sleep 3600"]
  • /vault/secrets/db.txt 안에 username, password 포함된 파일이 자동 생성

✅ 정리

항목 내용
Vault Agent Injector 사이드카로 Vault Agent 자동 주입
CSI Driver 시크릿을 파일로 Pod에 마운트
Sidecar vs Init 갱신 유무에 따라 사용 방식 결정
실전 예제 DB 크리덴셜을 Pod에 자동으로 주입

RSS Feed
마지막 수정일자