Application Lifecycle Management - ConfigMap

2025. 12. 30. 13:48·CKA

쿠버네티스에서 애플리케이션을 배포할 때, 결국 매번 마주치는 문제가 있습니다.

  • 환경별로 값이 다르다 (dev/stage/prod)
  • 배포 파일이 많아질수록 YAML 곳곳에 값이 흩어진다
  • “이미지”와 “구성”은 분리되어야 운영이 편해진다

이 글에서는 강의 내용을 기반으로:

  1. Pod 정의 파일에서 환경 변수를 직접 넣는 방법
  2. ConfigMap으로 구성 데이터를 중앙 관리하는 방법
  3. 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단계다

  1. ConfigMap 생성
  2. 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, volume 3가지 주입 방식 모두 적용해보기
  • 키가 없거나 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
'CKA' 카테고리의 다른 글
  • Application Lifecycle Management - etcd에 저장되는 secret 암호화하기
  • Application Lifecycle Management - Secret
  • Application Lifecycle Management - Docker CMD/Entrypoint와 쿠버네티스
  • Application Lifecycle Management - 배포전략
5jyan5
5jyan5
  • 5jyan5
    jyan
    5jyan5
  • 전체
    오늘
    어제
    • 분류 전체보기 (243)
      • 김영한의 스프링 핵심 원리(기본편) (8)
      • 김영한의 스프링 핵심 원리 - 고급편 (11)
      • 김영한의 스프링 MVC 1편 (1)
      • 김영한의 스프링 DB 1편 (3)
      • 김영한의 스프링 MVC 2편 (3)
      • 김영한의 ORM 표준 JPA 프로그래밍(기본편) (9)
      • 김영한의 스프링 부트와 JPA 활용2 (2)
      • 김영한의 실전 자바 - 중급 1편 (1)
      • 김영한의 실전 자바 - 고급 1편 (9)
      • 김영한의 실전 자바 - 고급 2편 (9)
      • Readable Code: 읽기 좋은 코드를 작성.. (2)
      • 김영한의 실전 자바 - 고급 3편 (9)
      • CKA (119)
      • 개발 (37)
      • 경제 (4)
      • 리뷰 (1)
      • 정보 (2)
  • 블로그 메뉴

    • 링크

    • 공지사항

    • 인기 글

    • 태그

      typequery
      락
      @discriminatorcolumn
      빈 후처리기
      조회 성능 최적화
      jdk 동적 프록시
      reentarantlock
      양방향 맵핑
      고급
      @discriminatorvalue
      스레드
      requset scope
      log trace
      버퍼
      김영한
      jpq
      @args
      cglib
      페치 조인
      프록시
      단방향 맵핑
      Thread
      WAS
      Target
      자바
      프록시 팩토리
      hibernate5module
      gesingleresult
      @within
      JPQL
    • 최근 댓글

    • 최근 글

    • hELLO· Designed By정상우.v4.10.2
    5jyan5
    Application Lifecycle Management - ConfigMap
    상단으로

    티스토리툴바