[ConfigMap이란?]
Key-Value 형태로 기밀이 아닌 데이터를 저장하는 데 사용하는 API오브젝트.
앱을 배포하다보면 DEV, PROD와 같이 환경별로 다른 변수값을 사용하는 경우가 있다.
앱의 이미지는 같지만 이러한 변수값이 차이가 나는 경우 다른 컨테이너 설정을 통해 배포하는 것은 매우 비효율적일 수 있다.
이럴 때 ConfigMap을 사용해서 값을 넣어놓고, 환경별로 다른 설정정보를 읽어오도록 처리할 수 있다.
즉, 컨테이너에서 필요한 환경 설정 내용을 컨테이너와 분리해서 제공해주기 위한 기능.
[ConfigMap의 종류]
Literal
ConfigMap을 yml파일에 정의하거나 CLI를 통해 직접 생성하는 방법
kubectl create configmap [configmap 이름] --from-literal=[key]=[value]
ex) kubectl create configmap jaeshim-cm --from-literal=jaeshim=handsome
#확인
kubectl describe configmaps [jaeshim]
File
파일 형태로 생성해서 ConfigMap을 설정하는 방법
파일명: config.properties
myname=jaeshim
birthday=1900.10.01
city=seoul
kubectl create configmap file-cm --from-file=config.properties
파일명인 config.properties가 key가 되고 value는 파일내용 그 자체가 된다.
[ConfigMap 적용하기]
ConfigMap에서 정의한 값을 사용하는 방법은 여러가지가 있다.
환경변수로 값을 전달하기
Deployment에 env로 추가해서 정의해놓는다.
CLI로 생성한 ConfigMap을 사용하기
apiVersion: v1
kind: Deployment
metadata:
name: cm-pod
spec:
containers:
- name: container
image: example/test
envFrom:
- configMapRef:
name: jaeshim-cm
File로 생성한 ConfigMap 사용하기
apiVersion: v1
kind: Deployment
metadata:
name: pod1
spec:
containers:
- name: container
image: example/test
env:
- name: config-env
valueFrom:
configMapKeyRef:
name: file-cm
key: config.properties
ConfigMap을 디스크 볼륨 마운트 시키기
volumes에 configmap을 명시해주고, container에서 volueMounts를 정의해서 지정한 경로 (ex: mount)에 마운트 시킨다.
apiVersion: v1
kind: Pod
metadata:
name: pod2
spec:
containers:
- name: container
image: example/test
volumeMounts:
- name: volume1
mountPath: /mount
volumes:
- name: volume1
configMap:
name: file-cm
[예제: Apache Flink]
Apache Flink 클러스터를 kubernetes에 올려볼 수 있다. 이 때 사용한 ConfigMap과 Deployment에 볼륨마운트 형태로 사용하는 예시
가이드: Kubernetes | Apache Flink
ConfigMap
flink 관련 설정값과 log4j 설정값을 ConfigMap에 정의하고 있다.
flink-conf.yaml 파일과 log4j-console.properties 파일로 나뉠 수 있는 구조인듯 하다.
apiVersion: v1
kind: ConfigMap
metadata:
name: flink-config
labels:
app: flink
data:
flink-conf.yaml: |+
jobmanager.rpc.address: flink-jobmanager
taskmanager.numberOfTaskSlots: 2
blob.server.port: 6124
jobmanager.rpc.port: 6123
taskmanager.rpc.port: 6122
queryable-state.proxy.ports: 6125
jobmanager.memory.process.size: 1600m
taskmanager.memory.process.size: 1728m
parallelism.default: 2
log4j-console.properties: |+
# This affects logging for both user code and Flink
rootLogger.level = INFO
rootLogger.appenderRef.console.ref = ConsoleAppender
rootLogger.appenderRef.rolling.ref = RollingFileAppender
...생략
Deployment
volumes에 위에서 정의한 ConfigMap을 활용하고 있다.
이후 voluimeMounts에서 flink-config-volume을 /opt/flink/conf에 마운트 시켰다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: flink-jobmanager
spec:
replicas: 1
selector:
matchLabels:
app: flink
component: jobmanager
template:
metadata:
labels:
app: flink
component: jobmanager
spec:
containers:
- name: jobmanager
image: apache/flink:latest
args: ["jobmanager"]
ports:
- containerPort: 6123
name: rpc
- containerPort: 6124
name: blob-server
- containerPort: 8081
name: webui
livenessProbe:
tcpSocket:
port: 6123
initialDelaySeconds: 30
periodSeconds: 60
volumeMounts:
- name: flink-config-volume
mountPath: /opt/flink/conf
securityContext:
runAsUser: 9999 # refers to user _flink_ from official flink image, change if necessary
volumes:
- name: flink-config-volume
configMap:
name: flink-config
items:
- key: flink-conf.yaml
path: flink-conf.yaml
- key: log4j-console.properties
path: log4j-console.properties
[참조]
쿠버네티스 #11 - ConfigMap (tistory.com)
[Kubernetes] ConfigMap (tistory.com)
쿠버네티스 컨피그맵(kubernetes configmap) :: 아리수 (tistory.com)
'Kubernetes' 카테고리의 다른 글
Istio (0) | 2023.01.31 |
---|---|
Service Mesh (0) | 2023.01.31 |
Service란? (0) | 2022.12.06 |
Kubernetes Ingress? (0) | 2022.11.02 |