본문 바로가기
클라우드/쿠버네티스

⚙️ ConfigMap으로 설정 파일 깔끔하게 분리하고 주입하기

by gasbugs 2025. 9. 2.

안녕하세요! 👋 오늘은 쿠버네티스에서 애플리케이션의 설정 관리를 한 단계 업그레이드해 줄 핵심 오브젝트, ConfigMap에 대해 알아보겠습니다.

 

애플리케이션을 개발하다 보면 데이터베이스 접속 정보, 기능 활성화 플래그, 외부 서비스 API 엔드포인트 등 다양한 설정 값들을 다루게 되는데요. 이런 설정들을 이미지 안에 직접 넣거나 코드에 하드코딩하면 어떻게 될까요? 끔찍하죠. 😱 설정 하나 바꾸려고 매번 이미지를 새로 빌드하고 배포해야 할 겁니다.

 

ConfigMap은 바로 이 문제를 해결하기 위해 등장했습니다. 설정 데이터를 코드와 컨테이너 이미지로부터 완전히 분리하여, 애플리케이션의 이식성과 유연성을 극대화하는 열쇠입니다! 🔑


🤔 ConfigMap이란? 설정 데이터를 위한 전용 보관함

ConfigMap은 말 그대로 설정(Configuration)을 담는 맵(Map)입니다. Key-Value 쌍의 형태로 비-기밀(non-confidential) 데이터를 저장하는 쿠버네티스 API 오브젝트입니다.

  • 역할: 애플리케이션 코드와 설정 데이터를 분리하여 관리.
  • 저장 형식: Key-Value 쌍. Value는 간단한 문자열부터 설정 파일 전체 내용까지 담을 수 있습니다.
  • 주의사항: ConfigMap은 Base64로 인코딩되긴 하지만, 암호화된 것은 아닙니다. 따라서 DB 비밀번호나 TLS 인증서 같은 민감한 정보는 Secret 오브젝트에 저장해야 합니다!

ConfigMap을 사용하면, 개발 환경과 운영 환경에서 다른 설정 값을 사용해야 할 때 이미지를 다시 빌드할 필요 없이 ConfigMap만 교체하여 파드(Pod)에 주입하면 됩니다. 정말 편리하죠?


🛠️ ConfigMap 생성하기: 3가지 방법 정복!

ConfigMap을 만드는 방법은 크게 세 가지가 있습니다. 상황에 맞게 가장 편한 방법을 사용하면 됩니다.

1. 리터럴(Literal)로부터 생성하기: 간단한 Key-Value 쌍

가장 간단한 방법으로, kubectl create configmap 명령어에 --from-literal 옵션을 사용하여 직접 Key-Value를 지정합니다.

Bash
# kubectl create configmap [ConfigMap이름] --from-literal=[Key]=[Value]
kubectl create configmap my-config \
  --from-literal=app.name=my-app \
  --from-literal=feature.enabled=true

위 명령어를 실행하면 다음과 같은 ConfigMap이 만들어집니다.

 
YAML
apiVersion: v1
kind: ConfigMap
metadata:
  name: my-config
data:
  app.name: my-app
  feature.enabled: "true"

2. 파일(File)로부터 생성하기: 설정 파일 통째로 저장

app.properties, config.json 처럼 이미 작성된 설정 파일이 있다면, --from-file 옵션으로 파일 내용을 ConfigMap에 담을 수 있습니다.

 

app.properties 파일 내용: Properties

db.host=mysql.example.com
db.port=3306

 

명령어: Bash

# 키 이름은 기본적으로 파일명이 됩니다.
kubectl create configmap app-config-from-file \
  --from-file=app.properties

 

생성 결과: YAML

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config-from-file
data:
  app.properties: |
    db.host=mysql.example.com
    db.port=3306

Tip: --from-file=[Key이름]=[파일경로] 형식으로 파일명을 Key로 사용하지 않고 원하는 Key를 지정할 수도 있습니다.

3. 디렉토리(Directory)로부터 생성하기: 여러 설정 파일 한번에!

특정 디렉토리 안에 있는 모든 파일을 각각의 Key-Value 데이터로 사용하여 ConfigMap을 만들 수도 있습니다. 디렉토리 내의 각 파일 이름이 Key가 되고, 파일 내용이 Value가 됩니다.

 

config-dir/ 디렉토리 구조:

