TIL

ConfigMap

사용 동기

ConfigMap object

필드 용도
data UTF-8 문자열 key-value
binaryData 바이너리 데이터 — base64-encoded string
immutable true로 설정 시 변경 불가 (v1.19+)
apiVersion: v1
kind: ConfigMap
metadata:
  name: game-demo
data:
  # property 스타일 — 단일 값
  player_initial_lives: "3"
  ui_properties_file_name: "user-interface.properties"

  # file 스타일 — 멀티라인 내용
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5

ConfigMap과 Pod

# 방식 처리 주체
1 컨테이너의 command / args 안에서 사용 kubelet (컨테이너 시작 시)
2 컨테이너의 환경 변수로 주입 kubelet
3 read-only volume으로 파일 마운트 kubelet
4 앱 코드가 Kubernetes API로 직접 조회 앱 자체

Volume으로 마운트해 사용하기

spec:
  containers:
  - name: mypod
    image: redis
    volumeMounts:
    - name: foo
      mountPath: "/etc/foo"     # 여기에 ConfigMap key들이 파일로 생성됨
      readOnly: true
  volumes:
  - name: foo
    configMap:
      name: myconfigmap

Mounted ConfigMap 자동 갱신

캐시 타입 propagation delay
watch (default) watch propagation delay
ttl-based TTL 만큼
direct (매번 API server 조회) 0

환경 변수로 사용하기

방식 필드 동작
개별 key env[].valueFrom.configMapKeyRef 특정 key 1개를 골라 환경 변수에 매핑. 환경 변수 이름을 key와 다르게 줄 수 있음
전체 key envFrom[].configMapRef ConfigMap의 모든 key-value를 한 번에 환경 변수로 주입
# 개별 key 매핑 — CONFIGMAP_USERNAME 환경 변수에 username key 값 주입
env:
- name: CONFIGMAP_USERNAME
  valueFrom:
    configMapKeyRef:
      name: myconfigmap
      key: username

# 전체 key 일괄 주입
envFrom:
- configMapRef:
    name: myconfigmap

Immutable ConfigMap

apiVersion: v1
kind: ConfigMap
metadata:
  name: myconfigmap
data:
  key: value
immutable: true