Ssoon
Kustomize : Kustomize에서 ConfigMap 생성하기 본문
🗺️ Kustomize로 ConfigMap 자동 생성 및 관리하기
Kubernetes에서 애플리케이션 설정을 관리할 때 ConfigMap은 필수적입니다. Kustomize는 이러한 ConfigMap을 리소스로 추가하는 두 가지 방법을 제공합니다.
- 다른 리소스(Deployment 등)처럼 ConfigMap YAML 파일을 선언하기
- ConfigMapGenerator 기능을 사용하여 선언하기
문제 (Problem): Kustomize를 사용하여 Kubernetes ConfigMap을 생성하고 싶습니다.
해결책 (Solution): configMapGenerator 기능 필드를 사용하여 Kubernetes ConfigMap 리소스를 즉시(on the fly) 생성합니다.
🤔 ConfigMap 관리: 두 가지 방식의 차이점
ConfigMap을 일반 리소스로 사용하는 것은 다른 리소스와 동일하게 Kubernetes에 적용된다는 것 외에 특별한 이점이 없습니다.
하지만 ConfigMapGenerator를 사용하면 Kustomize가 자동으로 ConfigMap의 metadata.name에 해시(hash) 값을 추가하고, 이 ConfigMap을 참조하는 Deployment 파일의 참조 이름도 이 해시가 포함된 새 이름으로 수정합니다.
이 작은 차이가 애플리케이션의 라이프사이클에 매우 큰 영향을 미칩니다.
일반 ConfigMap의 문제점
애플리케이션이 ConfigMap을 사용하여 데이터베이스 연결 타임아웃 값을 설정한다고 가정해 봅시다. 만약 이 타임아웃 값을 변경하기 위해 ConfigMap 파일만 수정하고 재배포하면, Deployment는 이 변경을 감지하지 못합니다. Deployment가 참조하는 ConfigMap의 '이름'은 그대로이기 때문입니다.
결국, 변경된 설정값을 애플리케이션에 적용하려면 수동으로 Deployment의 rolling update를 트리거해야 합니다.

ConfigMap의 변경 ConfigMap 파일 변경 → kubectl apply → ConfigMap만 업데이트됨 (Deployment는 변경 없음) → 애플리케이션은 이전 설정값 사용 → 수동 Rolling Update 필요
ConfigMapGenerator의 해결책
ConfigMapGenerator가 ConfigMap을 관리하면, 설정 파일의 내용이 조금이라도 변경될 경우 ConfigMap의 이름에 붙는 해시값이 변경됩니다.
Kustomize는 이 새로운 해시 이름을 가진 ConfigMap을 생성하고, 동시에 Deployment가 참조하는 ConfigMap의 이름도 이 새 이름으로 교체합니다.
결과적으로 Deployment의 YAML 정의(spec)가 변경되었으므로, 리소스를 적용할 때 자동으로 rolling update가 트리거됩니다.

