Helm 결과가 의도한 values와 다르다면, 병합 우선순위를 오해한 것이다
Helm은 여러 values 소스를 정해진 순서로 병합한다. 이 순서를 모르면 “분명히 넣었는데 안 먹는” 드리프트가 생긴다. 배포 전에 실제 병합 결과를 렌더해 보는 습관이 대부분을 막는다.
우선순위 — 뒤가 앞을 이긴다
chart의 values.yaml < -f a.yaml < -f b.yaml(나중 -f) < --set. 여러 -f를 주면 나중 파일이 앞 파일을 덮고, --set이 최우선이다. -f 순서를 바꾸면 결과가 바뀐다.
가장 자주 밟는 함정: 배열은 통째로 교체된다
맵(오브젝트)은 키 단위로 깊게 병합되지만, 배열(리스트)은 병합이 아니라 통째 교체된다. 리스트에 항목 하나 더하려고 override했다가 나머지 항목이 전부 사라지는 실수가 흔하다. 리스트는 “추가”가 아니라 “전체를 다시 쓴다”고 생각해야 한다.
서브차트 값은 이름 아래에 중첩한다
부모에서 서브차트 값을 주려면 <서브차트이름>: 아래에 중첩해야 한다. 평면으로 주면 무시된다. 모든 차트가 공유해야 할 값은 global: 아래에 둔다. 상위 값을 지우려면 빈 문자열이 아니라 null을 준다.
배포 전에 실제 결과 보기
helm template <release> <chart> -f a.yaml -f b.yaml --debug # 렌더 결과 미리보기
helm get values <release> # 이미 배포된 릴리스에 실제 적용된 값
helm get manifest <release> # 클러스터에 들어간 최종 매니페스트
-f 순서·--set → 배열 교체 주의 → 서브차트 중첩 경로 순으로 본다. helm template 한 번이면 드리프트 대부분을 배포 전에 잡는다.
빠른 진단 체크리스트
- 적용값을
helm get values로 실제 확인한다 - 우선순위는 values.yaml < -f < 나중 -f < --set 임을 기억한다
- 여러 -f의 순서가 결과를 바꾸는지 점검한다
- 배열은 병합이 아니라 통째 교체됨을 주의한다
- 서브차트 값은 서브차트 이름 아래에 중첩했는지 본다
- 공유 값은 global: 아래에 두었는지 확인한다
- 상위 값 삭제는 빈 문자열이 아니라 null로 한다
- 배포 전
helm template --debug로 렌더 결과를 본다