학습 내용

ConfigMap이란?

컨테이너 구성 정보를 한 곳에 모아서 관리하는 리소스. 환경변수나 설정 파일을 Pod와 분리하여 관리할 수 있다.

전달 방식:

  • 환경변수 (env / envFrom)
  • 볼륨 마운트 (Volume Mount)

ConfigMap 생성:

kubectl create configmap CONFIG_NAME --from-file=source --from-literal=key1=value1
  • --from-literal: 키=값 쌍을 직접 지정
  • --from-file: 파일 내용을 통째로 ConfigMap에 저장 (파일명이 key, 내용이 value)

적용 방식 3가지

1. 일부분만 적용 (configMapKeyRef) ConfigMap의 특정 key만 골라서 Pod의 환경변수로 주입.

2. 전체 적용 (configMapRef + envFrom) ConfigMap의 모든 key-value를 한 번에 환경변수로 주입.

3. 볼륨 마운트로 적용 ConfigMap의 key를 파일로 컨테이너 내부 디렉토리에 마운트. 설정 파일(nginx.conf 등)을 전달할 때 유용.

운영 팁: 수정 사항이 발생하면 ConfigMap만 수정하고 Pod를 재시작하면 된다!

실습용 genid 컨테이너 구조 (build/)

FROM ubuntu:18.04
RUN apt-get update ; apt-get -y install rig boxes
ENV INTERVAL 5
ENV OPTION stone
ADD genid.sh /bin/genid.sh
RUN chmod +x /bin/genid.sh
ENTRYPOINT ["/bin/genid.sh"]
#!/bin/bash
mkdir -p /webdata
while true
do
  /usr/bin/rig | /usr/bin/boxes -d $OPTION > /webdata/index.html
  sleep $INTERVAL
done

genid 컨테이너는 INTERVAL초마다 가짜 ID를 생성해서 /webdata/index.html에 쓴다. nginx 컨테이너가 이 파일을 서빙하는 구조.


실습 예제 (GitHub 237summit)

ConfigMap 일부 적용 — genid.yaml

apiVersion: v1
kind: Pod
metadata:
  name: genid-stone
spec:
  containers:
  - image: smlinux/genid:env
    env:
    - name: INTERVAL
      valueFrom:
        configMapKeyRef:
          name: ttabae-config
          key: INTERVAL
    name: fakeid
    volumeMounts:
    - name: html
      mountPath: /webdata
  - image: nginx:1.14
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
  volumes:
  - name: html
    emptyDir: {}

configMapKeyRef로 ttabae-config의 INTERVAL 키만 환경변수로 주입

ConfigMap 전체 적용 — genid-whole.yaml

apiVersion: v1
kind: Pod
metadata:
  name: genid-boy
spec:
  containers:
  - image: smlinux/genid:env
    envFrom:
    - configMapRef:
        name: ttabae-config
    name: fakeid
    volumeMounts:
    - name: html
      mountPath: /webdata
  - image: nginx:1.14
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    ports:
    - containerPort: 80
  volumes:
  - name: html
    emptyDir: {}

envFrom + configMapRef로 ttabae-config의 모든 key-value를 환경변수로 주입

ConfigMap 볼륨 마운트 — genid-volume.yaml

apiVersion: v1
kind: Pod
metadata:
  name: genid-volume
spec:
  containers:
  - image: smlinux/genid:env
    env:
    - name: INTERVAL
      valueFrom:
        configMapKeyRef:
          name: ttabae-config
          key: INTERVAL
    name: fakeid-generator
    volumeMounts:
    - name: html
      mountPath: /webdata
  - image: nginx:1.14
    name: web-server
    ports:
    - containerPort: 80
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    - name: config
      mountPath: /etc/nginx/conf.d
      readOnly: true
  volumes:
  - name: html
    emptyDir: {}
  - name: config
    configMap:
      name: ttabae-config
      items:
      - key: nginx-config.conf
        path: nginx-config.conf

ConfigMap의 nginx-config.conf 키를 파일로 /etc/nginx/conf.d/nginx-config.conf에 마운트

마운트되는 nginx 설정 파일 — config.dir/nginx-config.conf

server {
    listen   80;
    server_name  www.example.com;
 
    gzip on;
    gzip_types text/plain application/xml;
 
    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }
}

핵심 정리

  • ConfigMap = 구성 정보를 Pod와 분리하여 관리. 환경변수 또는 파일 마운트로 전달.
  • configMapKeyRef: 특정 key만 선택적으로 환경변수로 주입.
  • configMapRef + envFrom: 전체 key-value를 한 번에 환경변수로 주입.
  • 볼륨 마운트: ConfigMap의 key를 파일로 컨테이너 디렉토리에 마운트 (설정 파일 전달에 유용).
  • ConfigMap 변경 시 Pod 재시작으로 반영 가능 (볼륨 마운트 방식은 일부 자동 반영).

체크리스트

  • ConfigMap을 생성하는 3가지 방법(literal, file, dir)을 사용할 수 있는가?
  • configMapKeyRef와 envFrom의 차이를 설명할 수 있는가?
  • ConfigMap을 볼륨으로 마운트하는 YAML을 작성할 수 있는가?
  • ConfigMap과 Secret의 차이를 설명할 수 있는가?

참고 링크