이쿠의 슬기로운 개발생활

함께 성장하기 위한 보안 개발자 EverNote 내용 공유

클라우드/Kubernetes

10. Kubernetes ConfigMap

이쿠우우 2020. 8. 17. 19:28
반응형

Kubernetes ConfigMap

 

 

참고) 실습환경

 

[Master Node server]

OS = CentOS 7

리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64

docker version : 1.13.1

docker api verison : 1.26

 

[Worker Node server]

OS = CentOS 7

리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64

docker version : 1.13.1

docker api verison : 1.26

 

[Kubernetes version]

1.18

 

 

 

 

1. Kubernetes ConfigMap Object란?

ConfigMap 은 Key-Value 형태의 설정값을 가지고 기밀이 아닌 데이터를 저장하는 데 사용하는 kubernetes Object.

즉 설정 정보를 저장해놓는 일종의 저장소 역할.

Application(개발한 프로그램)을 배포하다 보면, 환경에 따라서 다른 설정값을 사용하는 경우가 있음.

예를 들어, DB의 IP, API를 호출하기 위한 API KEY, 개발/운영에 따른 디버그 모드, 환경 설정 파일들이 있는데,

Container image는 같지만, 이런 환경 변수가 차이가 나는 경우

매번 다른 Container image를 만드는 것은 관리상 불편할 수 밖에 없음

이렇게 다른 설정을 가지고 실행을 해야할때 사용하는 것이 바로 ConfigMap Object.

ConfigMap은 환경 변수나 설정값들을 변수로 관리해서 Pod가 생성될 때 이 값을 넣어줄 수 있으니

Container와 분리해서 하나의 동일한 컨테이너를 가지고

개발용, 스테이지용, 운영용으로 모두 사용하는 것이 가능해짐.

 

ConfigMap Object 특징 1.

  • ConfigMap 은 간단한 문자부터 큰 설정의 파일까지 Value 값으로 가질 수 있음

ConfigMap Object 특징 2.

  • Pod는 ConfigMap과 서로 독립적인 리소스이기 때문에 

  • Pod에서 ConfigMap을 사용하는 방식은

  • 내부의 다양한 옵션(환경변수, Volume Object)을 사용해서 ConfigMap에 접근할 수 있음.

ConfigMap Object 특징 3.

  • 동일한 Pod라도 여러개의 ConifgMap을 사용할 수 있음

ConfigMap Object 특징 4.

  • Container의 Application에서 사용하는 설정 값을 분리하여

  • 소스코드상에서 직접 사용하던 설정 값들을 유지하는 역할을 수행함

 

 


 

 

2. ConfigMap 환경변수로 전달

2.1. ConfigMap 설정 중 일부만 전달

ConfigMap 전체 data 중 선택한 일부만 가져와서 적용

 

[ ConfigMap.yaml 파일 예제 ]

apiVersion: v1

kind: ConfigMap

metadata:

  name: iksoon-configmap-test

data:

  K8S_VERSION_TEST: "kubernetes_version_test1"  # data 하위에 전달할 Key-Value를 명시

  K8S_CONFIGMAP_TEST: "Kubernetes_configMap_1"  # Key : K8S_CONFIGMAP_TEST, Value : Kubernetes_configMap_1

  K8S_TEST: "iksoon_TEST_1"                     # Key :K8S_TEST, Value :iksoon_TEST_1

 

[ deployment.yaml 파일 예제 ]

apiVersion: apps/v1

kind: Deployment

metadata:

  name: iksoon-deployment

  labels:

    app: iksoon-tomcat

spec:

  replicas: 1

  selector:

    matchLabels:

      app: iksoon-pod

  template:

    metadata:

      labels:

        app: iksoon-pod

    spec:

      containers:

      - name: iksoon-tomcat

        image: peksoon/iksoon_tomcat:1.0.4

        ports:

        - containerPort: 8080

        env:                                env : 항목을 추가 해서 configmap 설정을 적용함

        - name: VERSION_TEST      # - name : 해당 Pod 에 적용될 환경변수 이름 

                                             #          (만들어진 Pod의 환경변수 조회 시 해당 이름이 있음)

          valueFrom:                    # valueFrom : name에서 명시한 환경변수에 올 값을 설정함

            configMapKeyRef       # configMapKeyRef : 불러올 configMap과 key를 명시함

              name: iksoon-configmap-test  name: 항목에 configMap 파일의 metadata:  name 이 들어가야함

              key: K8S_VERSION_TEST         # key : 항목에 configMap에 설정되어있는 data의 key 이름이 들어가야 함

        - name: K8S_CONFIGMAP             # - name을 추가해서 다수의 환경변수를 설정할 수 있음

          valueFrom:

            configMapKeyRef:

              name: iksoon-configmap-test

              key: K8S_CONFIGMAP_TEST

        - name: TEST_IKSOON

          valueFrom:

            configMapKeyRef:

              name: iksoon-configmap-test

              key: K8S_TEST

 

