ConfigMap을 바꿨는데 앱이 옛 값을 쓴다 — 쿠버네티스는 자동 재시작하지 않는다
핵심 전제부터 바로잡자. ConfigMap을 수정해도 그 값을 쓰는 Pod는 스스로 재시작하지 않는다. 어떻게 주입했느냐에 따라 “영영 안 바뀜”과 “언젠가 바뀜”으로 갈린다.
env로 주입했다면 — Pod 생성 시점에 박제된다
envFrom/valueFrom.configMapKeyRef로 넣은 값은 컨테이너가 뜰 때 환경변수로 고정된다. ConfigMap을 아무리 바꿔도 그 Pod에는 반영되지 않는다. 반영하려면 Pod를 새로 만들어야 한다.
kubectl rollout restart deploy/<name> -n <ns>
volume으로 마운트했다면 — 갱신되지만 두 가지 함정
- 지연: kubelet의 sync 주기 때문에 파일이 바뀌는 데 수십 초~분이 걸린다. “즉시 안 바뀐다”고 성급히 판단하지 않는다.
- subPath는 아예 안 바뀐다:
subPath로 특정 파일 하나만 마운트하면 그 파일은 업데이트 대상에서 제외된다. 이게 가장 자주 놓치는 함정이다. 디렉터리째 마운트로 바꾸거나 rollout restart로 간다. - 파일이 바뀌어도 앱이 재읽기(hot reload)를 하지 않으면 소용없다. 앱이 SIGHUP이나 watch를 지원하는지 확인한다.
바뀌면 자동으로 롤아웃되게 만드는 패턴
가장 견고한 방법은 ConfigMap 내용의 체크섬을 Pod 템플릿 annotation에 넣는 것이다. 값이 바뀌면 템플릿 해시가 바뀌어 배포가 자동으로 새 Pod를 굴린다.
spec:
template:
metadata:
annotations:
checksum/config: <configmap 내용의 sha256> # Helm 이면 tpl+sha256sum 로 자동화
확인 순서
describe pod로 주입 방식(env인지 volume인지, subPath인지)을 먼저 확인 → env/subPath면 rollout restart → 그 외엔 지연·앱 재읽기 여부. 방식만 정확히 읽으면 “왜 안 바뀌지”는 대개 즉시 풀린다.
빠른 진단 체크리스트
- 쿠버네티스는 ConfigMap 변경 시 Pod를 자동 재시작하지 않는다
- describe pod로 주입 방식(env·volume·subPath)을 먼저 확인한다
- env 주입이면 값이 박제되므로 rollout restart로 재생성한다
- volume 마운트는 갱신이 수십 초~분 지연됨을 감안한다
- subPath 마운트는 아예 갱신되지 않는다(핵심 함정)
- 파일이 바뀌어도 앱이 hot reload를 지원하는지 확인한다
- 체크섬 annotation으로 값 변경 시 자동 롤아웃되게 한다
- 즉시 반영이 필요하면
rollout restart가 가장 확실하다