소개
ConfigMap 은 민감하지 않은 구성 데이터를 컨테이너 이미지와 분리하여 저장합니다. 이를 통해 개발 모드, 로그 수준, 기능 플래그, 엔드포인트 이름 등 서로 다른 설정으로 동일한 애플리케이션 이미지를 재사용할 수 있습니다.
이번 실습에서는 ConfigMap 을 생성하고, 데이터를 확인하며, 이를 사용하여 Pod 를 구성하고, ConfigMap 을 업데이트한 뒤, 새로운 값을 적용하기 위해 Pod 를 다시 생성하는 과정을 진행합니다. 이후 실습에서는 환경 변수 연결 및 구성 파일 마운트에 대해 더 자세히 다룰 예정이며, 이번 실습은 ConfigMap 객체와 핵심 애플리케이션 구성 워크플로우에 집중합니다.
ConfigMap 네임스페이스 준비
이 단계에서는 ConfigMap 실습을 위한 깨끗한 네임스페이스를 준비합니다.
/home/labex/project 디렉토리에서 시작합니다. 이 디렉토리에 하나의 Pod 매니페스트를 작성하게 됩니다.
mkdir -p /home/labex/project
cd /home/labex/project
Kubernetes API 서버에 접근 가능한지 확인합니다. VM 이 막 시작되어 노드가 아직 준비되지 않았다면, 몇 초 기다린 후 명령어를 다시 실행하세요.
kubectl get nodes --request-timeout=5s
예상 출력 결과:
NAME STATUS ROLES AGE VERSION
labex-v135 Ready control-plane ... v1.35...
애플리케이션 객체를 생성하기 전에 클러스터 네트워킹 Pod 가 준비 (Ready) 상태가 될 때까지 기다립니다.
kubectl wait --namespace kube-system --for=condition=Ready pod -l k8s-app=calico-node --timeout=120s
예상 출력 결과:
pod/calico-node-... condition met
ckad-prep-configmaps라는 이름의 네임스페이스를 생성합니다.
kubectl create namespace ckad-prep-configmaps
이 네임스페이스를 현재 컨텍스트 네임스페이스로 설정합니다.
kubectl config set-context --current --namespace=ckad-prep-configmaps
현재 네임스페이스를 확인합니다.
kubectl config view --minify --output 'jsonpath={..namespace}'; echo
예상 출력 결과:
ckad-prep-configmaps
ConfigMap 생성 및 확인
이 단계에서는 간단한 애플리케이션 설정이 포함된 ConfigMap 을 생성합니다.
kubectl create configmap 명령어를 사용하면 리터럴 키 - 값 쌍으로부터 직접 ConfigMap 을 생성할 수 있습니다. 각 --from-literal 플래그는 ConfigMap 의 data 필드에 하나의 항목을 추가합니다.
kubectl create configmap app-settings \
--from-literal=APP_MODE=dev \
--from-literal=LOG_LEVEL=debug \
--from-literal=FEATURE_BANNER=enabled
예상 출력 결과:
configmap/app-settings created
ConfigMap 요약을 확인합니다.
kubectl get configmap app-settings
예상 출력 결과:
NAME DATA AGE
app-settings 3 ...
저장된 값을 읽어옵니다. jsonpath를 사용하면 전체 객체를 표시하지 않고 선택한 필드만 출력할 수 있습니다.
kubectl get configmap app-settings -o 'jsonpath={.data.APP_MODE}{" "}{.data.LOG_LEVEL}{" "}{.data.FEATURE_BANNER}{"\n"}'
예상 출력 결과:
dev debug enabled
ConfigMap 을 YAML 형식으로 조회하여 객체 내에서 키가 어떻게 위치하는지 확인할 수도 있습니다.
kubectl get configmap app-settings -o yaml
예상 출력 결과:
data:
APP_MODE: dev
FEATURE_BANNER: enabled
LOG_LEVEL: debug
ConfigMap 을 사용하여 Pod 구성
이 단계에서는 ConfigMap 값을 환경 변수로 읽어오는 Pod 를 시작합니다.
envFrom.configMapRef 필드는 ConfigMap 의 모든 키를 컨테이너 환경으로 가져옵니다. 이는 민감하지 않은 소규모 설정들을 애플리케이션에 연결하는 간결한 방법입니다.
config-reader-pod.yaml 파일을 생성합니다.
cat > config-reader-pod.yaml <<'EOF'
apiVersion: v1
kind: Pod
metadata:
name: config-reader
labels:
app: config-reader
spec:
terminationGracePeriodSeconds: 0
containers:
- name: reader
image: busybox:1.36
command:
- /bin/sh
- -c
- 'echo mode=${APP_MODE}; echo level=${LOG_LEVEL}; echo banner=${FEATURE_BANNER}; sleep 3600'
envFrom:
- configMapRef:
name: app-settings
EOF
Pod 매니페스트를 적용합니다.
kubectl apply -f config-reader-pod.yaml
예상 출력 결과:
pod/config-reader created
Pod 가 준비 (Ready) 상태가 될 때까지 기다립니다.
kubectl wait --for=condition=Ready pod/config-reader --timeout=120s
예상 출력 결과:
pod/config-reader condition met
Pod 로그를 읽어옵니다. 애플리케이션이 ConfigMap 에서 가져온 값을 출력하는 것을 확인할 수 있습니다.
kubectl logs config-reader -c reader
예상 출력 결과:
mode=dev
level=debug
banner=enabled
ConfigMap 업데이트 및 Pod 재생성
이 단계에서는 ConfigMap 을 업데이트하고 Pod 를 다시 생성하여 컨테이너가 새로운 값을 반영하도록 합니다.
ConfigMap 이 환경 변수로 사용될 때, 실행 중인 컨테이너는 환경을 자동으로 변경하지 않습니다. 업데이트된 값을 읽으려면 새로운 컨테이너가 시작되어야 합니다. 이는 CKAD 시험에서 중요한 세부 사항으로, 구성을 업데이트한 후 워크로드를 재시작하거나 다시 생성해야 할 수 있습니다.
ConfigMap 을 패치합니다.
kubectl patch configmap app-settings --type merge --patch '{"data":{"APP_MODE":"prod","LOG_LEVEL":"warn","FEATURE_BANNER":"disabled"}}'
예상 출력 결과:
configmap/app-settings patched
새로운 ConfigMap 값을 확인합니다.
kubectl get configmap app-settings -o 'jsonpath={.data.APP_MODE}{" "}{.data.LOG_LEVEL}{" "}{.data.FEATURE_BANNER}{"\n"}'
예상 출력 결과:
prod warn disabled
기존 Pod 를 삭제합니다.
kubectl delete pod config-reader
예상 출력 결과:
pod "config-reader" deleted
동일한 매니페스트로 Pod 를 다시 생성하고 준비 상태가 될 때까지 기다립니다.
kubectl apply -f config-reader-pod.yaml
kubectl wait --for=condition=Ready pod/config-reader --timeout=120s
예상 출력 결과:
pod/config-reader created
pod/config-reader condition met
로그를 다시 읽어옵니다. 이제 새로운 Pod 가 업데이트된 ConfigMap 값을 확인합니다.
kubectl logs config-reader -c reader
예상 출력 결과:
mode=prod
level=warn
banner=disabled
요약
ConfigMap 을 생성하고, 데이터를 확인하며, 애플리케이션 Pod 에 연결하고, ConfigMap 을 업데이트한 뒤, Pod 를 다시 생성하여 컨테이너가 새로운 값을 반영하도록 하는 과정을 실습했습니다. 이를 통해 이후 실습에서 다룰 더 복잡한 환경 변수 및 파일 마운트 패턴을 학습하기 위한 핵심 ConfigMap 워크플로우를 익혔습니다.


