
쿠버네티스 공식 문서에서는 ConfigMap 을 이렇게 정의한다.
“기밀이 아닌 설정 데이터를 key-value 형태로 저장하는 API 오브젝트이며,
파드에서 환경변수, 커맨드 인자, 볼륨 파일로 소비할 수 있다.”
한 마디로,
이미지 안에 두기 애매한 설정값들을 따로 뽑아놓은 설정 저장소라고 보면 된다.
리소스 타입: ConfigMap (네임스페이스 단위)
저장 형태: data(문자열), binaryData(바이너리)
파드에서 쓰는 방법
솔직히 그냥 파드 YAML 에 환경변수 몇 개 박아 넣거나
이미지 안 설정파일 한 줄 고쳐도 돌아가긴 하는데 왜 굳이 ConfigMap을 쓰지 라는 의문이 들었었다.
그래서 찾아보니 다음과 같은 결론이 나왔다.
그래도 굳이 ConfigMap 을 쓰는 이유는
“코드/이미지랑 설정을 분리해서 운영을 편하게 만들기 위해서”이다.
대표적인 상황 몇 가지를 생각해보면 된다.
예를 들어 애플리케이션이 이런 값들을 가진다고 해보자.
이걸 이미지 안 설정파일에 넣어두면:
ConfigMap 을 쓰면:
즉, “설정 변경 = YAML 수정 + 재시작” 으로 끝난다.
운영 입장에서 훨씬 효율적인 방법인 것이다.
코드는 똑같은데, 환경만 다를 수 있다.
dev
prod
이걸 ConfigMap 두 개로 나누면 된다.
Deployment YAML 은 똑같이 두고,
각 네임스페이스에서 참조하는 ConfigMap 이름만 바꾸면 된다.
envFrom:
- configMapRef:
name: sleepy-config # dev, prod 에서 각자 다른 ConfigMap 으로 매핑
이렇게 하면
이라서 멀티 환경 운영이 쉬워지는 것이다.
예를 들어
여러 worker 파드가 같은
을 써야 하는 상황이라고 가정한다,
각 파드 YAML 안에 똑같은 값들을 복붙해두면:
값 하나 바꿀 때 모든 Deployment 를 찾아서 수정해야 된다.
이럴 경우 실수가 나기 딱 좋다.
코딩이라고 생각하면 어떤 상황인지 이해가 쉽게 될 것이다.
함수마다 똑같은 지역변수에 int var= 10;을 하여 계속 바꾸는 것보다 , 글로벌 변수 하나를 선언해서
가져다 쓰는 느낌인 것이다.
아무튼,
ConfigMap 을 쓰면:
즉, 공통 설정을 중앙집중식으로 관리하는 느낌이다.
먼저 모든 실습에서 같이 쓸 ConfigMap 을 하나 만든다.
파일명: ConfigMap-sleepy-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: sleepy-config
data:
STATUS: "WAKE UP"
NOTE: "TestBed Configuration"
적용&확인 명령어
kubectl apply -f ConfigMap-sleepy-config.yaml
kubectl get configmap sleepy-config -o yaml

data 아래에 STATUS, NOTE 두 개의 key 가 있는 아주 단순한 ConfigMap이 생성 된 것을 확인할 수 있다.

이것은 describe를 사용하여 확인한 결과이다.
첫 번째 패턴은 ConfigMap 의 모든 key 를 그대로 환경변수로 뿌려주는 방식이다.
공식 문서에서도 envFrom.configMapRef 로 예시를 보여준다.
파일명: deploy-configMapRef.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-configmapref
labels:
app: deploy-configmapref
spec:
replicas: 1
selector:
matchLabels:
app: deploy-configmapref
template:
metadata:
labels:
app: deploy-configmapref
spec:
containers:
- name: sleepy
image: sysnet4admin/sleepy
command: ["/bin/sh", "-c"]
args:
- |
echo "sleepy $STATUS"
echo "NOTE: $NOTE"
sleep 3600
envFrom:
- configMapRef:
name: sleepy-config # 아까 만든 ConfigMap 전체를 환경변수로
적용&확인 명령어
kubectl apply -f deploy-configMapRef.yaml
# 파드 이름 확인
kubectl get pods -l app=deploy-configmapref
# 파드 안에서 환경변수 확인
kubectl exec -it deploy-configmapref-78858d77c5-4d6sq -- sh
env | grep -E 'STATUS|NOTE'