---

apiVersion: v1

kind: Service

metadata:

  name: iksoon-service

spec:

  ports:

  - port: 8080

    targetPort: 8080

  selector:

    app: iksoon-pod

 

[ 결과] 

VERSION_TEST, K8S_CONFIGMAP 환경 변수 값에 configMap에서 설정한 값이 들어갔음을 확인 가능

page 접속해서 확인하는 방법 이외에 pod의 container에 접속해서 env 명령으로도 확인 가능

 

 

 

 

2.2. ConfigMap 설정 모두 전달

ConfigMap 전체 data를 한꺼번에 가져와서 사용하는 방법

 

[ ConfigMap.yaml 파일 예제 ]

apiVersion: v1

kind: ConfigMap

metadata:

  name: iksoon-configmap-test

data:

  K8S_VERSION: "kubernetes_version_test1"       # data 하위에 전달할 Key-Value를 명시

  K8S_CONFIGMAP: "Kubernetes_configMap_1"  # Key : K8S_CONFIGMAP_TEST, Value : Kubernetes_configMap_1

  K8S_TEST: "iksoon_TEST_1"                          # Key :K8S_TEST, Value :iksoon_TEST_1

 

[ deployment.yaml 파일 예제 ] 

apiVersion: apps/v1

kind: Deployment

metadata:

  name: iksoon-deployment

  labels:

    app: iksoon-tomcat

spec:

  replicas: 1

  selector:

    matchLabels:

      app: iksoon-pod

  template:

    metadata:

      labels:

        app: iksoon-pod

    spec:

      containers:

      - name: iksoon-tomcat

        image: peksoon/iksoon_tomcat:1.0.4

        ports:

        - containerPort: 8080

        envFrom:                        envFrom : 항목을 추가해서 configmap 설정을 적용함 

                                            #           configmap 설정 중 일부의 경우 env였는데 전체 적용은 envFrom을 사용

        - configMapRef:              # configMapRef : 불러올 configMap을 명시함  

            name: iksoon-configmap-test  # name: 항목에 configMap 파일의 metadata:  name 이 들어가야 함

 

---

apiVersion: v1

kind: Service

metadata:

  name: iksoon-service

spec:

  ports:

  - port: 8080

    targetPort: 8080

  selector:

    app: iksoon-pod

 

 

[ 결과 ]

VERSION_TEST, K8S_CONFIGMAP 환경 변수 값에 configMap에서 설정한 값이 들어갔음을 확인 가능

page 접속해서 확인하는 방법 이외에 pod의 container에 접속해서 env 명령으로도 확인 가능

 

 


 

 

3. ConfigMap File 형태로 전달

File의 내용을 환경변수 형태로 Deployment에 전달하는 방법.

 

[ testKeyValue.proerites 파일 예제 ]

  K8S_VERSION: "kubernetes_version_test1"
  K8S_CONFIGMAP: "Kubernetes_configMap_1"
  K8S_TEST: "iksoon_TEST_1"

 

3.1. File로 ConfigMap 생성해서 Deployment에 전달

상위에서 생성한 testKeyValue.proerites 파일로

configMap을 생성한 후 

해당 configMap을 deployment에 전달하는 방법

 

[ ConfigMap 생성 명령어 ]

kubectl create configmap iksoon-configmap-test --from-file=./testKeyValue.proerites

참고) File 추가 시 --from-file 설정을 뒤에 추가하면 됨

  • 예) kubectl create configmap iksoon-configmap-test --from-file=./testKeyValue1.proerites --from-file=./testKeyValue2.proerites

[ ConfigMap 생성 결과 ]

아래의 내용을 보면

Key : 파일명

Value : 파일 내용

로 ConfigMap 이 생성되는 것을 확인할 수 있음

 

[ deployment.yaml 파일 예제 ]

apiVersion: apps/v1

kind: Deployment

metadata:

  name: iksoon-deployment

  labels:

    app: iksoon-tomcat

