쿠버네티스에서 애플리케이션을 배포할 때, 결국 매번 마주치는 문제가 있습니다.
- 환경별로 값이 다르다 (dev/stage/prod)
- 배포 파일이 많아질수록 YAML 곳곳에 값이 흩어진다
- “이미지”와 “구성”은 분리되어야 운영이 편해진다
이 글에서는 강의 내용을 기반으로:
- Pod 정의 파일에서 환경 변수를 직접 넣는 방법
- ConfigMap으로 구성 데이터를 중앙 관리하는 방법
- ConfigMap을 Pod에 주입하는 대표 방식(환경 변수/전체 주입/볼륨 파일)
까지 흐름대로 정리합니다. (Secret은 다음 강의 주제라 개념만 짚고 넘어갑니다.)
1) Pod에서 환경 변수 직접 설정: env (키-값 직접 입력)
가장 단순한 방식은 Pod 스펙에 환경 변수를 직접 적는 것입니다.
env는 배열(array) 이고- 항목 하나하나는
-(dash)로 시작하며 - 각 항목은
name,value를 가집니다.
예시:
apiVersion: v1
kind: Pod
metadata:
name: webapp-pod
spec:
containers:
- name: webapp
image: my-webapp:1.0
env:
- name: APP_COLOR
value: blue
- name: APP_MODE
value: "prod"
이 방식은 “빠르고 직관적”이지만, Pod/Deployment YAML이 많아지면 환경 데이터가 여러 파일에 분산되어 관리 포인트가 급격히 늘어납니다.
2) 왜 ConfigMap이 필요한가?
강의에서 강조한 현실적인 문제는 이것입니다.
- 파드 정의 파일이 많으면
- 환경 변수(구성 데이터)를 각 파일에서 따로 관리하기 어려워진다
그래서 구성 데이터를 Pod 정의 파일에서 분리해 ConfigMap으로 중앙 관리합니다.
ConfigMap이란?
- 쿠버네티스에서 키-값 형태로 “구성 데이터”를 저장하는 오브젝트
- Pod가 생성될 때 ConfigMap을 주입(inject) 해서
- 컨테이너 내부 애플리케이션이 환경 변수로 사용하거나
- 파일(볼륨 마운트) 형태로 사용할 수 있게 합니다.
3) ConfigMap 구성은 2단계다
- ConfigMap 생성
- Pod(또는 Deployment 등)에 주입
이 흐름은 “다른 K8s 오브젝트와 동일”합니다.
4) ConfigMap 생성 방법 2가지: 명령형 vs 선언형
4-1) 명령형(Imperative): YAML 없이 바로 생성
(1) --from-literal로 키-값 직접 입력
kubectl create configmap appconfig \
--from-literal=APP_COLOR=blue \
--from-literal=APP_MODE=prod
- 간단하지만 키가 많아지면 커맨드가 길고 관리가 어려워집니다.
(2) --from-file로 파일 기반 입력
구성 데이터가 파일로 존재한다면, 파일을 통째로 ConfigMap에 넣을 수 있습니다.
kubectl create configmap appconfig \
--from-file=./config.properties
- 이 경우 파일 내용이 저장되고, 기본적으로 키는 파일명이 됩니다.
- 애플리케이션이 “파일 기반 설정”을 읽는 구조면 특히 유용합니다.
4-2) 선언형(Declarative): ConfigMap 정의 파일로 생성
Pod처럼 YAML로 정의 파일을 만들고 apply/create 합니다.
apiVersion: v1
kind: ConfigMap
metadata:
name: appconfig
data:
APP_COLOR: blue
APP_MODE: "prod"
적용:
kubectl apply -f appconfig.yaml
선언형 방식의 장점:
- Git에 넣고 형상 관리하기 좋음
- 환경별 오버레이(Kustomize/Helm) 구성도 쉬움
- 운영에서 “정합성”이 높음
강의에서도 “ConfigMap 이름을 잘 짓는 게 중요하다”고 강조합니다. 나중에 Pod/Deployment에서 이 이름을 참조해 주입하기 때문입니다.
5) ConfigMap 조회/확인
kubectl get configmaps
kubectl describe configmap appconfig
describe에서Data섹션으로 실제 키-값을 확인할 수 있습니다.
6) Pod에 ConfigMap 주입하기 (2단계 중 2단계)
이제 “Pod 정의 파일에서 env를 직접 쓰는 대신”, ConfigMap을 참조해 환경 변수를 넣습니다.
6-1) 단일 환경 변수로 주입: env.valueFrom.configMapKeyRef
특정 키 하나만 환경 변수로 넣고 싶을 때:
apiVersion: v1
kind: Pod
metadata:
name: webapp-configmap-single
spec:
containers:
- name: webapp
image: my-webapp:1.0
env:
- name: APP_COLOR
valueFrom:
configMapKeyRef:
name: appconfig
key: APP_COLOR
name: ConfigMap 이름key: ConfigMap 내부 키
6-2) ConfigMap 전체를 한 번에 주입: envFrom
ConfigMap의 모든 키를 환경 변수로 넣고 싶다면:
apiVersion: v1
kind: Pod
metadata:
name: webapp-configmap-all
spec:
containers:
- name: webapp
image: my-webapp:1.0
envFrom:
- configMapRef:
name: appconfig
- ConfigMap의
data아래 모든 키가 환경 변수로 들어갑니다. - 키 충돌 가능성이 있으니 팀 규칙(접두사 등)을 정해두면 좋습니다.
6-3) “볼륨 파일”로 주입 (강의에서 언급된 다른 방식)
강의 마지막에 “전체 데이터를 볼륨의 파일로 삽입할 수도 있다”고 언급합니다.
대표 패턴:
apiVersion: v1
kind: Pod
metadata:
name: webapp-configmap-volume
spec:
containers:
- name: webapp
image: my-webapp:1.0
volumeMounts:
- name: config-vol
mountPath: /etc/config
volumes:
- name: config-vol
configMap:
name: appconfig
/etc/config/APP_COLOR,/etc/config/APP_MODE같은 파일로 생성됩니다.- 애플리케이션이 “환경 변수”가 아니라 “파일”을 읽는 구조라면 이 방식이 깔끔합니다.
- spring boot에서 application.yaml같은 파일을 넣어줘야할 때 이런 방식을 사용할 수 있음.
- 키=파일명, value는 내용으로 들어감
7) Secret과의 관계 (강의의 연결 포인트)
강의에서 “환경 변수를 설정하는 다른 방법으로 ConfigMap과 Secret이 있다”고 했고, 차이는 명확합니다.
- ConfigMap: 일반 구성 데이터(민감하지 않은 값)
- Secret: 비밀번호/토큰 등 민감 데이터(보안 고려 대상)
이 글에서는 ConfigMap 중심으로 다뤘고, Secret은 다음 강의에서 같은 패턴으로 확장됩니다. (Pod 스펙에서는 secretKeyRef, secretRef 등으로 주입 방식이 유사합니다.)
8) 핵심 정리
- Pod에 환경 변수를 직접 넣을 땐
env: [{name, value}] - YAML이 많아지면 구성 데이터 관리가 어려워지고, 그 해결이 ConfigMap
- ConfigMap은 먼저 만들고 → Pod에 주입한다
- ConfigMap 생성:
- 명령형:
kubectl create configmap ... --from-literal/--from-file - 선언형: ConfigMap YAML로
kubectl apply -f ...
- 명령형:
- 주입 방식:
- 단일 키:
env.valueFrom.configMapKeyRef - 전체 키:
envFrom.configMapRef - 파일로:
volumes.configMap+volumeMounts
- 단일 키:
실습 체크리스트
env로 직접 넣고 Pod 내부에서printenv로 확인- ConfigMap을 명령형/선언형으로 각각 만들어보기
configMapKeyRef,envFrom,volume3가지 주입 방식 모두 적용해보기- 키가 없거나 ConfigMap 이름이 틀렸을 때 Pod 이벤트/에러가 어떻게 나오는지 관찰하기
Practice Test: https://uklabs.kodekloud.com/topic/practice-test-env-variables-2/
'CKA' 카테고리의 다른 글
| Application Lifecycle Management - etcd에 저장되는 secret 암호화하기 (0) | 2025.12.30 |
|---|---|
| Application Lifecycle Management - Secret (0) | 2025.12.30 |
| Application Lifecycle Management - Docker CMD/Entrypoint와 쿠버네티스 (0) | 2025.12.30 |
| Application Lifecycle Management - 배포전략 (0) | 2025.12.30 |
| Logging - 쿠버네티스 로깅 기초 (0) | 2025.12.30 |