쿠버네티스

ConfigMap을 활용한 유용한 응용 팁

ipxy 2025. 4. 6. 10:17
728x90

🍯 ConfigMap 유용한 응용 팁


1. 서버 설정 파일 관리

Spring Boot, Nginx, Node.js 같은 앱의 설정파일 (application.yml, nginx.conf, .env)을
이미지에 집어넣지 않고, ConfigMap으로 외부 주입하면 좋아요.

장점:

  • 코드/이미지와 설정 분리
  • 설정만 바꿔서 롤링 업데이트 가능
  • 여러 환경(dev, staging, prod) 별로 ConfigMap 분리 가능

예시

apiVersion: v1
kind: ConfigMap
metadata:
  name: spring-config
data:
  application.yml: |
    server:
      port: 8080
    spring:
      profiles:
        active: dev

/config/application.yml로 마운트 → Spring Boot에서 spring.config.location 설정하면 바로 사용 가능.


2. 다중 ConfigMap 조합하기

하나의 Pod에서 여러 ConfigMap을 합쳐서 사용할 수 있어요.

예시

volumes:
  - name: app-config
    configMap:
      name: spring-config
  - name: log-config
    configMap:
      name: logback-config

volumeMounts에서 각각 마운트할 경로를 다르게 설정하면 됩니다.

앱 설정 + 로그 설정 + 외부 API 설정 이런 식으로 모듈화 가능!


3. 환경별 ConfigMap 분리 + 자동 선택

Dev, Staging, Production마다 ConfigMap을 따로 만들고,
Pod 배포 시 환경변수로 구분해서 연결해요.

env:
  - name: ENV
    value: "dev"

volumes:
  - name: config-volume
    configMap:
      name: config-${ENV}

주의: 이렇게 변수를 직접 쓰면 안 되고, Helm, Kustomize, ArgoCD 같은 툴로 템플릿 처리해야 해요.
(쿠버네티스 순정 YAML은 변수 치환 안 돼요.)


4. 파일 별 권한, 경로 지정

ConfigMap을 마운트할 때 특정 파일만 골라서, 이름이나 경로를 바꿀 수 있어요.

volumes:
  - name: config-volume
    configMap:
      name: my-config
      items:
        - key: important.conf
          path: settings/important.conf
        - key: secrets.txt
          path: secrets/secrets.txt
  • items 배열을 쓰면 부분 선택, 경로 변경 가능!
  • 중요한 설정은 다른 서브폴더로 묶을 수 있어요.

5. 프로그램 재시작 없이 설정 동적 반영

앞서 말했던 Projected Volume 사용 + 앱에서 파일 변화 감지(Hot Reload) 기능 활성화.

예시

  • Spring Boot spring-cloud-kubernetes-config 사용
  • nginx inotify로 config reload
  • custom 앱이면 fswatch, inotify-tools 같은 걸로 파일 변경 감지
volumes:
  - name: config-volume
    projected:
      sources:
        - configMap:
            name: my-config

이렇게 해두면, ConfigMap 수정 → 파일만 교체 → 앱이 자동 reload
완전 무중단 설정 변경도 가능해져요.


6. Script, SQL 파일 배포용으로 사용

어플리케이션이 부팅할 때 초기화할 스크립트나 SQL 파일도
ConfigMap으로 넣을 수 있어요.

예시

kubectl create configmap init-sql --from-file=init.sql

Pod 시작할 때:

containers:
- name: init-db
  image: mysql
  command: [ "mysql", "-h", "db", "-u", "root", "-p$MYSQL_ROOT_PASSWORD", "-e", "source /etc/init.sql" ]
  volumeMounts:
    - name: init-volume
      mountPath: /etc/init.sql
      subPath: init.sql

✨ 요약

응용 아이디어  설명
서버 설정 파일 관리 코드-설정 분리, 환경별 설정 가능
여러 ConfigMap 조합 앱 설정, 로깅 설정 등 모듈화
환경별 자동 매칭 Helm, Kustomize로 자동화
파일 세부 설정 파일별 경로/권한 분리 가능
Hot Reload 적용 앱을 재시작하지 않고 설정만 동적 반영
스크립트, SQL 파일 배포 초기 데이터 세팅, 마이그레이션에 활용

 

728x90