ConfigMap 은 설정, 환경 변수들을 담는 객체이다.
애플리케이션을 배포하다 보면, 환경에 따라서 다른 설정값을 사용하는 경우가 있는데 이러한 환경 변수나 설정값들을 변수로 관리해서 Pod가 생성될때 이 값을 넣어줄 수 있다. 이러한 기능을 제공하는 것이 바로 Configmap과 Secret이다.
컨피그맵은 키-밸류 형식으로 Secret이 아닌 데이터를 저장하는 데 사용하는 API 오브젝트이다. configmap을 생성하는 방법은 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로 넘기는 방법은 크게 두가지가 있다.
configmap이 생성되었으면 이 값을 Pod에서 환경 변수로 불러서 사용할 것이다. node.js로 간단한 웹 애플리케이션을 만든후에 “NAME”라는 환경 변수의 값을 읽어서 출력하도록 한다. 그리고 이 파일을 컨테이너로 패키징한 후에, Deployment를 정의한다. configMap에서 데이타를 읽는 부분은 맨 아래에 env 부분인데, env 부분에 환경 변수를 정의한다. name은 NAME이라는 이름으로 정의하고 데이타는 valueFrom을 이용해서 configMap에서 읽어오도록 한다. 그리고 이 스크립트를 이용하여 Deployment를 생성한 후에, 이 Deployment 앞에 Service (Load balancer)를 붙여 보자. 해당 Service의 URL에서 eunji 라는 문자열이 불러와 출력된 것을 알 수 있다.
위와 같이 개개별 값을 공유할 수 도 있지만, 설정을 파일 형태로 해서 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 ****