ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 쿠버네티스 컨피그맵(kubernetes configmap)
    Kubernetes 2018. 8. 1. 09:00
    컨피그맵(configmap)은 컨테이너에서 필요한 환경설정 내용을 컨테이너와 분리해서 제공해 주기 위한 기능입니다. 클라우드 네이티브 아키텍처에서 컨테이너는 변하지 않는 자원이어야 합니다. 개발할때 사용하는 컨테이너와 실제 서비스용으로 사용되는 컨테이너가 동일해야 한다는 것입니다. 그래야지만 개발과 서비스 사이의 환경 차이에서 오는 잠재적 문제를 제가할 수 있습니다. 그런데 개발용과 서비스용에서는 서로 다른 설정이 필요한 경우가 많습니다. 간단히는 사용하는 DB가 다를수도 있고 실제 개발할때는 로그를 debug모드로 출력하고 서비스용에서는 info 모드로 로그를 출력해야 하는등 여러가지 다른 설정을 해야합니다. 이렇게 다른 설정을 가지고 실행을 해야할때 사용하는 것이 컨피그맵입니다. 컨피그맵을 컨테이너와 분리해 둠으로써 하나의 동일한 컨테이너를 가지고 개발용, 스테이지용, 서비스용으로 모두 사용하는 것이 가능해 집니다. 

    컨피그맵을 사용해보기 위해서 우선은 컨피그 맵을 선언해 두어야 합니다.
    config-dev.yaml로 아래 내용을 파일로 만든뒤 kubectl apply -f config-dev.yaml로 쿠버네티스 클러스터안에 생성합니다.
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: config-dev
      namespace: default
    data:
      DB_URL: localhost
      DB_USER: myuser
      DB_PASS: mypass
      DEBUG_INFO: debug
    생성된 컨피그맵은 kubectl get configmap 명령으로 확인할 수 있습니다. kubectl describe configmap config-dev 명령으로 설정내용이 제대로 들어갔는지확인 가능합니다. 이런 컨피그맵을 컨테이너에서 가져다 사용하는 방법은 3가지 정도가 있습니다.
    • 컨피그맵으로 설정한 설정중 일부 설정만 가져와서 사용하기
    • 전체 컨피그맵 데이터를 한꺼번에 가져와서 사용하기
    • 컨피그맵을 볼륨으로 가져와서 사용하기

    컨피그맵으로 설정한 설정중 일부 설정만 가져와서 사용하기
    아래 내용을 deployment-config.yaml로 저장하고 kubectl apply -f deployment-config.yaml로클러스터에 생성합니다. 이 파일에는 편의를 위해서 노드포트타입의 서비스까지 포함되어 있습니다.
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: configapp
      labels:
        app: configapp
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: configapp
      template:
        metadata:
          labels:
            app: configapp
        spec:
          containers:
          - name: testapp
            image: arisu1000/simple-container-app:latest
            ports:
            - containerPort: 8080
            env:
              - name: DEBUG_LEVEL
                valueFrom:
                  configMapKeyRef:
                     name: config-dev
                     key: DEBUG_INFO
    ---
    apiVersion: v1
    kind: Service
    metadata:
      labels:
        app: configapp
      name: configapp-svc
      namespace: default
    spec:
      ports:
      - nodePort: 30800
        port: 8080
        protocol: TCP
        targetPort: 8080
      selector:
        app: configapp
      type: NodePort
    config-dev라는 이름으로 만든 컨피그맵에는 4개의 데이터가 있습니다. 앞의 파일에서는 이중에 DEBUG_INFO값만 가져와서 사용합니다. 이걸 컨테이너의 DEBUG_LEVEL이라는 환경변수로 넣어줍니다. 확인하기 위해서 웹브라우저에서 http://localhost:30800/env 로 확인해 봅니다. DEBUG_LEVEL에 debug라는 값이 들어간걸 확인할 수 있습니다.


    전체 컨피그맵 데이터를 한꺼번에 가져와서 사용하기
    컨피그맵 전체를 한꺼번에 컨테이너의 환경변수에 넣을수도 있습니다. 아래 내용을 보면 env가 아니라 envFrom으로 선언하고 configMapRef로 config-dev를 연결합니다. 이 내용을 파일로 저장해서 클러스터에 적용한 다음에 브라우저에서 확인하면 config-dev에 있는 변수 4개가 모두 적용되어 있는걸 확인할 수 있습니다.
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: configapp
      labels:
        app: configapp
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: configapp
      template:
        metadata:
          labels:
            app: configapp
        spec:
          containers:
          - name: testapp
            image: arisu1000/simple-container-app:latest
            ports:
            - containerPort: 8080
            envFrom:
            - configMapRef:
                name: config-dev


    이 상태에서 컨테이너는 유지한채로 컨피그맵만 변경해 보겠습니다.
    아래 내용을 configmap-prod.yaml로 저장하고 kubectl apply -f configmap-prod.yaml 명령으로 클러스터에 적용합니다.
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: config-prod
      namespace: default
    data:
      DB_URL: prodhost
      DB_USER: produser
      DB_PASS: produser
      DEBUG_INFO: production
    이 컨피그맵을 적용하기 위해서 앞의 deployment예정에서 config-dev로 설정되어 있는 컨피그맵 설정부분을 config-prod로 변경하고 적용합니다. 다시 브라우저에서 확인해 보면 설정들이 config-prod에 있는 내용으로 변경된 걸 확인할 수 있습니다.


    컨피그맵을 볼륨으로 가져와서 사용하기
    컨피그맵의 내용을 컨테이너의 환경변수로 주는 것뿐만 아니라 다른 방식으로 사용할수도 있습니다. 볼륨형식으로 컨테이너에 붙여서 파일로 컨테이너에 제공해 주는게 가능합니다. 다음처럼 설정을 하면 됩니다.
    config-volume라는 볼륨을 만들어서 config-dev의 내용을 컨테이너의 /etc/config디렉토리에 각 데이터 키를 이름으로가지는 파일을 만들어서 넣어줍니다.
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: configapp
      labels:
        app: configapp
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: configapp
      template:
        metadata:
          labels:
            app: configapp
        spec:
          containers:
          - name: testapp
            image: arisu1000/simple-container-app:latest
            ports:
            - containerPort: 8080
            volumeMounts:
            - name: config-volume
              mountPath: /etc/config
          volumes:
          - name: config-volume
            configMap:
              name: config-dev
    웹브라우저에서 다시 http://localhost:30800/env 를 확인해보면 이번에는 config-dev의 내용들이 보이지 않습니다. 컨피그맵의 내용이 환경설정이 아니라 볼륨을 이용해 파일형식으로 컨테이너에 입력되었기 때문입니다. http://localhost:30800/volume-config?path=/etc/config/DB_USER 처럼 확인해 보면  컨테이너 내부의 /etc/config/DB_USER라는 파일 내용을 확인해 볼 수 있습니다.

    컨테이너 내부에 진짜 파일이 만들어져 있는지 확인해 보려면 다음 처럼 컨테이너 내부에 들어가서 확인해 볼 수 있습니다.



    댓글 0

Designed by Tistory.