Ssoon

Kustomize : Kustomize에서 ConfigMap 생성하기 본문

CICD Study [1기]

Kustomize : Kustomize에서 ConfigMap 생성하기

구구달스 2025. 10. 18. 22:03

🗺️ Kustomize로 ConfigMap 자동 생성 및 관리하기

Kubernetes에서 애플리케이션 설정을 관리할 때 ConfigMap은 필수적입니다. Kustomize는 이러한 ConfigMap을 리소스로 추가하는 두 가지 방법을 제공합니다.

  1. 다른 리소스(Deployment 등)처럼 ConfigMap YAML 파일을 선언하기
  2. 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 데이터를 병합하거나 덮어쓸 수 있습니다.
 
Comments