[Kubernetes] ConfigMap

Hailey·2020년 10월 8일
1

Kubernetes

목록 보기
2/6

ConfigMap 은 설정, 환경 변수들을 담는 객체이다.
애플리케이션을 배포하다 보면, 환경에 따라서 다른 설정값을 사용하는 경우가 있는데 이러한 환경 변수나 설정값들을 변수로 관리해서 Pod가 생성될때 이 값을 넣어줄 수 있다. 이러한 기능을 제공하는 것이 바로 Configmap과 Secret이다.

컨피그맵은 키-밸류 형식으로 Secret이 아닌 데이터를 저장하는 데 사용하는 API 오브젝트이다. configmap을 생성하는 방법은 literal (문자)로 생성하는 방법과 파일로 생성하는 방법 두가지가 있다.

1. Literal

먼저 간단하게 문자로 생성하는 방법이다. 키가 “name”이고 그 값이 “eunji”인 configMap을 생성하려면
Kubectl create configmap [configmap 이름] --from-literal=[키]=[값]
식으로 생성하면 된다. 또는 아래와 같이 YAML파일로도 configMap을 생성할 수 있다.

hello-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: hello-cm
data:
  name: eunji

데이타 항목에 [키]:[값] 형식으로 라인을 추가하면 여러개의 값을 하나의 configMap에 저장할 수 있다.

이제 정의해놓은 값을 Pod로 넘기는 방법은 크게 두가지가 있다.

  • 정의해놓은 값을 Pod의 환경 변수 (Environment variable)로 넘기는 방법
  • 정의해놓은 값을 Pod의 디스크 볼륨으로 마운트 하는 방법

configmap이 생성되었으면 이 값을 Pod에서 환경 변수로 불러서 사용할 것이다. node.js로 간단한 웹 애플리케이션을 만든후에 “NAME”라는 환경 변수의 값을 읽어서 출력하도록 한다. 그리고 이 파일을 컨테이너로 패키징한 후에, Deployment를 정의한다. configMap에서 데이타를 읽는 부분은 맨 아래에 env 부분인데, env 부분에 환경 변수를 정의한다. name은 NAME이라는 이름으로 정의하고 데이타는 valueFrom을 이용해서 configMap에서 읽어오도록 한다. 그리고 이 스크립트를 이용하여 Deployment를 생성한 후에, 이 Deployment 앞에 Service (Load balancer)를 붙여 보자. 해당 Service의 URL에서 eunji 라는 문자열이 불러와 출력된 것을 알 수 있다.

2. File

위와 같이 개개별 값을 공유할 수 도 있지만, 설정을 파일 형태로 해서 Pod에 공유하는 방법도 있다.
profile.properties라는 파일이 있고 파일 내용이 아래와 같다고 하자.

myname=eunji
email=myemail@mycompany.com
address=seoul

파일을 이용해서 ConfigMap을 만들때는 아래와 같이 --from-file 을 이용해서 파일명을 넘겨주면 된다.

kubectl create configmap cm-file --from-file=./properties/profile.properties

이렇게 파일을 이용해서 configMap을 생성하면, 키는 파일명(profile.properties)이 되고, 값은 파일 내용(myname=eunji
email=myemail@mycompany.com
address=seoul)이 된다. configMap의 정보를 pod로 전달하는 방법은 앞에 처럼 환경 변수를 사용하는 방법도 있지만, Pod의 디스크 볼륨으로 마운트 시키는 방법도 있다. 앞의 cm-file configMap을 /tmp/config/에 마운트 해보도록 하자.
아래와 같이 Deployment 스크립트를 작성한다.

apiVersion: apps/v1beta2
kind: Deployment
metadata:
  name: cm-file-deployment-vol
spec:
  replicas: 3
  minReadySeconds: 5
  selector:
    matchLabels:
      app: cm-file-vol
  template:
    metadata:
      name: cm-file-vol-pod
      labels:
        app: cm-file-vol
    spec:
      containers:
      - name: cm-file-vol
        image: gcr.io/terrycho-sandbox/cm-file-volume:v1
        imagePullPolicy: Always
        ports:
        - containerPort: 8080
        volumeMounts:
          - name: config-profile
            mountPath: /tmp/config
      volumes:
        - name: config-profile
          configMap:
            name: cm-file

configMap을 디스크 볼륨으로 마운트해서 사용하는 방법은 volumes 을 configMap으로 정의하면 된다. 위의 예제에서 처럼 volume을 정의할때, configMap으로 정의하고 configMap의 이름을 cm-file로 정의하여, cm-file configMap을 선택하였다. 이 볼륨을 volumeMounts를 이용해서 /tmp/config에 마운트 되도록 한다.
이때 중요한점은 마운트 포인트에 마운트 될때, configMap내의 키가 파일명이 된다. 다음 테스트를 위해서 server.js 애플리케이션에 /tmp/config/profile.properties 파일을 읽어서 출력하도록 코드를 작성한다. 이 server.js를 도커로 패키징해서 배포한후, service를 붙여서 테스트한다.

출처

쿠버네티스 부분 공부하기 정말 좋은 블로그 https://bcho.tistory.com/1267 ****

profile
Cloud Solution Architect - Customer Success in security💗🌎

0개의 댓글