ConfigMap과 Secret 이해하기
설정값을 코드에서 분리하는 방법
- 애플리케이션을 컨테이너로 실행하다 보면 환경마다 달라지는 값들이 생긴다.
- DB 주소, 포트, 비밀번호 같은 것들. 이걸 이미지 안에 하드코딩하면 값이 바뀔 때마다 이미지를 새로 빌드해야 한다.
- 쿠버네티스는 이 문제를 ConfigMap과 Secret으로 해결한다.
- 설정값을 별도 오브젝트에 저장하고, Pod가 시작될 때 환경변수로 주입하는 방식이다.
ConfigMap — 일반 설정값 보관함
ConfigMap은 평문으로 값을 저장한다. DB 호스트, 포트, 설정 경로 같이 민감하지 않은 정보에 쓴다.
만드는 방법은 두 가지다. 명령어로 직접 만들거나, yaml 파일로 선언하거나.
# 명령어로 생성
kubectl create configmap my-config \
--from-literal=DB_HOST=192.168.0.57 \
--from-literal=DB_PORT=5432
만들어진 ConfigMap 확인:
kubectl get configmap my-config -o yaml
apiVersion: v1
data:
DB_HOST: 192.168.0.57
DB_PORT: "5432"
kind: ConfigMap
metadata:
name: my-config
값이 평문으로 그대로 보인다.
Secret — 민감한 값 보관함
Secret은 비밀번호, API 키처럼 노출되면 안 되는 값에 쓴다. 구조는 ConfigMap과 동일하지만 값이 Base64로 인코딩되어 저장된다.
kubectl create secret generic my-secret \
--from-literal=DB_PASSWORD=mypassword
확인하면 값이 인코딩되어 있다:
kubectl get secret my-secret -o yaml
apiVersion: v1
data:
DB_PASSWORD: bXlwYXNzd29yZA== # Base64 인코딩
kind: Secret
type: Opaque
Base64는 암호화가 아니다. 디코딩하면 바로 원본이 나온다. 실수로 화면에 노출되는 것을 방지하는 수준이다.
echo "bXlwYXNzd29yZA==" | base64 -d
# mypassword
Pod에 주입하기
ConfigMap과 Secret 모두 Deployment yaml의 envFrom으로 주입한다.
spec:
containers:
- image: nginx:1.27
name: nginx
envFrom:
- configMapRef:
name: my-config # ConfigMap 주입
- secretRef:
name: my-secret # Secret 주입
Pod가 시작될 때 두 오브젝트의 값이 모두 환경변수로 들어온다.
주입된 환경변수 확인:
kubectl exec deploy/nginx-configmap -- env | grep -E "DB|PASSWORD"
DB_HOST=192.168.0.57
DB_PORT=5432
DB_PASSWORD=mypassword
[ 캡처 - kubectl exec 환경변수 확인 결과 ]
값 수정하는 방법
ConfigMap이나 Secret 값을 바꿀 때는 kubectl edit으로 수정하고, Deployment를 재시작해야 한다.
kubectl edit configmap my-config
kubectl rollout restart deployment nginx-configmap
ConfigMap과 Secret은 자체적으로 실행되는 프로세스가 없다. 값만 저장하는 보관함이기 때문에 재시작 개념이 없다. Pod(Deployment)가 재시작되어야 새 값을 읽어온다.
ConfigMap vs Secret 비교
| ConfigMap | Secret | |
|---|---|---|
| 용도 | 일반 설정값 | 비밀번호, API 키 |
| 저장 방식 | 평문 | Base64 인코딩 |
| 주입 방법 | configMapRef | secretRef |
| yaml 키워드 | kind: ConfigMap | kind: Secret |
다음 파트는 PV/PVC — 컨테이너가 재시작되어도 데이터가 사라지지 않게 하는 스토리지 연결 방법을 다룬다.
'Kubernetes' 카테고리의 다른 글
| [k8s] pv/pvc ㅡ 이해하기 (0) | 2026.06.09 |
|---|---|
| [k8s] 오브젝트 이해하기 — Ingress (0) | 2026.06.05 |
| [k8s] 오브젝트 이해하기 — Pod, Deployment, Service (0) | 2026.06.05 |
| [k8s] imperative command (0) | 2023.11.09 |
| kubernetes 커맨드 shortcuts (0) | 2023.11.09 |