https://kubernetes.io/docs/concepts/configuration/configmap/

configmap은 키-값 쌍의 자료구조로, 기밀이 아닌 데이터를 저장하는데 사용하는 API 오브젝트이다.

파드는 볼륨에서 환경변수, 커맨드라인 아규먼트, 또는 구성파일로 configMap을 이용할 수 있다.

컨피그맵은 보안이나 암호화를 제공하지 않으므로 기밀 데이터는 Secret이나 추가 도구를 사용해야 한다.

왜 사용하는가?(Motivation)

가장 자주있는 예시로, 개발용 컴퓨터와 프로덕션 코드가 있는 클라우드에서 실행할 수 있는 애플리케이션을 개발한다고 해보자.

DATABASE_HOST 라는 환경변수는 로컬과 클라우드에서는 값이 달라져야 한다. configMap에 각 케이스마다 환경변수의 값을 다르게 참조하도록 설정할 수 있다.

configMap은 많은 양의 데이터를 보유하도록 설계되어있지 않음. 1MiB를 초과할 수 없다. 이보다 더 큰 제한을 저장해야 한다면 볼륨을 마운트하거나 별도의 DB, 파일 서비스를 사용해야 한다.

ConfigMap and Pod

파드의 spec에 configmap을 참조하도록 작성하고 컨피그맵의 데이터를 기반으로 해당 파드의 컨테이너를 구성할 수 있다. 이때 파드와 컨피그맵은 동일한 네임스페이스에 있어야 한다.

특정 노드의 kubelet 데몬이 직접 관리하는 파드인 스태틱 파드의 spec은 컨피그맵이나 다른 API오브젝트를 참조할 수 없다.

다음은 컨피그맵의 예시코드임

apiVersion: v1
kind: ConfigMap
metadata:
  name: game-demo
data:
# 속성과 비슷한 키; 각 키는 간단한 값으로 매핑됨
  player_initial_lives: "3"
  ui_properties_file_name: "user-interface.properties"
# 파일과 비슷한 키
  game.properties: |
    enemy.types=aliens,monsters
    player.maximum-lives=5
  user-interface.properties: |
    color.good=purple
    color.bad=yellow
    allow.textmode=true

컨피그맵을 이용해 파드 내부에 컨테이너를 구성할 수 있는 네 가지 방법이 있음.

  1. 컨테이너 커맨드와 인수 내에서 컨피그맵 사용
  2. 컨테이너에 대한 환경변수에 컨피그맵 사용
  3. 애플리케이션이 읽을 수 있는 읽기 전용 볼륨에 컨피그맵 추가
  4. 쿠버네티스 API를 이용해 컨피그맵을 읽는 파드 내에 실행할 코드 작성

여기서 위의 세가지 방법은 kubelet이 파드의 컨테이너를 시작할때 컨피그맵의 데이터를 사용함. 하지만 네 번째 방법은 컨피그맵과 데이터를 읽기 위해 코드를 작성해야 한다는 것을 의미한다. 물론 쿠버네티스 API를 이용하기 때문에 애플리케이션은 컨피그맵이 변경될 때마다 업데이트를 받기 위해 구독할 수 있고, 업데이트가 있으면 반응도 한다.

다음은 위의 예시에 있는 컨피그맵을 이용해 파드를 구성하는 코드 예시이다.