컨미그맵은 키-값 쌍으로 기밀이 아닌 데이터를 저장하는데 사용하는 API 오브젝트이다. Pod는 볼륨에서 환경 변수, 커맨드-라인 인수 또는 구성 파일로 컨피그맵을 사용할 수 있다.
컨피그맵을 사용하면 컨테이너 이미지에서 환경별 구성을 분리하여, 애플리케이션을 쉽게 이식할 수 있다.
컨피그맵은 보안 또는 암호화를 제공하지 않기 때문에 저장하려는 데이터를 보호하기 위해서는 Secret을 사용하는 것이 좋다.
컨피그맵은 다른 오브젝트가 사용할 구성을 저장할 수 있는 API 오브젝트이다. spec이 있는 대부분의 쿠버네티스 오브젝트와 달리, 컨피그맵에는 data, binaryData 필드가 있다. 이러한 필드는 키-값 쌍을 값으로 허용한다. data필드와 binaryData는 모두 선택 사항이다. data 필드는 UTF-8 바이트 시퀀스를 포함하도록 설계되었으며 binaryData 필드는 바이너리 데이터를 base64로 인코딩된 문자열로 포함하도록 설계되었다.
컨피그맵의 이름은 유효한 DNS 서브도메인 이름이어야 한다.
data, binaryData 필드 아래의 각 키는 영숫자 문자, - _ . 으로 구성되어야 한다. data에 저장된 키는 binaryData 필드의 키와 겹치지 않아야 한다.
$ kubectl create cm myconfig1 --from-literal=key1=value1
configmap/myconfig1 created
$ kubectl get cm myconfig1
NAME DATA AGE
myconfig1 1 57s
$ kubectl describe cm myconfig1
Name: myconfig1
Namespace: default
Labels: <none>
Annotations: <none>
Data ## 데이터에 key1 value1이 들어가 있다.
====
key1:
----
value1
Events: <none>
데이터를 2개 넣어서 만들 수도 있다.
$ kubectl create cm myconfig2 --from-literal=key2=value2 --from-literal=key22=value22
configmap/myconfig2 created
$ kubectl describe cm myconfig2
Name: myconfig2
Namespace: default
Labels: <none>
Annotations: <none>
Data ## 데이터에 key2 value2, key22 value22가 있다.
====
key2:
----
value2
key22:
----
value22
Events: <none>
키 값을 파일 내용으로 지정할 수 도 있다.
$ cat > message.txt
hello world
$ kubectl create cm myconfig3 --from-file=message.txt
configmap/myconfig3 created
$ kubectl describe cm myconfig3
Name: myconfig3
Namespace: default
Labels: <none>
Annotations: <none>
Data ## 키값이 message.txt value 값이 message.txt의 내용인 것을 확인할 수 있다.
====
message.txt:
----
hello world
Events: <none>
## 키 값을 변경해서 넣는 방법
$ kubectl create cm myconfig4 --from-file=msg=message.txt
configmap/myconfig4 created
$ kubectl describe cm myconfig4
Name: myconfig4
Namespace: default
Labels: <none>
Annotations: <none>
Data ## 키 값이 message.txt가 아니라 msg 인 것을 확인할 수 있다.
====
msg:
----
hello world
Events: <none>
yaml 파일로 ConfigMap 만들기
$ kubectl create cm myconfig5 --from-literal=key5=value5 --from-literal=key55=value55 --dry-run -o yaml > myconfig5.yaml
W0508 00:33:44.755649 44390 helpers.go:535] --dry-run is deprecated and can be replaced with --dry-run=client.
$ cat myconfig5.yaml
apiVersion: v1
data:
key5: value5
key55: value55
kind: ConfigMap
metadata:
creationTimestamp: null
name: myconfig5
$ kubectl create -f myconfig5.yaml
configmap/myconfig5 created
$ kubectl describe cm myconfig5
Name: myconfig5
Namespace: default
Labels: <none>
Annotations: <none>
Data
====
key5:
----
value5
key55:
----
value55
Events: <none>
컨피그맵을 사용하여 파드 내부에 컨테이너를 구성할 수 있는 네 가지 방법이 있다.
1. 컨테이너 커맨드와 인수 내에서
2. 컨테이너에 대한 환경 변수
3. 애플리케이션이 읽을 수 있도록 읽기 전용 볼륨에 파일 추가
4. 쿠버네티스 API를 사용하여 컨피그맵을 읽는 파드 내에서 실행할 코드 작성
아래 코드는 컨테이너에 대한 환경 변수를 지정하는 방법이다.
apiVersion: v1
kind: Pod
metadata:
name: cmtest
spec:
containers:
- name: web
image: httpd
env:
- name: MESSAGE
valueFrom:
configMapKeyRef:
key: msg
name: myconfig4
volumeMounts:
- name: mycon
mountPath: /tmp
volumes:
- name: mycon
configMap:
name: myconfig4