Helm
쿠버 설정의 모양과 값을 갈라 복붙을 없앤다.
한눈에
- 차트 = 쿠버 YAML의 템플릿 묶음. values.yaml = 그 빈칸을 채우는 값
- 서비스가 늘어도 차트는 한 벌. 서비스마다 다른 건 values 뿐
- 환경(dev·stg·prod)은 values 파일이 가른다. 이미지는 다시 안 만든다
- replicas·CPU·메모리·이미지 태그가 전부 values.yaml 안에 있다
- helm template 로 렌더 결과를 먼저 눈으로 보고 적용한다
- {{ }} 는 Go 템플릿 문법. .Values 가 values.yaml 을 가리킨다
쿠버네티스에 서비스 하나를 올리려면 YAML이 여러 장 필요하다. Deployment, Service, Ingress, ConfigMap, HPA. 서비스가 다섯이면 그게 다섯 벌이 된다.
그런데 다섯 벌을 나란히 놓고 보면 서로 다른 건 이름과 숫자 몇 개뿐이다. 나머지는 전부 같다. 복붙으로 늘리다 보면 어느 순간 다섯 벌이 조금씩 어긋나 있고, 무엇이 의도된 차이이고 무엇이 실수인지 아무도 모르게 된다.
모양과 값을 가른다
Helm이 하는 일은 이 한 가지다.
# templates/deployment.yaml 모양. 값이 빈칸이다
spec:
replicas: {{ .Values.replicaCount }}
template:
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
resources:
{{- toYaml .Values.resources | nindent 12 }}
# values.yaml 값. 이 파일만 서비스마다 · 환경마다 다르다
replicaCount: 3
image:
repository: registry.example.com/my-app
tag: "main-250827-79f1"
pullPolicy: IfNotPresent
resources:
requests: { cpu: 500m, memory: 1Gi }
limits: { cpu: "2", memory: 4Gi }
{{ }} 안은 Go 템플릿 문법이다. .Values가 values.yaml을 가리키고, .Chart는 차트 자신의 메타(이름·버전)를 가리킨다.
차트 한 벌에 values 여러 벌

환경을 가르는 건 파이프라인이 아니라 values 파일이다.
charts/base-chart/ 차트 한 벌
Chart.yaml 이름 · 버전
values.yaml 기본값
templates/ 모양들
envs/dev/values.yaml replicaCount 1, 메모리 1Gi
envs/prod/values.yaml replicaCount 3, 메모리 4Gi
이미지는 환경마다 다시 만들지 않는다. 개발에서 검증한 그 이미지가 그대로 운영에 올라가야 "같은 것을 검증했다"가 성립한다. 다시 빌드하는 순간 검증이 뜻을 잃는다.
값이 겹칠 때 누가 이기나
Helm은 값을 여러 층으로 받는다. 아래로 갈수록 세다.
--set 이 제일 세다는 게 편해 보이지만, 명령줄로 넘긴 값은 Git에 안 남는다. 그래서 실무에서는 되도록 파일로 넘긴다. 지금 도는 것이 어느 값으로 떴는지를 나중에 추적할 수 있어야 하기 때문이다.
적용하기 전에 눈으로 본다
Helm에서 제일 자주 쓰게 되는 명령이다.
helm template my-app ./base-chart -f envs/prod/values.yaml
클러스터에 아무것도 안 하고 렌더 결과만 화면에 뱉는다. 템플릿을 고쳤을 때 실제 YAML이 어떻게 나오는지 먼저 보는 용도다. 들여쓰기가 어긋나거나 값이 비어 null로 나오는 것이 여기서 대부분 잡힌다.
helm install my-app ./base-chart -f envs/prod/values.yaml # 처음 올릴 때
helm upgrade my-app ./base-chart -f envs/prod/values.yaml # 이후
helm rollback my-app 3 # 3번 리비전으로
ArgoCD를 쓰면 위 install·upgrade를 사람이 안 친다. ArgoCD가 차트와 values를 읽어 렌더하고 적용하는 일까지 한다. 그래도 helm template은 계속 쓴다. 그건 배포가 아니라 확인이다.
자주 걸리는 것
이것만 남기면 된다
Pod을 몇 개 띄울지, CPU와 메모리를 얼마나 줄지, 어느 이미지를 쓸지가 전부 values.yaml 안에 있다. 인프라 설정을 안다는 것은 결국 이 파일의 숫자에 근거를 댈 수 있다는 뜻이다.
그 숫자를 어떻게 정하는지는 쿠버네티스 노트의 자원 배분 절에 있고, 전체 배포 흐름에서 Helm이 어디에 서는지는 DevOps와 CI/CD에 있다.