[K8s] ConfigMap & Secret: 설정과 비밀의 분리
ConfigMap, Secret, env from, volume mount config, Sealed Secret, External Secrets, SOPS
정의
| ConfigMap | Secret | |
|---|---|---|
| 데이터 | 평문 | base64 (암호화 아님) |
| 크기 | 1MB | 1MB |
| 용도 | 설정 | 비밀 |
| RBAC | 일반 | 더 엄격 권장 |
| 저장 (etcd) | 평문 | 암호화 가능 (EncryptionConfiguration) |
IMPORTANT
Secret = base64 만으로는 암호화 아님. etcd encryption at rest + RBAC 으로 보호.
ConfigMap 예시
apiVersion: v1
kind: ConfigMap
metadata: { name: app-config }
data:
log_level: "info"
db_host: "db.production"
feature_flags: |
new_ui: true
beta_search: false
Secret 예시
apiVersion: v1
kind: Secret
metadata: { name: db-creds }
type: Opaque
data:
username: a29h # base64(koa)
password: cGFzc3dvcmQ= # base64(password)
Pod 에서 사용
1. 환경 변수
spec:
containers:
- name: app
image: app:v1
env:
- name: LOG_LEVEL
valueFrom:
configMapKeyRef: { name: app-config, key: log_level }
- name: DB_PASSWORD
valueFrom:
secretKeyRef: { name: db-creds, key: password }
envFrom:
- configMapRef: { name: app-config } # 전체 import
- secretRef: { name: db-creds }
2. Volume mount
spec:
containers:
- name: app
volumeMounts:
- name: config-vol
mountPath: /etc/config
- name: secret-vol
mountPath: /etc/secrets
readOnly: true
volumes:
- name: config-vol
configMap: { name: app-config }
- name: secret-vol
secret: { secretName: db-creds }
TIP
Volume mount 의 장점: ConfigMap 갱신 → 자동 반영 (수십 초). env var 는 pod 재시작 필요.
Secret 관리 패턴 (절대 git 에 평문 금지!)
flowchart TD
Q{Secret 관리}
Q --> S1["Sealed Secrets (Bitnami)"]
Q --> S2[External Secrets Operator]
Q --> S3[SOPS + git]
Q --> S4[Vault Agent / CSI driver]
Q --> S5["클라우드 시크릿 (AWS Secrets Manager 등)"]
1. Sealed Secrets
# 일반 secret 작성
kubectl create secret generic db --from-literal=password=xxx --dry-run -o yaml > secret.yaml
# kubeseal 로 암호화 (cluster 의 public key 사용)
kubeseal -f secret.yaml -w sealed-secret.yaml
# sealed-secret.yaml 은 git 에 안전하게 commit 가능
2. External Secrets Operator
apiVersion: external-secrets.io/v1beta1
kind: ExternalSecret
metadata: { name: db-creds }
spec:
refreshInterval: 1h
secretStoreRef:
name: aws-secrets-manager
kind: ClusterSecretStore
target: { name: db-creds }
data:
- secretKey: password
remoteRef: { key: prod/db, property: password }
AWS Secrets Manager / GCP Secret Manager / Vault 에서 동기화.
3. SOPS
git 에 암호화된 YAML commit. KMS / age 키로 복호화.
흔한 함정
WARNING
echo secret | base64가 암호화 라고 오해 = base64 는 인코딩일 뿐. 디코드 1줄.- Secret 을 git 에 평문 = 치명적. SOPS / Sealed Secrets / ExternalSecret 으로.
- etcd encryption at rest 안 켬 = root 권한자가 etcd 직접 → 모든 secret 노출.
- 너무 큰 ConfigMap (1MB+) = 거절. 큰 데이터는 volume (PVC, S3 mount).
- env var 갱신 안 됨 = ConfigMap 변경 후 pod 재시작 필요. volume mount 는 자동.
관련 위키
이 글의 용어 (4개)
- [AWS] KMS: 암호화 키 관리, envelope encryptioncloud
- 정의 KMS (Key Management Service) = 암호화 키 중앙 관리. envelope encryption + IAM 통합 + 감사 로그. 키 종류 | 종류 | 의미…
- [AWS] Secrets Manager + Parameter Storecloud
- 정의 | | Secrets Manager | Parameter Store (SSM) | |---|---|---| | 가격 | $0.40/secret/월 + $0.05/10k AP…
- [K8s] Deployment: ReplicaSet, rolling update, rollbackkubernetes
- 정의 Deployment = stateless 워크로드를 위한 컨트롤러. 내부적으로 ReplicaSet 관리 + rolling update / rollback. 계층 | 객체 |…
- [K8s] Pod: 컨테이너의 최소 단위, sidecar, lifecyclekubernetes
- 정의 Pod = K8s 의 가장 작은 배포 단위. 1개 이상의 컨테이너 + 공유 네트워크 + 공유 스토리지. [!IMPORTANT] Pod 는 컨테이너의 wrapping 이 아니…
💬 댓글