spec:

  replicas: 1

  selector:

    matchLabels:

      app: iksoon-pod

  template:

    metadata:

      labels:

        app: iksoon-pod

    spec:

      containers:

      - name: iksoon-tomcat

        image: peksoon/iksoon_tomcat:1.0.4

        ports:

        - containerPort: 8080

        envFrom:                           envFrom : 항목을 추가해서 configmap 설정을 적용함 

                                               #           configmap 설정 중 일부의 경우 env였는데 전체 적용은 envFrom을 사용

        - configMapRef:                 # configMapRef : 불러올 configMap을 명시함  

            name: iksoon-configmap-testname: 항목에 configMap 파일의 metadata:  name 이 들어가야 함

 

---

apiVersion: v1

kind: Service

metadata:

  name: iksoon-service

spec:

  ports:

  - port: 8080

    targetPort: 8080

  selector:

    app: iksoon-pod

 

[ 결과 ]

testKeyValue.properties 환경 변수를 확인할 수 있음

ConfigMap 이름이 iksoon-configmap-test에서

Key가 testKeyValue.properties(파일명)인 값을 가져와서

환경변수로 저장하는 것을 확인할 수 있음

 

[ 주의 ]

환경변수 testKeyValue.properties 에 파일내용이 모두 포함됨

파일 내용이 key-value 형태로 저장되어 있더라도

개행을 구분하여 key-value 형식으로 인식하는 것이 아니라

파일 전체 내용을 하나의 문자열로 처리하여

testKeyValue.properties 에 저장함.

 

[ 추가 기능 ]

envFrom.prefix가 포함되면 ConfigMap에서 모든 값을 가져오는 대신

prefix에 포함되는 값만 추려서 가져올 수 있음

 

 


 

 

4. ConfigMap Volume Object로 전달

ConfigMap 정보를 Volume Object 형식으로 Pod의 디스크 Volume으로 마운트 해서

Container에 파일 형대로 제공해 주는 것도 가능함

 

4.1. ConfigMap 설정 모두 전달

ConfigMap 전체 data 모두를 Volume으로 가져옴

 

[ ConfigMap.yaml 파일 예제 ]

apiVersion: v1

kind: ConfigMap

metadata:

  name: iksoon-configmap-test

data:

  K8S_VERSION: "kubernetes_version_test1"  # data 하위에 전달할 Key-Value를 명시

  K8S_CONFIGMAP: "Kubernetes_configMap_1"  # Key : K8S_CONFIGMAP_TEST, Value : Kubernetes_configMap_1

  K8S_TEST: "iksoon_TEST_1"                # Key :K8S_TEST, Value :iksoon_TEST_1

 

 

[ deployment.yaml 파일 예제 ]

apiVersion: apps/v1

kind: Deployment

metadata:

  name: iksoon-deployment

  labels:

    app: iksoon-tomcat

spec:

  replicas: 1

  selector:

    matchLabels:

      app: iksoon-pod

  template:

    metadata:

      labels:

        app: iksoon-pod

    spec:

      containers:

      - name: iksoon-tomcat

        image: peksoon/iksoon_tomcat:1.0.4

        ports:

        - containerPort: 8080

        volumeMounts:                              # pod에 mount 할 voloume을 설정함

        - name: iksoon-volume                    # name이 iksoon-volume인 volume을 mount 함.

          mountPath: /iksoon/ConfigMapTest # mount 할 경로 설정

      volumes:                                   # volume 설정

      - name: iksoon-volume               # volume name은 iksoon-volume으로 함

        configMap:                             # volume에 ConfigMap 내용을 적용함

          name: iksoon-configmap-test  # name: 항목에 configMap 파일의 metadata:name 이 들어가야 함

 

 

---

apiVersion: v1

kind: Service

metadata:

  name: iksoon-service

spec:

  ports:

  - port: 8080

    targetPort: 8080

  selector:

    app: iksoon-pod

 

[ 결과 ]

pod로 들어가서 확인.

volume이 mount 된 /iksoon/ConfigMapTest로 이동해보면

아래와 같이 파일을 확인할 수 있음

key : 파일이 되어있음

value : 파일의 내용이 되어있음

 

4.2. ConfigMap 설정 중 일부만 전달

ConfigMap 전체 data 중 선택한 일부만 Volume으로 가져옴

 

[ ConfigMap.yaml 파일 예제 ]

apiVersion: v1

kind: ConfigMap

metadata:

  name: iksoon-configmap-test

data:

  K8S_VERSION: "kubernetes_version_test1"       # data 하위에 전달할 Key-Value를 명시

  K8S_CONFIGMAP: "Kubernetes_configMap_1"  # Key : K8S_CONFIGMAP_TEST, Value : Kubernetes_configMap_1

  K8S_TEST: "iksoon_TEST_1"                          # Key :K8S_TEST, Value :iksoon_TEST_1

 

