본문 바로가기

IT 인프라/DevOps

Kubernetes ConfigMap으로 설정정보 관리하기

반응형

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

 

참고

 

Configure a Pod to Use a ConfigMap

 

kubernetes.io

 

반응형