1. Helm이란 무엇인가
Helm은 Kubernetes의 패키지 매니저로,
여러 개의 리소스를 하나의 애플리케이션 단위로 묶어 관리할 수 있게 해주는 도구입니다.
일반적으로 특정 서비스를 배포할 때 Deployment, Service, ConfigMap 등 여러 YAML 파일을 각각 작성하고 관리해야 하는데, Helm을 사용하면 이 모든 리소스를 하나의 패키지(Chart)로 묶어 버전 관리할 수 있으며 설치·업데이트·삭제까지 쉽게 수행할 수 있습니다.
또한 Helm Chart 내부의 YAML 파일은 템플릿화되어 있어, 변수 값만 변경하면 개발·스테이징·운영 등 다양한 환경에서 쉽게 재사용할 수 있습니다.
Helm의 기본 구성 요소는 다음과 같습니다.
- Chart: Helm 패키지 단위 (템플릿, 설정값을 포함)
- Values.yaml: 템플릿에 전달되는 값이 정의된 파일
- Release: Chart가 실제로 배포되어 클러스터에 생성된 인스턴스
2. Helm으로 ConfigMap 변경 자동 적용하기
2-1. ConfigMap 변경 시 Pod가 자동으로 재배포되지 않는 이유
기본적으로 Deployment는 Pod Template 내용이 변경되는 경우에만 롤링 업데이트를 수행합니다.
ConfigMap의 내용이 변경되더라도 Deployment의 YAML 자체는 변경되지 않으므로, Pod는 자동으로 Restarted 되지 않습니다.
2-2. 자동 롤링 업데이트 원리
이를 해결하기 위해 ConfigMap 객체가 변경될 때마다 Deployment Template의 내용을 자동 갱신하여 롤링 업데이트가 자동으로 수행되도록 설정합니다. 과정은 다음과 같습니다.
a) ConfigMap 변경 시 내용 해싱
ConfigMap의 내용이 변경되면, sha256sum 템플릿 함수를 사용하여 내용의 hash를 계산합니다.
b) Deployment Annotation에 반영
계산된 해시 결과를 Deployment Template 메타데이터의 Annotation으로 삽입합니다. 이 Annotation의 값 변경이 트리거 역할을 하게 됩니다.
c) 롤링 업데이트 자동 수행
쿠버네티스는 Deployment Template 변경을 감지하고 자동으로 롤링 업데이트를 시작합니다.
2-3. 롤링 업데이트 설정 방법
ConfigMap 값에 sha256sum을 적용하여 Deployement YAML파일에 checksum/config Annotation으로 추가
=> ConfigMap 내용이 변경될 때마다 해당 해시값이 달라져 Deployment의 Pod Template이 변경된 것으로 인식되고, 이에 따라 롤링 업데이트가 자동으로 수행됩니다.
3. 자동 롤링 업데이트 확인을 위한 샘플 테스트 수행
ConfigMap에서 설정한 인사말을 환경 변수로 주입 받아 HTTP 응답으로 출력하는 간단한 웹 애플리케이션으로, ConfigMap 변경 사항이 즉시 반영되는지 확인하기 위한 테스트용 샘플 서비스입니다.

3-1. Helm Chart 디렉터리 구성
자동 롤링 업데이트를 구현하기 위해 기본 Helm Chart를 구성합니다.

