Skip to document
pieroot log
Markdown Preview

효율적인 애플리케이션 설정 관리를 위한 Kubernetes ConfigMap 활용 가이드

Frontmatter

Kubernetes ConfigMap을 사용하면 애플리케이션 설정을 코드와 분리하여 이미지 재빌드 없이도 쉽게 변경할 수 있다. ConfigMap은 명령어(kubectl create configmap)나 YAML 파일로 생성하고, Deployment의 환경 변수(valueFrom.configMapKeyRef)에 연결해 사용할 수 있다. 설정 변경 시 ConfigMap을 수정하고 Deployment를 재시작하면 새로운 값이 적용된다. 또한 개발, 스테이징, 프로덕션 등 여러 환경별로 별도의 ConfigMap을 만들어 환경별 포트와 로그 경로 등을 관리할 수 있다. ConfigMap 목록 조회, 상세 확인, 디버깅 명령어를 활용해 설정을 검증하고, 필요 시 리소스를 삭제하여 정리한다.

효율적인 애플리케이션 설정 관리를 위한 Kubernetes ConfigMap 활용 가이드

ConfigMap이란?

애플리케이션의 설정을 코드와 분리하여 관리하는 Kubernetes 객체입니다. 이미지를 다시 빌드하지 않고도 설정을 변경할 수 있습니다.
notion image

1. ConfigMap 생성

방법 1: 명령어로 생성

bash
# 포트, 로그, 업로드 디렉터리 설정
kubectl create configmap simple-file-server-config \
  --from-literal=PORT=3001 \
  --from-literal=LOG_PATH=/var/log/app.log \
  --from-literal=UPLOAD_DIR=/var/uploads \
  --namespace volume

# 확인
kubectl get configmap simple-file-server-config -n volume -o yaml

방법 2: YAML 파일로 생성

configmap.yaml:
yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: simple-file-server-config
  namespace: volume
data:
  PORT: "3001"
  LOG_PATH: "/var/log/app.log"
  UPLOAD_DIR: "/var/uploads"
bash
kubectl apply -f configmap.yaml

2. Deployment에서 ConfigMap 사용

deployment-configmap.yaml:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: simple-file-server
  namespace: volume
spec:
  replicas: 2
  selector:
    matchLabels:
      app: simple-file-server
  template:
    metadata:
      labels:
        app: simple-file-server
    spec:
      nodeSelector:
        kubernetes.io/hostname: "worker"
      containers:
      - name: simple-file-server
        image: ghcr.io/jung-geun/simple-file-server:1.0
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 3001
        env:
        - name: PORT
          valueFrom:
            configMapKeyRef:
              name: simple-file-server-config
              key: PORT
        - name: LOG_PATH
          valueFrom:
            configMapKeyRef:
              name: simple-file-server-config
              key: LOG_PATH
        - name: UPLOAD_DIR
          valueFrom:
            configMapKeyRef:
              name: simple-file-server-config
              key: UPLOAD_DIR
---
apiVersion: v1
kind: Service
metadata:
  name: simple-file-server
  namespace: volume
spec:
  type: NodePort
  selector:
    app: simple-file-server
  ports:
  - port: 3001
    targetPort: 3001
    nodePort: 30001

3. 실습: 이미지 빌드 및 배포

bash
# 1. ConfigMap 생성 (포트 3001)
kubectl apply -f configmap.yaml

# 2. Deployment 및 Service 배포
kubectl apply -f deployment-configmap.yaml

# 3. Pod 상태 확인 (worker 노드 스케줄)
kubectl get pods -n volume -l app=simple-file-server -o wide

# 4. Service 확인
kubectl get svc -n volume simple-file-server

# 5. 접속 테스트
curl http://localhost:30001

4. 포트 변경 실습

포트를 3001에서 3002로 변경

bash
# ConfigMap 수정
kubectl edit configmap simple-file-server-config -n volume
# PORT: "3001" → PORT: "3002" 로 변경

# 또는 파일을 수정하고 재적용
# configmap.yaml 파일에서 PORT: "3002"로 변경
kubectl apply -f configmap.yaml

# Pod 재시작 (새로운 설정 적용)
kubectl rollout restart deployment -n volume simple-file-server

# 롤아웃 상태 확인
kubectl rollout status deployment -n volume simple-file-server

# 새로운 Pod에서 환경 변수 확인
POD_NAME=$(kubectl get pod -n volume -l app=simple-file-server -o jsonpath='{.items[0].metadata.name}')
kubectl exec -n volume $POD_NAME -- env | grep PORT
주의: Service의 포트도 함께 변경해야 합니다! 02-deployment-configmap.yaml의 포트 섹션을 아래처럼 조정합니다.
yaml
spec:
  ports:
  - port: 3002
    targetPort: 3002
    nodePort: 30002
bash
# Service 포트 변경 후 재배포
kubectl apply -f deployment-configmap.yaml
curl http://localhost:30002

5. 여러 환경 설정 관리

개발 환경 (3001번 포트)

yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: simple-file-server-config-dev
data:
  PORT: "3001"
  LOG_PATH: "/var/log/app-dev.log"
  ENVIRONMENT: "development"

스테이징 환경 (3002번 포트)

yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: simple-file-server-config-staging
data:
  PORT: "3002"
  LOG_PATH: "/var/log/app-staging.log"
  ENVIRONMENT: "staging"

프로덕션 환경 (3003번 포트)

yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: simple-file-server-config-prod
data:
  PORT: "3003"
  LOG_PATH: "/var/log/app-prod.log"
  ENVIRONMENT: "production"
Deployment에서 원하는 ConfigMap을 선택:
yaml
env:
- name: PORT
  valueFrom:
    configMapKeyRef:
      name: simple-file-server-config-dev  # 또는 staging, prod
      key: PORT

6. ConfigMap 확인 및 디버깅

bash
# ConfigMap 목록
kubectl get configmap -n volume

# ConfigMap 상세 정보
kubectl describe configmap simple-file-server-config -n volume

# ConfigMap 데이터 확인
kubectl get configmap simple-file-server-config -n volume -o yaml

# Pod에서 환경 변수 확인
kubectl exec -n volume $POD_NAME -- env

# 특정 환경 변수만 확인
kubectl exec -n volume $POD_NAME -- printenv PORT

7. 정리

bash
kubectl delete deployment -n volume simple-file-server
kubectl delete service -n volume simple-file-server
kubectl delete configmap -n volume simple-file-server-config

핵심 정리

✅ ConfigMap: 애플리케이션 설정을 코드와 분리
✅ 환경 변수 주입: valueFrom.configMapKeyRef 사용
✅ 이미지 재빌드 불필요: 설정만 변경하고 Pod 재시작
✅ 다중 환경: dev, staging, prod 별로 다른 ConfigMap 사용