ConfigMapGenerator를 사용한 ConfigMap의 변경 설정 변경 → kustomize build → 새 해시(-xyz)를 가진 ConfigMap 생성 + Deployment가 새 ConfigMap(-xyz)을 참조하도록 수정 → kubectl apply → 자동 Rolling Update 발생
또한 ConfigMapGenerator를 사용하면 여러 구성 데이터 파일을 단일 ConfigMap으로 결합할 수 있어, 각 환경마다 다른 설정 파일을 관리하는 데 완벽한 사용 사례가 됩니다.
"ConfigMapGenerator의 핵심은 설정 내용이 변경될 때마다 해시 기반의 새 이름을 생성하고, 이를 참조하는 Deployment도 함께 업데이트하여 자동으로 롤링 업데이트를 유도하는 것입니다."
✍️ 예제 1: literals로 ConfigMap 즉시 생성하기
먼저, ConfigMap을 volume으로 마운트하는 deployment.yaml 파일이 필요합니다.
deployment.yaml (일부):
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat <<EOF > deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: pacman-kikd
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: pacman-kikd
template:
metadata:
labels:
app.kubernetes.io/name: pacman-kikd
spec:
containers:
- name: pacman-kikd
image: lordofthejars/pacman-kikd:1.0.0
imagePullPolicy: Always
volumeMounts:
- name: config
mountPath: /config
volumes:
- name: config
configMap:
name: pacman-configmap
EOF
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: pacman-kikd
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: pacman-kikd
template:
metadata:
labels:
app.kubernetes.io/name: pacman-kikd
spec:
containers:
- name: pacman-kikd
image: lordofthejars/pacman-kikd:1.0.0
imagePullPolicy: Always
volumeMounts:
- name: config
mountPath: /config
volumes:
- name: config
configMap:
name: pacman-configmap
- kustomization.yaml 파일에서 이 ConfigMap 이름을 사용합니다.
이제 kustomization.yaml 파일에 configMapGenerator 섹션을 추가하여 구성 속성을 직접 포함시킵니다. kustomization 파일이 빌드될 때 ConfigMap 객체가 즉시 생성됩니다.
kustomization.yaml:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat <<EOF > kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ./deployment.yaml
configMapGenerator:
- name: pacman-configmap #
literals: #
- db-timeout=2000 #
- db-username=Ada
EOF
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ./deployment.yaml
configMapGenerator:
- name: pacman-configmap #
literals: #
- db-timeout=2000 #
- db-username=Ada
- name: deployment.yaml의 volumes.configMap.name에 설정된 ConfigMap 이름과 일치해야 합니다.
- literals: 구성 값을 파일에 직접 포함시킵니다.
- key=value 쌍으로 속성을 설정합니다.
변경 사항 확인하기: kustomize CLI를 사용하여 출력을 검증합니다.
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ kustomize build
apiVersion: v1
data:
db-timeout: "2000"
db-username: Ada
kind: ConfigMap
metadata:
name: pacman-configmap-h27ch8fc52
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: pacman-kikd
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: pacman-kikd
template:
metadata:
labels:
app.kubernetes.io/name: pacman-kikd
spec:
containers:
- image: lordofthejars/pacman-kikd:1.0.0
imagePullPolicy: Always
name: pacman-kikd
volumeMounts:
- mountPath: /config
name: config
volumes:
- configMap:
name: pacman-configmap-h27ch8fc52
name: config
실행 결과: 출력 결과에는 kustomization.yaml에 설정된 구성 값을 가진 **새로운 ConfigMap**이 생성됩니다. 또한, ConfigMap과 Deployment 양쪽 모두의 name이 해시가 추가된 이름으로 업데이트됩니다.
- ConfigMap 속성들이 포함되어 있습니다.
- name에 해시가 추가되었습니다 (h27ch8fc52).
- Deployment의 volumes.configMap.name 필드가 해시가 포함된 이름으로 업데이트되어 롤링 업데이트를 트리거합니다.
"configMapGenerator는 name이 일치하는 ConfigMap을 생성하고, Deployment에서 해당 name을 사용하는 부분을 찾아 해시가 추가된 이름으로 자동 교체해줍니다."
🔄 자동 롤링 업데이트 시연
해시는 구성 속성의 변경 사항에 대해 계산되므로, 속성값이 변경되면 출력 결과가 변경되어 애플리케이션의 롤링 업데이트를 유발합니다.
kustomization.yaml 파일을 열어 db-timeout literal 값을 2000에서 1000으로 업데이트하고 kustomize build를 다시 실행해 봅시다.
ConfigMap 이름이 새로운 해시 값으로 변경된 것을 주목하세요.
실행 결과 (값 변경 후):
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat <<EOF > kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ./deployment.yaml
configMapGenerator:
- name: pacman-configmap #
literals: #
- db-timeout=1000 #
- db-username=Ada
EOF
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ./deployment.yaml
configMapGenerator:
- name: pacman-configmap #
literals: #
- db-timeout=1000 #
- db-username=Ada
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ kustomize build
apiVersion: v1
data:
db-timeout: "1000"
db-username: Ada
kind: ConfigMap
metadata:
name: pacman-configmap-dbd7g9bff5
---
...
volumes:
- configMap:
name: pacman-configmap-dbd7g9bff5
name: config
- db-timeout 값이 1000으로 변경되었습니다.
- name에 새로운 해시 값(dbd7g9bff5)이 적용되었습니다.
- Deployment도 이 새로운 이름을 참조하도록 업데이트되었습니다.
"설정 값(literals)을 변경하면 ConfigMap의 해시가 변경되고, 이는 Deployment의 변경으로 이어져 apply 시 자동 롤링 업데이트가 수행됩니다."
📚 configMapGenerator 고급 활용법
ConfigMapGenerator는 다른 소스의 구성 속성을 병합하는 것도 지원합니다.
1. behavior: merge로 속성 병합하기
base/overlay 구조에서 base의 설정을 overlay에서 덮어쓰거나 병합할 수 있습니다.
dev_literals 디렉터리에 새 kustomization.yaml 파일을 만들고, 이전 디렉터리(../literals)를 base로 참조하면서 db-username 값을 덮어쓴다고 가정해 봅시다.
dev_literals/kustomization.yaml:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ mkdir -p literals
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat <<EOF > literals/kustomization.yaml
> ^C
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat <<EOF > literals/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
configMapGenerator:
- name: pacman-configmap
literals:
- db-timeout=2000 📌
- db-username=Ada
EOF
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ mkdir dev_literals
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat <<EOF > dev_literals/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../literals
configMapGenerator:
- name: pacman-configmap
behavior: merge
literals:
- db-username=Alexandra 📌
EOF
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat dev_literals/kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ../literals
configMapGenerator:
- name: pacman-configmap
behavior: merge
literals:
- db-username=Alexandra
- resources: base 디렉터리(../literals)를 참조합니다.
- behavior: merge: 속성을 병합합니다 (create 또는 replace도 가능).
- literals: 덮어쓸 값을 설정합니다.
실행 결과 (kustomize build dev_literals): 두 구성 속성이 병합된 ConfigMap이 생성됩니다.
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ kustomize build dev_literals/
apiVersion: v1
data:
db-timeout: "2000" 📌
db-username: Alexandra 📌
kind: ConfigMap
metadata:
name: pacman-configmap-hh456mghm7
- db-timeout: base(../literals)로부터 상속받았습니다.
- db-username: overlay에서 덮어쓴 값(Alexandra)이 적용되었습니다.
2. .properties 파일에서 ConfigMap 생성하기 (files)
구성 속성을 literals로 직접 설정하는 대신, .properties 파일을 정의하여 사용할 수도 있습니다.
connection.properties 파일 생성:
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat <<EOF > connection.properties
db-url=prod:4321/db
db-username=ada
EOF
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat connection.properties
db-url=prod:4321/db
db-username=ada
kustomization.yaml: literals 필드 대신 files 필드를 사용합니다.
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat <<EOF > kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ./deployment.yaml
configMapGenerator:
- name: pacman-configmap
files:
- ./connection.properties
EOF
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ cat kustomization.yaml
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- ./deployment.yaml
configMapGenerator:
- name: pacman-configmap
files:
- ./connection.properties
- files: 읽어올 파일 목록을 설정합니다.
- .properties 파일의 경로를 지정합니다.
실행 결과: kustomize build를 실행하면, 파일 이름을 키(key)로, 파일 내용을 값(value)으로 갖는 ConfigMap이 생성됩니다.
(⎈|kind-myk8s:N/A) ssoon@DESKTOP-72C919S:~/pacman$ kustomize build
apiVersion: v1
data:
connection.properties: | 📌
db-url=prod:4321/db
db-username=ada
kind: ConfigMap
metadata:
name: pacman-configmap-bf2h9bhmg8 📌
---
..
volumes:
- configMap:
name: pacman-configmap-bf2h9bhmg8 📌
name: config
"configMapGenerator는 literals (인라인 값), files (파일 내용), envs (환경 변수 파일) 등 다양한 소스를 지원하며, behavior: merge를 통해 계층적 구성(overlay)을 쉽게 관리할 수 있습니다."
📌 핵심 요약
- Kustomize로 ConfigMap을 관리하는 가장 좋은 방법은 **configMapGenerator**를 사용하는 것입니다.
- configMapGenerator는 ConfigMap의 내용에 기반한 해시(hash)를 이름에 추가합니다 (my-configmap-a1b2c3d4).
- Kustomize는 ConfigMap을 참조하는 Deployment의 volumes.configMap.name 필드도 자동으로 이 해시 이름으로 업데이트합니다.
- 이 메커니즘 덕분에 설정 값(literals 또는 files 내용)이 변경되면 Deployment가 자동으로 롤링 업데이트됩니다.
- literals:를 사용하면 kustomization.yaml에 키-값을 직접 포함시킬 수 있습니다.
- files:를 사용하면 .properties 같은 외부 설정 파일의 내용을 ConfigMap으로 가져올 수 있습니다 (이때 파일명이 data의 키가 됩니다).
- behavior: merge 옵션을 사용하면 base와 overlay 간의 ConfigMap 데이터를 병합하거나 덮어쓸 수 있습니다.
'CICD Study [1기]' 카테고리의 다른 글
| Helm : 5.2 - 템플릿 간 문장 재사용 (0) | 2025.10.19 |
|---|---|
| Helm : 5.1 - Helm 프로젝트 생성 (0) | 2025.10.19 |
| Kustomize : 여러 환경에 배포하기 (0) | 2025.10.14 |
| Kustomize : Kustomize에서 Kubernetes 필드 업데이트하기 (0) | 2025.10.14 |
| Kustomize : Kustomize에서 컨테이너 이미지 업데이트하기 (0) | 2025.10.14 |