Kubernetes ‐ ConfigMap, Secret - thought-corner/Backend-PlayGround GitHub Wiki
ConfigMap vs Secret 핵심 개념 비교
| 항목 |
ConfigMap (컨피그맵) |
Secret (시크릿) |
| 주요 목적 |
민감하지 않은 일반 설정 데이터 관리 |
패스워드, API 키, SSH 키, TLS 인증서 등 민감 정보 보호 |
| 데이터 형태 |
Plain Text (평문 Key-Value 또는 파일 전체) |
Base64 인코딩된 스트링 (Key-Value) |
| 보안 수준 |
누구나 조회 가능 (설정 분리 목적) |
RBAC을 통한 접근 제어, 메모리(tmpfs) 기반 저장으로 보안 강화 |
| 용량 제한 |
오브젝트당 최대 1MB |
오브젝트당 최대 1MB |
Pod에 데이터를 주입하는 2가지 방식 및 동적 반영(Hot-Reload)의 비밀
- ConfigMap과 Secret 데이터를 파드 내부의 컨테이너로 가져오는 방법은 크게 환경 변수(Environment Variables) 방식과 볼륨 마운트(Volume Mount) 방식으로 나뉜다.
- 이 방식의 선택에 따라 설정 변경 시 앱에 즉시 반영되는지 여부(Hot-Reload)가 결정된다.
환경 변수 주입 방식(env, envFrom)
- 메커니즘 : 파드가 생성(시작)될 때 컨테이너의 OS 환경 변수로 값을 주입한다.
- 장점 : 소스코드에서
System.getenv() 등으로 가져다 쓰기 매우 직관적이고 편리하다.
- 동적 반영 불가능(중요) : 컨피그맵이나 시크릿의 값이 변경되어도, 이미 실행 중인 파드 내의 환경 변수 값은 절대 변하지 않는다. 프로세스가 뜰 때 딱 한 번만 로드되기 때문이다. 값을 변경하려면 파드를 재시작(Rolling Update 등)해야만 한다.
볼륨 마운트 방식(volumes, volumeMounts)
- 메커니즘 : 컨피그맵/시크릿 내용을 가상 파일 시스템으로 만들어 컨테이너 내부의 특정 디렉터리에 파일 형태로 마운트한다.
- 장점 : 대용량 설정 파일(
application.yml, nginx.conf 등)을 통째로 주입할 때 유리하다.
- 동적 반영 가능(Kubelet 주기적 동기화): 컨피그맵이나 시크릿의 데이터가 변경되면,
kubelet이 이를 감지하여 파드 내부에 마운트된 파일의 내용을 실시간(대략 수십 초 내)으로 업데이트해 준다.
- 단, 애플리케이션의 지원 필요 : 파일 자체는 실시간으로 변하지만, 애플리케이션(예: Spring Boot, Go 등)이 그 파일의 변경을 감지하고 재로드(Watch 메커니즘)하는 로직이 구현되어 있어야 진정한 의미의 Hot-Reload가 작동한다.
애플리케이션 배포 및 주입
apiVersion: apps/v1
kind: Deployment
metadata:
name: finance-service
spec:
replicas: 2
selector:
matchLabels:
app: finance-service
template:
metadata:
labels:
app: finance-service
spec:
containers:
- name: main-app
image: financial-platform/api:v2.0.0
# [방식 1] 환경 변수 주입 (Secret 적용 - 재시작 필요)
env:
- name: DATABASE_PASSWORD
valueFrom:
secretKeyRef:
name: app-secret
key: DB_PASSWORD
- name: APP_LOG_LEVEL
valueFrom:
configMapKeyRef:
name: app-config
key: LOG_LEVEL
# [방식 2] 볼륨 마운트 주입 (ConfigMap 적용 - 실시간 동기화 지원)
volumeMounts:
- name: config-volume
mountPath: /app/config # 컨테이너 내부에 /app/config/application.yml 파일이 생성됨
readOnly: true
volumes:
- name: config-volume
configMap:
name: app-config
items:
- key: application.yml
path: application.yml