ConfigMap과 Secret
Kubernetes 설정 관리와 민감 정보 처리 완벽 가이드
Kubernetes 설정 관리와 민감 정보 처리 완벽 가이드
목표: 애플리케이션 설정을 안전하고 유연하게 관리할 수 있는 수준
📋 ConfigMap
역할
비민감 설정 데이터를 저장.
- 환경변수
- 설정 파일
- 명령줄 인자
생성 방법
# 1. 명령줄에서 직접 생성
kubectl create configmap my-config \
--from-literal=APP_ENV=production \
--from-literal=LOG_LEVEL=info
# 2. 파일에서 생성
kubectl create configmap my-config \
--from-file=app.properties \
--from-file=config.json
# 3. 디렉토리에서 생성
kubectl create configmap my-config \
--from-file=config/
# 4. YAML로 생성
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: ConfigMap
metadata:
name: my-config
data:
APP_ENV: "production"
LOG_LEVEL: "info"
database.properties: |
host=mysql
port=3306
EOF
Pod에서 사용
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: app
image: my-app:latest
# 방법 1: 환경변수로 주입
env:
- name: APP_ENV
valueFrom:
configMapKeyRef:
name: my-config
key: APP_ENV
# 방법 2: 모든 키를 환경변수로
envFrom:
- configMapRef:
name: my-config
# 방법 3: 볼륨으로 마운트
volumeMounts:
- name: config-vol
mountPath: /etc/config
volumes:
- name: config-vol
configMap:
name: my-config
🔐 Secret
역할
민감 정보를 안전하게 저장.
- 비밀번호
- API 키
- TLS 인증서
- Docker Registry 인증
Base64 인코딩
# 인코딩
echo -n 'my-password' | base64
# bXktcGFzc3dvcmQ=
# 디코딩
echo 'bXktcGFzc3dvcmQ=' | base64 -d
Secret 생성
# 1. 명령줄에서 생성
echo -n 'my-password' | kubectl create secret generic db-password \
--from-file=password=/dev/stdin
# 2. TLS 인증서
kubectl create secret tls my-tls \
--cert=server.crt --key=server.key
# 3. Docker Registry
kubectl create secret docker-registry regcred \
--docker-server=https://index.docker.io/v1/ \
--docker-username=USER \
--docker-password=PASS
# 4. YAML로 생성 (base64 인코딩 필요)
cat <<EOF | kubectl apply -f -
apiVersion: v1
kind: Secret
metadata:
name: db-password
type: Opaque
data:
password: bXktcGFzc3dvcmQ=
EOF
Pod에서 사용
apiVersion: v1
kind: Pod
metadata:
name: my-pod
spec:
containers:
- name: app
image: my-app:latest
# 방법 1: 환경변수로 주입
env:
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-password
key: password
# 방법 2: 볼륨으로 마운트
volumeMounts:
- name: secret-vol
mountPath: /etc/secrets
readOnly: true
volumes:
- name: secret-vol
secret:
secretName: db-password
🔒 보안 고려사항
Secret의 한계
graph TB
subgraph "⚠️ 주의"
A["Secret은 etcd에 저장됨"]
B["base64 인코딩 ≠ 암호화"]
C["Pod 내부에서 메모리에 노출"]
end
보안 강화
# 1. etcd 암호화 활성화
# /etc/kubernetes/manifests/kube-apiserver.yaml
--encryption-provider-config=/etc/kubernetes/encryption-config.yaml
# 2. RBAC으로 Secret 접근 제한
kubectl create role secret-reader --verb=get --resource=secrets
# 3. 외부 Secret 관리 (Vault)
# HashiCorp Vault, AWS Secrets Manager 등
📋 ConfigMap vs Secret 비교
| 특징 | ConfigMap | Secret |
|---|---|---|
| 용도 | 비민감 설정 | 민감 정보 |
| 저장 | Plain Text | Base64 |
| 크기 제한 | 1MB | 1MB |
| etcd 암호화 | 선택적 | 권장 |
| 환경변수 주입 | 가능 | 가능 |
| 볼륨 마운트 | 가능 | 가능 |
🔗 관련 노트
- 01-04-Deployment-관리 — 워크로드 배포
- 02-09-RBAC-설정 — 권한 관리
- 02-04-NetworkPolicy — TLS, mTLS
마지막 업데이트: 2026-06-01