ConfigMap
Kubernetes는 설정정보나 환경변수와 같은 정보들을 Docker Image에 포함시키지 않고 별도로 분리하여 관리할 수 있는 방법을 제공한다.
이를 통해 Docker Image는 어플리케이션을 실행시키기 위한 기능만을 담당하고, 각 회사/환경마다 다르게 설정되는 정보들은 ConfigMap을 통해 관리할 수 있다.
ConfigMap 생성
ConfigMap은 다음 3가지 방법 중에서 선택하여 생성할 수 있다.
$ kubectl create configmap {ConfigMap 이름} --from-file={파일 또는 디렉토리 경로} (옵션)
$ kubectl create configmap {ConfigMap 이름} --from-env-file={파일 또는 디렉토리 경로} (옵션)
$ kubectl create configmap {ConfigMap 이름} --from-literal=key1=value1 --from-literal=key2=value2 ... (옵션)
먼저 예제로 사용할 설정파일을 만든다.
이 파일을 이용하여 ConfigMap을 만드는 3가지 방법을 비교해 본다.
###
# configmap.config
###
name=hyunto
email=jhyunto@gmail.com
--from-file
파일이나 디렉토리를 ConfigMap으로 지정할 수 있다.
특정 파일이나 디렉토리를 통째로 담고 있기 때문에 보통 containers.volumeMounts 필드를 사용해 설정을 불러오는 경우가 많을 것 같다.
--from-file로 파일명이나 디렉토리를 명시하면 ConfigMap Manifest 파일에는 data 필드에 <파일명> 이후에 bar(|)를 선언하고, 밑줄부터 해당 파일의 내용이 그대로 입력된다.
만약 --from-file=<key>=<파일명 또는 디렉토리>로 입력하면 (ConfigMap Manifest 파일의) data 필드에는 파일명 대신 선언한 <key> 값이 입력될 것이다.
아래의 예제에서 ConfigMap 내용을 YAML 포맷으로 출력했는데, metadata 필드에서 name을 제외한 나머지를 지우고 나서 남은 값으로 Manifest 파일로 사용할 수 있다.
어플리케이션 전체 설정 정보를 이 파일에 담아 관리하고자 할때 유용할 것 같다.
###
# 파일 : 파일명만 설정
###
$ kubectl create configmap from-file-config --from-file=./configmap.config
configmap/from-file-config created
$ kubectl get configmap from-file-config -o yaml
apiVersion: v1
data:
configmap.config: |
name=hyunto
email=jhyunto@gmail.com
kind: ConfigMap
metadata:
creationTimestamp: "2019-11-26T15:42:24Z"
name: from-file-config
namespace: default
resourceVersion: "5822"
selfLink: /api/v1/namespaces/default/configmaps/from-file-config
uid: 577f1e1c-1063-11ea-a980-025000000001
###
# 파일 : 파일의 이름(키)를 설정
###
$ kubectl create configmap from-file-config-key --from-file=my.config=./configmap.config
configmap/from-file-config-key created
$ kubectl get configmap from-file-config-key -o yaml
apiVersion: v1
data:
my.config: |
name=hyunto
email=jhyunto@gmail.com
kind: ConfigMap
metadata:
creationTimestamp: "2019-11-26T15:53:34Z"
name: from-file-config-key
namespace: default
resourceVersion: "6640"
selfLink: /api/v1/namespaces/default/configmaps/from-file-config-key
uid: e72a372f-1064-11ea-a980-025000000001
###
# 디렉토리
# - config 디렉토리 안에 configmap.config가 존재한다.
###
$ kubectl create configmap from-file-config-dir --from-file=./config
configmap/from-file-config-dir created
$ kubectl get configmap from-file-config-dir -o yaml
apiVersion: v1
data:
configmap.config: |
name=hyunto
email=jhyunto@gmail.com
kind: ConfigMap
metadata:
creationTimestamp: "2019-11-26T15:50:14Z"
name: from-file-config-dir
namespace: default
resourceVersion: "6397"
selfLink: /api/v1/namespaces/default/configmaps/from-file-config-dir
uid: 6fb6861f-1064-11ea-a980-025000000001
--from-env-file
--from-env-file은 지정한 파일에서 key=value 쌍으로 이뤄진 값을 읽어 ConfigMap을 구성한다.
앞서 수행한 --from-file과 비교하면 저장된 형태가 다른 것을 알 수 있다.
$ kubectl create configmap from-env-file-config --from-env-file=./configmap.config
configmap/from-env-file-config created
$ kubectl get configmap from-env-file-config -o yaml
apiVersion: v1
data:
email: jhyunto@gmail.com
name: hyunto
kind: ConfigMap
metadata:
creationTimestamp: "2019-11-26T16:01:56Z"
name: from-env-file-config
namespace: default
resourceVersion: "7250"
selfLink: /api/v1/namespaces/default/configmaps/from-env-file-config
uid: 120f9d0f-1066-11ea-a980-025000000001
--from-literal
--from-literal은 말 그대로 리터럴 형태로 key, value를 ConfigMap에 설정하는 방식이다.
ConfigMap에 저장된 형태를 보면 --from-env-file과 동일한 것을 볼 수 있다.
$ kubectl create configmap from-literal-config --from-literal=name=hyunto --from-literal=email=jhyunto@gmail.com
configmap/from-literal-config created
$ kubectl get configmap from-literal-config -o yaml
apiVersion: v1
data:
email: jhyunto@gmail.com
name: hyunto
kind: ConfigMap
metadata:
creationTimestamp: "2019-11-26T16:06:06Z"
name: from-literal-config
namespace: default
resourceVersion: "7557"
selfLink: /api/v1/namespaces/default/configmaps/from-literal-config
uid: a73fdfce-1066-11ea-a980-025000000001
ConfigMap 사용
환경변수로 사용하기
###
# 사용방법
###
spec:
template:
spec:
containers:
... <생략> ...
env:
- name: {환경변수 이름}
valueFrom:
configMapKeyRef:
name: {ConfigMap 이름}
key: {ConfigMap의 data 필드에 있는 Key}
###
# 사용 예시
###
containers:
... <생략> ...
env:
- name: MY_NAME
valueFrom:
configMapKeyRef:
name: from-env-file-config
key: name
###
# 적용 확인
# - Pod에 직접 접속하여 환경변수를 확인
###
root@configmap-test-75fc54bc76-rf5qq:/# env | grep MY_NAME
MY_NAME=hyunto
볼륨 마운트하여 사용하기
###
# 사용방법
###
spec:
templates:
spec:
containers:
...<생략>...
volumeMounts:
- name: configmap-volume
mountPath: /tmp
volumes:
- name: configmap-volume
configMap:
name: from-file-config
###
# 사용 예시
###
containers:
...<생략>...
volumeMounts:
- name: configmap-volume
mountPath: /tmp
volumes:
- name: configmap-volume
configMap:
name: from-file-config
###
# 적용 확인
# - Pod에 직접 접속하여 /tmp 디렉토리와 파일 내용 확인
###
root@configmap-test-75fc54bc76-rf5qq:~# ls -lh /tmp
total 0
lrwxrwxrwx 1 root root 23 Nov 26 16:28 configmap.config -> ..data/configmap.config
root@configmap-test-75fc54bc76-rf5qq:~# cat /tmp/configmap.config
name=hyunto
email=jhyunto@gmail.com
실습에 사용한 Deployment.yml 파일
apiVersion: apps/v1
kind: Deployment
metadata:
name: configmap-test
spec:
selector:
matchLabels:
app: configmap-test
template:
metadata:
labels:
app: configmap-test
spec:
containers:
- name: nginx
image: nginx
resources:
limits:
memory: "2Gi"
cpu: "500m"
ports:
- containerPort: 80
env:
- name: MY_NAME
valueFrom:
configMapKeyRef:
name: from-env-file-config
key: name
volumeMounts:
- name: configmap-volume
mountPath: /tmp
volumes:
- name: configmap-volume
configMap:
name: from-file-config
참고
'IT 인프라 > DevOps' 카테고리의 다른 글
Kubernetes란 무엇인가? (0) | 2019.12.13 |
---|---|
Kubernetes Secret으로 기밀정보 관리하기 (0) | 2019.11.27 |
Docker 이미지 용량을 줄이는 Tip (0) | 2019.11.19 |
나만의 Docker Compose Cheat Sheet (0) | 2019.11.18 |
나만의 Dockerfile Cheat Sheet (0) | 2019.11.18 |