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에 자동으로 주입 |
마지막 수정일자