config-dir/
├── db.host
└── db.port
  • db.host 파일 내용: postgres.example.com
  • db.port 파일 내용: 5432

명령어: Bash

kubectl create configmap app-config-from-dir \
  --from-file=./config-dir

 

생성 결과: YAML

apiVersion: v1
kind: ConfigMap
metadata:
  name: app-config-from-dir
data:
  db.host: postgres.example.com
  db.port: "5432"

🚀 Pod에서 ConfigMap 사용하기: 2가지 주입 전략

자, 이제 만들어진 ConfigMap을 파드 안의 컨테이너가 사용할 수 있도록 '주입'해 보겠습니다. 주입 방법은 크게 두 가지가 있습니다.

1. 환경 변수(Environment Variables)로 주입하기

ConfigMap의 데이터를 컨테이너의 환경 변수로 전달하는 가장 일반적인 방법입니다.

env-pod.yaml 예시: YAML

apiVersion: v1
kind: Pod
metadata:
  name: env-pod
spec:
  containers:
  - name: my-container
    image: busybox
    command: [ "/bin/sh", "-c", "env" ]
    env:
      # 1. 특정 Key의 값을 환경 변수로 주입
      - name: APP_NAME # 컨테이너 내에서 사용할 환경 변수 이름
        valueFrom:
          configMapKeyRef:
            name: my-config # 사용할 ConfigMap 이름
            key: app.name   # 사용할 Key
      
      # 2. ConfigMap의 모든 Key-Value를 통째로 환경 변수로 주입
    envFrom:
      - configMapRef:
          name: my-config

위 YAML 파일을 적용(kubectl apply -f env-pod.yaml)하고 로그를 확인하면, ConfigMap의 데이터가 환경 변수로 설정된 것을 볼 수 있습니다.

  • APP_NAME=my-app
  • app.name=my-app
  • feature.enabled=true

2. 볼륨(Volume)으로 마운트하기

ConfigMap의 데이터를 파일 형태로 컨테이너의 특정 경로에 마운트하는 방법입니다. 설정 파일 전체를 주입해야 할 때 매우 유용합니다.

volume-pod.yaml 예시: YAML

apiVersion: v1
kind: Pod
metadata:
  name: volume-pod
spec:
  containers:
  - name: my-container
    image: busybox
    command: [ "/bin/sh", "-c", "ls -l /etc/config && cat /etc/config/app.properties" ]
    volumeMounts:
    - name: config-volume
      mountPath: /etc/config # 컨테이너 내부에 마운트할 경로
  volumes:
  - name: config-volume
    configMap:
      name: app-config-from-file # 사용할 ConfigMap 이름
      items: # 특정 키만 선택하여 다른 파일 이름으로 마운트 가능
      - key: app.properties
        path: app.properties # 마운트될 파일 이름

이 파드를 실행하면, 컨테이너의 /etc/config 디렉토리 아래에 app.properties 파일이 생성되고, 그 내용은 app-config-from-file ConfigMap의 app.properties 키 값과 동일합니다.

한 가지 놀라운 점은, 볼륨으로 마운트된 ConfigMap은 파드를 재시작하지 않아도 내용이 업데이트되면 자동으로 컨테이너 내 파일에 반영된다는 것입니다! (약간의 지연 시간은 있습니다.) 이를 통해 무중단 설정 변경도 가능해집니다. ✨


✨ 정리하며

오늘은 애플리케이션의 설정을 유연하게 관리하는 비결, ConfigMap에 대해 알아보았습니다.

  • ConfigMap은 설정 데이터를 Key-Value 쌍으로 저장하여 코드와 분리합니다.
  • 리터럴, 파일, 디렉토리 등 다양한 소스로부터 쉽게 생성할 수 있습니다.
  • 파드에 주입할 때는 환경 변수 방식과 볼륨 마운트 방식을 사용할 수 있습니다.
  • 민감한 정보는 반드시 Secret을 사용해야 합니다.

ConfigMap을 잘 활용하면 12-Factor App 방법론의 '설정(Config)' 원칙을 준수하며, 어떤 환경에서든 빠르고 유연하게 배포할 수 있는 클라우드 네이티브 애플리케이션을 만들 수 있습니다. 이제 여러분의 설정 파일들을 ConfigMap으로 멋지게 관리해보세요!


태그: Kubernetes, ConfigMap, K8s, 쿠버네티스, 설정 관리, DevOps, MSA, 환경 변수, 볼륨, YAML