[ deployment.yaml 파일 예제 ]

apiVersion: apps/v1

kind: Deployment

metadata:

  name: iksoon-deployment

  labels:

    app: iksoon-tomcat

spec:

  replicas: 1

  selector:

    matchLabels:

      app: iksoon-pod

  template:

    metadata:

      labels:

        app: iksoon-pod

    spec:

      containers:

      - name: iksoon-tomcat

        image: peksoon/iksoon_tomcat:1.0.4

        ports:

        - containerPort: 8080

        volumeMounts:                        # pod에 mount 할 voloume을 설정함

        - name: iksoon-volume              # name이 iksoon-volume인 volume을 mount 함.

          mountPath: /iksoon/ConfigMapTest # mount 할 경로 설정

      volumes:                                  # volume 설정

      - name: iksoon-volume              # volume name은 iksoon-volume으로 함

        configMap:                            # volume에 ConfigMap 내용을 적용함

          name: iksoon-configmap-test       # name: 항목에 configMap 파일의 metadata:name 이 들어가야 함

            items:                                     # configMap의 data 항목 중에 가져올 key를 선정함 

            - key: K8S_VERSION                  # ConfigMap에 포함되어있는 Key

              path: Iksoon_K8S_VERSION      # Volume에 저장되는 파일 이름

            - key: K8S_CONFIGMAP             # ConfigMap에 포함되어있는 Key

              path: Iksoon_K8S_CONFIGMAP # Volume에 저장되는 파일 이름

 

---

apiVersion: v1

kind: Service

metadata:

  name: iksoon-service

spec:

  ports:

  - port: 8080

    targetPort: 8080

  selector:

    app: iksoon-pod

 

[ 결과 ]

pod로 들어가서 확인.

volume이 mount 된 /iksoon/ConfigMapTest로 이동해보면

아래와 같이 items에서 추가한 

Iksoon_K8S_CONFIGMAP, Iksoon_K8S_VERSION 2개의 파일만 확인할 수 있음

key : 파일이 되어있음

value : 파일의 내용이 되어있음

[ 추가 참고 옵션 ]

volumeMounts: 옵션

 

subPath 

Container에서 Volume을 Mount 하는 방식으로 접근할 때 발생하는 문제로

Mount 할 지점에 기존에 파일이 있을 경우가 있음

Mount가 되면 해당 Volume을 볼 수 있지만 그렇다면 기존 파일들은 어떻게 되는 것일까?

리눅스에서는 보통 파일이 사라지는 것이 아니라 

숨겨진 파일로 살아만 있음.

(즉, 숨겨지는 것뿐만 아니라 접근이 되지 않음.)

때문에 k8s에서는 Mount를 할 때 이를 회피할 수 있는 옵션인 subPath 옵션이 존재함

 

defaultMode: 6600

접근 권한과 관련하여 ConfigMap은 Volume을 생성할 때 Permission을 부여

기본적으로는 644 권한을 가지고 있지만

defaultMode를 통해 접근 권한이 있는 리소스(사용자, 그룹 등)만 접근할 수 있음.

 

 

 


 

 

 

[ 참고) web에서 접근해서 확인하기 위한 Test용도 ingress.yaml 예제 ]

apiVersion: extensions/v1beta1

kind: Ingress

metadata:

  name: iksoon-ingress-nginx

  namespace: default

  annotations:

    nginx.ingress.kubernetes.io/rewrite-target: /$2

spec:

  rules:

  - host: iksoon.test.com

    http:

      paths:

      - path: /app1(/|$)(.*)

        backend:

          serviceName: iksoon-service

          servicePort: 8080

 

 

 

 


제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!


 

 

 

참고

https://kubernetes.io/ko/docs/concepts/configuration/configmap/

https://kubernetes.io/docs/tasks/inject-data-application/podpreset/

https://arisu1000.tistory.com/27843

https://bcho.tistory.com/1267

https://timewizhan.tistory.com/entry/Kubernetes-ConfigMap

 

 

 

반응형

'클라우드 > Kubernetes' 카테고리의 다른 글

12. Kubernetes Update ( Deployment )  (2) 2020.08.23
11. Kubernetes Secret  (0) 2020.08.17
09. Kubernetes Volume 개념  (0) 2020.08.17
08. Kubernetes Network (Ingress)  (2) 2020.08.12
07. Kubernetes Network (LoadBalancer)  (3) 2020.08.09