https://kubernetes.io/docs/concepts/configuration/configmap/
configmap은 키-값 쌍의 자료구조로, 기밀이 아닌 데이터를 저장하는데 사용하는 API 오브젝트이다.
파드는 볼륨에서 환경변수, 커맨드라인 아규먼트, 또는 구성파일로 configMap을 이용할 수 있다.
컨피그맵은 보안이나 암호화를 제공하지 않으므로 기밀 데이터는 Secret이나 추가 도구를 사용해야 한다.
가장 자주있는 예시로, 개발용 컴퓨터와 프로덕션 코드가 있는 클라우드에서 실행할 수 있는 애플리케이션을 개발한다고 해보자.
DATABASE_HOST
라는 환경변수는 로컬과 클라우드에서는 값이 달라져야 한다. configMap에 각 케이스마다 환경변수의 값을 다르게 참조하도록 설정할 수 있다.
configMap은 많은 양의 데이터를 보유하도록 설계되어있지 않음. 1MiB를 초과할 수 없다. 이보다 더 큰 제한을 저장해야 한다면 볼륨을 마운트하거나 별도의 DB, 파일 서비스를 사용해야 한다.
파드의 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
컨피그맵을 이용해 파드 내부에 컨테이너를 구성할 수 있는 네 가지 방법이 있음.
여기서 위의 세가지 방법은 kubelet이 파드의 컨테이너를 시작할때 컨피그맵의 데이터를 사용함. 하지만 네 번째 방법은 컨피그맵과 데이터를 읽기 위해 코드를 작성해야 한다는 것을 의미한다. 물론 쿠버네티스 API를 이용하기 때문에 애플리케이션은 컨피그맵이 변경될 때마다 업데이트를 받기 위해 구독할 수 있고, 업데이트가 있으면 반응도 한다.
다음은 위의 예시에 있는 컨피그맵을 이용해 파드를 구성하는 코드 예시이다.