클라우드/Kubernetes

쿠버네티스 configMap

Cloud_Park 2020. 1. 16. 17:45

configMap

배포하다 보면  환경에 따라서 설정값을 사용하는 경우가 있다. 예를 들어,  데이터베이스의 IP  API를 호출하기 위한 API KEY, 운영 개발에 따른 디버그 모든 , 환경 설정 파일들이 있는데, 애플리케이션 이미지는 같이ㅈ만, 이런 환경변수가

차이나는 경우 매번 다른 컨테이너 이미지를 만들어야하는 불편함을 초래한다.

이러한 것을 극복하기 위해  환경변수나 설정값들을 변수로 관리하여 pod가 생성될때 이 값을 넣어 줄수 있는데,  이러한 기능을 제공하는 것이 바로 configMap,Secret이다.

pod를  배포할때마다  다른 설명 정보를 반영하도록 할 수 있다.

 

https://bcho.tistory.com/1267?category=731548

pod로 넘기는 방법

1. 정의해 놓은 pod값의 환경변수로 넘기는 방법

2. 정의해 놓은  값을 pod의 디스크 볼륨으로 마운트하는 방법

configMap

설정정보를  저장해놓는 일종의 키/벨류 형식 저장소 역할을 한다.

생성방법은 1. literal로 생성하는 방법과 2. 파일로 생성하는 방법 두가지가 있다.

1. literal

language(key),java(value)인 configMap을 만들면

$ kubectl create configmap [configmap_name] --from-literal=[키]=[value]

$ kubectl create configmap hello-cm --from-literal=language=java

또는   yaml파일로 생성할 수 있다.

hello-cm.yaml
apiVersion: v1
kind: ConfigMap
metadata:
 name: hello-cm
data:
 language: java
$kubectl create -f hello-cm.yaml

설정한  ConfigMap을 pod에 적용시켜보기

 

var os = require('os');


var http = require('http');

var handleRequest = function(request, response) {

 response.writeHead(200);

 response.end(" my prefered language is "+process.env.LANGUAGE+ "\n");


 //log

 console.log("["+

Date(Date.now()).toLocaleString()+

"] "+os.hostname());

}

var www = http.createServer(handleRequest);

www.listen(8080);

컨테이너로 패징후 deployment 정의한다.

apiVersion: apps/v1beta2

kind: Deployment

metadata:

 name: cm-deployment

spec:

 replicas: 3

 minReadySeconds: 5

 selector:

   matchLabels:

     app: cm-literal

 template:

   metadata:

     name: cm-literal-pod

     labels:

       app: cm-literal

   spec:

     containers:

     - name: cm

       image: gcr.io/terrycho-sandbox/cm:v1

       imagePullPolicy: Always

       ports:

       - containerPort: 8080

       env:

       - name: LANGUAGE

         valueFrom:

           configMapKeyRef:

              name: hello-cm

              key: language

가장아래 env부분에 환경변수를 지정해준다. env: //환경변수 정의

       - name: LANGUAGE  //이름

         valueFrom:  //메타데이터는  valueFrom을 이용해서 configmap을 지정해준다.

           configMapKeyRef: 

              name: hello-cm 

              key: language    //comfigmap에 저장된 java를 불러드린다.

 

이후 서비스를 연결

apiVersion: v1

kind: Service

metadata:

 name: cm-literal-svc

spec:

 selector:

   app: cm-literal

 ports:

   - name: http

     port: 80

     protocol: TCP

     targetPort: 8080

 type: LoadBalancer

ip에 접속하면   language 키값에 대한 java가 출력하게 된다.

 

file로 등록하기

개개별 값을 공유할 수 있지만, 설정은 파일 형태로 해서 pod에 공유하는 방법

ex)

profile.properties

 

myname=bbs

email=myemail@base.com

address=SN

라고 만들었다면

$kubectl create configmap cm-file --file=./properties/profile.properties   //파일로 configmap 만들기

환경변수로 지정하기

 

apiVersion: apps/v1beta2

kind: Deployment

metadata:

 name: cm-file-deployment

spec:

 replicas: 3

 minReadySeconds: 5

 selector:

   matchLabels:

     app: cm-file

 template:

   metadata:

     name: cm-file-pod

     labels:

       app: cm-file

   spec:

     containers:

     - name: cm-file

       image: gcr.io/terrycho-sandbox/cm-file:v1

       imagePullPolicy: Always

       ports:

       - containerPort: 8080

       env:

       - name: PROFILE

         valueFrom:

           configMapKeyRef:

              name: cm-file

              key: profile.properties


 

literal과  조금 다르다. env:

       - name: PROFILE 

         valueFrom:

           configMapKeyRef:

              name: cm-file

              key: profile.properties  //파일명

키와 벨류로 인식하지 않고  하나의 문자열로 처리한다.

 

 

 

 

디스크 볼륨으로 마운트하기

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내의 키가 파일명이다.

 

 

 

테스트를 위해 어플리케이션에서 /tmp/config/profile.properties파일을 읽어 출력하도록 한다.

 

 

var os = require('os');

var fs = require('fs');


var http = require('http');

var handleRequest = function(request, response) {

 fs.readFile('/tmp/config/profile.properties',function(err,data){

   response.writeHead(200);

   response.end("Read configMap from file  "+data+" \n");

 });


 //log

 console.log("["+

Date(Date.now()).toLocaleString()+

"] "+os.hostname());

}

var www = http.createServer(handleRequest);

server.js를 도커로 패키징해서 배포후, service를 붙혀 테스트를 해보면

 

 

 

 

$kubectl get pod // pod 확인

$kubectl exec -it  [pod_name] -- /bin/bash   //pod 접속

$ls /tmp/config    //파일을 확인해보면  profile.properties 파일이 존재한다/

 

 

 

모든 자료는 

갓 조대협님의 글을 통해 만들었습니다. 자세한 실습은 개인적으로 해서 업로드할 예정입니다.

출처 : https://bcho.tistory.com/1267?category=731548