Markdown Preview
효율적인 애플리케이션 설정 관리를 위한 Kubernetes ConfigMap 활용 가이드
Frontmatter
Kubernetes ConfigMap을 사용하면 애플리케이션 설정을 코드와 분리하여 이미지 재빌드 없이도 쉽게 변경할 수 있다. ConfigMap은 명령어(kubectl create configmap)나 YAML 파일로 생성하고, Deployment의 환경 변수(valueFrom.configMapKeyRef)에 연결해 사용할 수 있다. 설정 변경 시 ConfigMap을 수정하고 Deployment를 재시작하면 새로운 값이 적용된다. 또한 개발, 스테이징, 프로덕션 등 여러 환경별로 별도의 ConfigMap을 만들어 환경별 포트와 로그 경로 등을 관리할 수 있다. ConfigMap 목록 조회, 상세 확인, 디버깅 명령어를 활용해 설정을 검증하고, 필요 시 리소스를 삭제하여 정리한다.
ConfigMap이란?
애플리케이션의 설정을 코드와 분리하여 관리하는 Kubernetes 객체입니다. 이미지를 다시 빌드하지 않고도 설정을 변경할 수 있습니다.
1. ConfigMap 생성
방법 1: 명령어로 생성
# 포트, 로그, 업로드 디렉터리 설정
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:
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"kubectl apply -f configmap.yaml2. Deployment에서 ConfigMap 사용
deployment-configmap.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: 300013. 실습: 이미지 빌드 및 배포
# 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:300014. 포트 변경 실습
포트를 3001에서 3002로 변경
# 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의 포트 섹션을 아래처럼 조정합니다.spec:
ports:
- port: 3002
targetPort: 3002
nodePort: 30002# Service 포트 변경 후 재배포
kubectl apply -f deployment-configmap.yaml
curl http://localhost:300025. 여러 환경 설정 관리
개발 환경 (3001번 포트)
apiVersion: v1
kind: ConfigMap
metadata:
name: simple-file-server-config-dev
data:
PORT: "3001"
LOG_PATH: "/var/log/app-dev.log"
ENVIRONMENT: "development"스테이징 환경 (3002번 포트)
apiVersion: v1
kind: ConfigMap
metadata:
name: simple-file-server-config-staging
data:
PORT: "3002"
LOG_PATH: "/var/log/app-staging.log"
ENVIRONMENT: "staging"프로덕션 환경 (3003번 포트)
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을 선택:
env:
- name: PORT
valueFrom:
configMapKeyRef:
name: simple-file-server-config-dev # 또는 staging, prod
key: PORT6. ConfigMap 확인 및 디버깅
# 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 PORT7. 정리
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 사용