aloha/
├── Chart.yaml
├── templates
│ ├── deployment.yaml
│ ├── configmap.yaml
│ └── service.yaml
└── values.yaml # 차트 기본값
a) 디렉터리 생성
root@DESKTOP-HUU6SC7:~# mkdir aloha
root@DESKTOP-HUU6SC7:~# mkdir aloha/templates
root@DESKTOP-HUU6SC7:~# cd aloha
b) Chart.yaml 생성
apiVersion: v2
name: aloha
description: A Helm chart for Configmap Test
type: application
version: 0.1.0
appVersion: "1.0.0"
c) templates/deployment.yaml 생성
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Chart.Name}}
labels:
app.kubernetes.io/name: {{ .Chart.Name}}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app.kubernetes.io/name: {{ .Chart.Name}}
template:
metadata:
labels:
app.kubernetes.io/name: {{ .Chart.Name}}
spec:
containers:
- image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion}}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
securityContext:
{{- toYaml .Values.securityContext | nindent 14 }}
name: {{ .Chart.Name}}
ports:
- containerPort: {{ .Values.image.containerPort }}
name: http
protocol: TCP
env:
- name: GREETING
valueFrom:
configMapKeyRef:
name: {{ .Values.configmap.name}}
key: greeting
d) templates/configmap.yaml 생성
=> 인사말 greeting "Aloha"로 설정해줍니다.
(이후 greeting 값을 업데이트하면서 설정값 자동 반영 여부를 확인할 예정입니다.)
apiVersion: v1
kind: ConfigMap
metadata:
name: greeting-config
data:
greeting: Aloha
e) templates/service.yaml 생성
apiVersion: v1
kind: Service
metadata:
labels:
app.kubernetes.io/name: {{ .Chart.Name }}
name: {{ .Chart.Name }}
spec:
ports:
- name: http
port: {{ .Values.image.containerPort }}
targetPort: {{ .Values.image.containerPort }}
selector:
app.kubernetes.io/name: {{ .Chart.Name }}
f) values.yaml 생성
image:
repository: quay.io/gitops-cookbook/greetings
tag: "1.0.0"
pullPolicy: Always
containerPort: 8080
replicaCount: 1
securityContext: {}
configmap:
name: greeting-config
3-2. 기본 Template 적용 시 ConfigMap 롤링 업데이트 동작 확인
a) Helm Chart 설치 및 배포 확인
root@DESKTOP-HUU6SC7:~/aloha# helm install greetings .
NAME: greetings
LAST DEPLOYED: Wed Oct 22 21:33:34 2025
NAMESPACE: default
STATUS: deployed
REVISION: 1
TEST SUITE: None
root@DESKTOP-HUU6SC7:~/aloha# helm list
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
greetings default 1 2025-10-22 21:33:34.802038493 +0900 KST deployed aloha-0.1.0 1.0.0
root@DESKTOP-HUU6SC7:~/aloha# helm history greetings
REVISION UPDATED STATUS CHART APP VERSION DESCRIPTION
1 Wed Oct 22 21:33:34 2025 deployed aloha-0.1.0 1.0.0 Install complete
root@DESKTOP-HUU6SC7:~/aloha# kubectl get secret
NAME TYPE DATA AGE
sh.helm.release.v1.greetings.v1 helm.sh/release.v1 1 59s
b) 서비스 응답 결과 확인
=> 처음 설정했던 인사말 Aloha로 출력되었습니다.
root@DESKTOP-HUU6SC7:~/aloha# kubectl port-forward service/aloha 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
Handling connection for 8080
root@DESKTOP-HUU6SC7:~# curl localhost:8080
Aloha Ada
c) ConfigMap 변경 후 Helm 업그레이드
=> greeting 값을 Hi로 변경한 후 helm upgrade를 실행하여, 애플리케이션에 인사말이 정상적으로 반영되는지 확인해보겠습니다.
apiVersion: v1
kind: ConfigMap
metadata:
name: greeting-config
data:
greeting: Hi
root@DESKTOP-HUU6SC7:~/aloha# helm upgrade greetings .
Release "greetings" has been upgraded. Happy Helming!
NAME: greetings
LAST DEPLOYED: Wed Oct 22 21:43:22 2025
NAMESPACE: default
STATUS: deployed
REVISION: 2
TEST SUITE: None
d) 서비스 응답 결과 및 롤링 업데이트 수행 여부 확인
=> greeting 값을 Hi 로 변경하였지만 여전히 Aloha로 출력되고 있습니다.
=> 롤링 업데이트도 수행되지 않았습니다.
root@DESKTOP-HUU6SC7:~/aloha# kubectl port-forward service/aloha 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
Handling connection for 8080
root@DESKTOP-HUU6SC7:~# curl localhost:8080
Aloha Ada
root@DESKTOP-HUU6SC7:~/aloha# kubectl get pods
NAME READY STATUS RESTARTS AGE
aloha-f478599f9-zgwf6 1/1 Running 0 4m6s
3-3. Deployment Template 변경 후 다시 적용 (자동 감지 설정)
a) deployment.yaml 파일 수정
=> spec.template.metadata.annotations에 ConfigMap을 sha256으로 해싱한 값을 추가했습니다.
=> ConfigMap이 변경되면 해당 해시값도 변경되어 Pod 템플릿이 수정된 것으로 인식되고 자동으로 롤링 업데이트가 수행됩니다.
| print $.Template.BasePath "/configmap.yaml" | 렌더링 대상 템플릿 경로 생성 |
| include <템플릿경로> . | 해당 템플릿을 현재 값(.)으로 렌더링 |
| | sha256sum | 결과 해시 |
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ .Chart.Name}}
labels:
app.kubernetes.io/name: {{ .Chart.Name}}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
spec:
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
app.kubernetes.io/name: {{ .Chart.Name}}
template:
metadata:
labels:
app.kubernetes.io/name: {{ .Chart.Name}}
annotations:
checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") . | sha256sum }}
spec:
containers:
- image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion}}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
securityContext:
{{- toYaml .Values.securityContext | nindent 14 }}
name: {{ .Chart.Name}}
ports:
- containerPort: {{ .Values.image.containerPort }}
name: http
protocol: TCP
env:
- name: GREETING
valueFrom:
configMapKeyRef:
name: {{ .Values.configmap.name}}
key: greeting
b) ConfigMap 변경 및 Helm 업그레이드
apiVersion: v1
kind: ConfigMap
metadata:
name: greeting-config
data:
greeting: Hi
root@DESKTOP-HUU6SC7:~/aloha# helm upgrade greetings .
Release "greetings" has been upgraded. Happy Helming!
NAME: greetings
LAST DEPLOYED: Wed Oct 22 21:48:09 2025
NAMESPACE: default
STATUS: deployed
REVISION: 3
TEST SUITE: None
c) 서비스 응답 결과 및 롤링 업데이트 수행 확인
=> 인사말이 Hi로 업데이트되어 정상적으로 출력되었습니다.
root@DESKTOP-HUU6SC7:~/aloha# kubectl port-forward service/aloha 8080:8080
Forwarding from 127.0.0.1:8080 -> 8080
Forwarding from [::1]:8080 -> 8080
Handling connection for 8080
root@DESKTOP-HUU6SC7:~# curl localhost:8080
Hi Ada
root@DESKTOP-HUU6SC7:~/aloha# kubectl get pods -w
NAME READY STATUS RESTARTS AGE
aloha-f478599f9-zgwf6 1/1 Running 0 5m41s
aloha-5ff6d47b6c-n8k27 0/1 Pending 0 0s
aloha-5ff6d47b6c-n8k27 0/1 Pending 0 0s
aloha-5ff6d47b6c-n8k27 0/1 ContainerCreating 0 0s
aloha-5ff6d47b6c-n8k27 1/1 Running 0 1s
aloha-f478599f9-zgwf6 1/1 Terminating 0 6m23s
** Annotations 해시값 확인
Annotations: checksum/config: f6e66d20a612bace289ca068b745da047500e965299e0ca141cdb17bd609a6f8

4. 결론
Helm의 템플릿 기능을 활용하여 ConfigMap 변경 시 자동으로 Pod 롤링 업데이트가 수행되는 동작 방식을 테스트했습니다.
이 방식은 Kubernetes 환경에서 무중단으로 설정 변경을 반영하고, 안정적인 배포 파이프라인을 구축하는 데 효율적입니다. ConfigMap뿐만 아니라 Secret 등 다른 설정 리소스에도 동일하게 적용 가능합니다.
'CI&CD' 카테고리의 다른 글
| [CI/CD] OpenLDAP + KeyCloak + Argo CD + Jenkins 구축 과정 (1) | 2025.11.23 |
|---|---|
| [ArgoCD] Vault 플러그인으로 인증 관리하기 (0) | 2025.11.11 |
| [ArgoCD] HA 구성으로 안정적인 배포 자동화 구현 (0) | 2025.11.06 |
| [CI/CD] Tekton + ArgoCD로 만드는 CI/CD 파이프라인 (1) | 2025.11.01 |
| [Shipwright] Docker 없이 Kubernetes에서 컨테이너 이미지 빌드하기 (0) | 2025.10.16 |