echo "sleepy $STATUS"
echo "NOTE: $NOTE"
에서 wake up과 TestBed Configuration가 잘 매핑되는 것을 확인할 수 있다.
두 번째 패턴은 ConfigMap 의 일부 key 만 골라서 다른 이름의 환경변수로 매핑하는 방식이다.
공식 문서에서도 env[].valueFrom.configMapKeyRef 예시로 설명한다.
파일명: deploy-configMapKeyRef.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-configmapkeyref
labels:
app: deploy-configmapkeyref
spec:
replicas: 1
selector:
matchLabels:
app: deploy-configmapkeyref
template:
metadata:
labels:
app: deploy-configmapkeyref
spec:
containers:
- name: sleepy
image: sysnet4admin/sleepy
command: ["/bin/sh", "-c"]
args:
- |
echo "APP_STATUS = $APP_STATUS"
sleep 3600
env:
- name: APP_STATUS
valueFrom:
configMapKeyRef:
name: sleepy-config # ConfigMap 이름
key: STATUS # 그 중 STATUS 키만 가져오기
배포&적용 명령어
kubectl apply -f deploy-configMapKeyRef.yaml
kubectl get pods -l app=deploy-configmapkeyref
kubectl logs -l app=deploy-configmapkeyref

APP_STATUS = WAKE UP라고 뜨는 것을 확인하여
매핑이 잘된 것을 확인할 수 있다.
세 번째 패턴은 ConfigMap 을 볼륨으로 마운트해서 파일처럼 읽는 방식이다.
공식 문서의 “Using ConfigMaps as files from a Pod” 에 해당한다.
파일명: deploy-vol-configMap.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deploy-vol-configmap
spec:
replicas: 1
selector:
matchLabels:
app: deploy-vol-configmap
template:
metadata:
labels:
app: deploy-vol-configmap
spec:
containers:
- name: sleepy
image: sysnet4admin/sleepy
command: ["/bin/sh", "-c"]
args:
- |
echo "===== file list ====="
ls -R /etc/sleepy.d
echo ""
echo "===== file contents ====="
echo "NOTE: $(cat /etc/sleepy.d/NOTE)"
echo "STATUS: $(cat /etc/sleepy.d/STATUS)"
sleep 3600
volumeMounts:
- name: appconfigvol
mountPath: /etc/sleepy.d
volumes:
- name: appconfigvol
configMap:
name: sleepy-config
volumes[].configMap.name: sleepy-config
→ 이 ConfigMap 을 볼륨으로 선언한다.
volumeMounts[].mountPath: /etc/sleepy.d
→ 이 경로 아래에 STATUS, NOTE 파일이 생성된다.
각 파일 내용은 ConfigMap 의 value 와 동일하다.
배포 & 테스트 명령어
kubectl apply -f deploy-vol-configMap.yaml
kubectl get pods -l app=deploy-vol-configmap
kubectl logs -l app=deploy-vol-configmap

이렇게 볼륨 마운트가 잘 되어 로그가 출력이 되는 것을 확인할 수 있다.
공식 문서 기준으로:
볼륨으로 마운트한 ConfigMap
→ kubelet 이 주기적으로 새 값을 가져와서 파일이 자동으로 갱신된다.
환경변수로 주입한 ConfigMap (env, envFrom)
→ 파드가 처음 생성될 때만 값이 들어가고,
ConfigMap 을 바꿔도 이미 떠 있는 파드에는 자동 반영되지 않는다
(파드 재시작/롤링업데이트 필요).
그래서
# ConfigMap 수정 (파일 수정 후 다시 apply)
kubectl apply -f ConfigMap-sleepy-config-chg.yaml
# 디플로이먼트 롤링 재시작
kubectl rollout restart deployment/deploy-configmapref
kubectl logs -l app=deploy-configmapref
# -> sleepy SLEEP AGAIN
| 패턴 | 어떻게 주입? | YAML 키워드 | 컨테이너 안에서 모습 |
|---|---|---|---|
| envFrom 전체 주입 | ConfigMap 의 모든 key 를 환경변수로 사용 | envFrom.configMapRef | STATUS, NOTE 등 key 이름 그대로 환경변수 생성 |
| 특정 key 만 주입 | 필요한 값만 골라서 다른 이름의 env 로 사용 | env[].valueFrom.configMapKeyRef | APP_STATUS 같은 이름으로 원하는 key 만 매핑 |
| 파일로 마운트 | 설정파일처럼 읽고 싶을 때 | volumes[].configMap + volumeMounts[] | /etc/sleepy.d/STATUS, /etc/sleepy.d/NOTE 같은 파일로 생성 |
짧게 정리하자면 각 상황에 맞춰 사용하면 된다.
- “환경변수로 쓰고 싶다” → envFrom 또는 configMapKeyRef
- “파일로 읽고 싶다” → configMap 볼륨 마운트
- “값 바꿨을 때 자동 갱신되길 원한다”
- 볼륨 마운트 → 자동 갱신 (약간의 지연 있음)
- env → 파드 재시작 필요
참고자료:
[Kubernetes 공식 문서 – ConfigMaps]
https://kubernetes.io/ko/docs/concepts/configuration/configmap/