쿠버네티스 configMap
configMap
배포하다 보면 환경에 따라서 설정값을 사용하는 경우가 있다. 예를 들어, 데이터베이스의 IP API를 호출하기 위한 API KEY, 운영 개발에 따른 디버그 모든 , 환경 설정 파일들이 있는데, 애플리케이션 이미지는 같이ㅈ만, 이런 환경변수가
차이나는 경우 매번 다른 컨테이너 이미지를 만들어야하는 불편함을 초래한다.
이러한 것을 극복하기 위해 환경변수나 설정값들을 변수로 관리하여 pod가 생성될때 이 값을 넣어 줄수 있는데, 이러한 기능을 제공하는 것이 바로 configMap,Secret이다.
pod를 배포할때마다 다른 설명 정보를 반영하도록 할 수 있다.
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
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