Kubernetes ConfigMap
참고) 실습환경
[Master Node server]
OS = CentOS 7
리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64
docker version : 1.13.1
docker api verison : 1.26
[Worker Node server]
OS = CentOS 7
리눅스 커널 버전 : Linux 3.10.0-1062.el7.x86_64
docker version : 1.13.1
docker api verison : 1.26
[Kubernetes version]
1.18
1. Kubernetes ConfigMap Object란?
ConfigMap 은 Key-Value 형태의 설정값을 가지고 기밀이 아닌 데이터를 저장하는 데 사용하는 kubernetes Object.
즉 설정 정보를 저장해놓는 일종의 저장소 역할.
Application(개발한 프로그램)을 배포하다 보면, 환경에 따라서 다른 설정값을 사용하는 경우가 있음.
예를 들어, DB의 IP, API를 호출하기 위한 API KEY, 개발/운영에 따른 디버그 모드, 환경 설정 파일들이 있는데,
Container image는 같지만, 이런 환경 변수가 차이가 나는 경우
매번 다른 Container image를 만드는 것은 관리상 불편할 수 밖에 없음
이렇게 다른 설정을 가지고 실행을 해야할때 사용하는 것이 바로 ConfigMap Object.
ConfigMap은 환경 변수나 설정값들을 변수로 관리해서 Pod가 생성될 때 이 값을 넣어줄 수 있으니
Container와 분리해서 하나의 동일한 컨테이너를 가지고
개발용, 스테이지용, 운영용으로 모두 사용하는 것이 가능해짐.
ConfigMap Object 특징 1.
- ConfigMap 은 간단한 문자부터 큰 설정의 파일까지 Value 값으로 가질 수 있음
ConfigMap Object 특징 2.
- Pod는 ConfigMap과 서로 독립적인 리소스이기 때문에
- Pod에서 ConfigMap을 사용하는 방식은
- 내부의 다양한 옵션(환경변수, Volume Object)을 사용해서 ConfigMap에 접근할 수 있음.
ConfigMap Object 특징 3.
- 동일한 Pod라도 여러개의 ConifgMap을 사용할 수 있음
ConfigMap Object 특징 4.
- Container의 Application에서 사용하는 설정 값을 분리하여
- 소스코드상에서 직접 사용하던 설정 값들을 유지하는 역할을 수행함
2. ConfigMap 환경변수로 전달
2.1. ConfigMap 설정 중 일부만 전달
ConfigMap 전체 data 중 선택한 일부만 가져와서 적용
[ ConfigMap.yaml 파일 예제 ]
apiVersion: v1 kind: ConfigMap metadata: name: iksoon-configmap-test data: K8S_VERSION_TEST: "kubernetes_version_test1" # data 하위에 전달할 Key-Value를 명시 K8S_CONFIGMAP_TEST: "Kubernetes_configMap_1" # Key : K8S_CONFIGMAP_TEST, Value : Kubernetes_configMap_1 K8S_TEST: "iksoon_TEST_1" # Key :K8S_TEST, Value :iksoon_TEST_1 |
[ deployment.yaml 파일 예제 ]
apiVersion: apps/v1 kind: Deployment metadata: name: iksoon-deployment labels: app: iksoon-tomcat spec: replicas: 1 selector: matchLabels: app: iksoon-pod template: metadata: labels: app: iksoon-pod spec: containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.4 ports: - containerPort: 8080 env: # env : 항목을 추가 해서 configmap 설정을 적용함 - name: VERSION_TEST # - name : 해당 Pod 에 적용될 환경변수 이름 # (만들어진 Pod의 환경변수 조회 시 해당 이름이 있음) valueFrom: # valueFrom : name에서 명시한 환경변수에 올 값을 설정함 configMapKeyRef: # configMapKeyRef : 불러올 configMap과 key를 명시함 name: iksoon-configmap-test # name: 항목에 configMap 파일의 metadata: name 이 들어가야함 key: K8S_VERSION_TEST # key : 항목에 configMap에 설정되어있는 data의 key 이름이 들어가야 함 - name: K8S_CONFIGMAP # - name을 추가해서 다수의 환경변수를 설정할 수 있음 valueFrom: configMapKeyRef: name: iksoon-configmap-test key: K8S_CONFIGMAP_TEST - name: TEST_IKSOON valueFrom: configMapKeyRef: name: iksoon-configmap-test key: K8S_TEST --- apiVersion: v1 kind: Service metadata: name: iksoon-service spec: ports: - port: 8080 targetPort: 8080 selector: app: iksoon-pod |
[ 결과]
VERSION_TEST, K8S_CONFIGMAP 환경 변수 값에 configMap에서 설정한 값이 들어갔음을 확인 가능
page 접속해서 확인하는 방법 이외에 pod의 container에 접속해서 env 명령으로도 확인 가능
2.2. ConfigMap 설정 모두 전달
ConfigMap 전체 data를 한꺼번에 가져와서 사용하는 방법
[ ConfigMap.yaml 파일 예제 ]
apiVersion: v1 kind: ConfigMap metadata: name: iksoon-configmap-test data: K8S_VERSION: "kubernetes_version_test1" # data 하위에 전달할 Key-Value를 명시 K8S_CONFIGMAP: "Kubernetes_configMap_1" # Key : K8S_CONFIGMAP_TEST, Value : Kubernetes_configMap_1 K8S_TEST: "iksoon_TEST_1" # Key :K8S_TEST, Value :iksoon_TEST_1 |
[ deployment.yaml 파일 예제 ]
apiVersion: apps/v1 kind: Deployment metadata: name: iksoon-deployment labels: app: iksoon-tomcat spec: replicas: 1 selector: matchLabels: app: iksoon-pod template: metadata: labels: app: iksoon-pod spec: containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.4 ports: - containerPort: 8080 envFrom: # envFrom : 항목을 추가해서 configmap 설정을 적용함 # configmap 설정 중 일부의 경우 env였는데 전체 적용은 envFrom을 사용 - configMapRef: # configMapRef : 불러올 configMap을 명시함 name: iksoon-configmap-test # name: 항목에 configMap 파일의 metadata: name 이 들어가야 함 --- apiVersion: v1 kind: Service metadata: name: iksoon-service spec: ports: - port: 8080 targetPort: 8080 selector: app: iksoon-pod |
[ 결과 ]
VERSION_TEST, K8S_CONFIGMAP 환경 변수 값에 configMap에서 설정한 값이 들어갔음을 확인 가능
page 접속해서 확인하는 방법 이외에 pod의 container에 접속해서 env 명령으로도 확인 가능
3. ConfigMap File 형태로 전달
File의 내용을 환경변수 형태로 Deployment에 전달하는 방법.
[ testKeyValue.proerites 파일 예제 ]
K8S_VERSION: "kubernetes_version_test1" K8S_CONFIGMAP: "Kubernetes_configMap_1" K8S_TEST: "iksoon_TEST_1" |
3.1. File로 ConfigMap 생성해서 Deployment에 전달
상위에서 생성한 testKeyValue.proerites 파일로
configMap을 생성한 후
해당 configMap을 deployment에 전달하는 방법
[ ConfigMap 생성 명령어 ]
kubectl create configmap iksoon-configmap-test --from-file=./testKeyValue.proerites
참고) File 추가 시 --from-file 설정을 뒤에 추가하면 됨
- 예) kubectl create configmap iksoon-configmap-test --from-file=./testKeyValue1.proerites --from-file=./testKeyValue2.proerites
[ ConfigMap 생성 결과 ]
아래의 내용을 보면
Key : 파일명
Value : 파일 내용
로 ConfigMap 이 생성되는 것을 확인할 수 있음
[ deployment.yaml 파일 예제 ]
apiVersion: apps/v1 kind: Deployment metadata: name: iksoon-deployment labels: app: iksoon-tomcat spec: replicas: 1 selector: matchLabels: app: iksoon-pod template: metadata: labels: app: iksoon-pod spec: containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.4 ports: - containerPort: 8080 envFrom: # envFrom : 항목을 추가해서 configmap 설정을 적용함 # configmap 설정 중 일부의 경우 env였는데 전체 적용은 envFrom을 사용 - configMapRef: # configMapRef : 불러올 configMap을 명시함 name: iksoon-configmap-test # name: 항목에 configMap 파일의 metadata: name 이 들어가야 함 --- apiVersion: v1 kind: Service metadata: name: iksoon-service spec: ports: - port: 8080 targetPort: 8080 selector: app: iksoon-pod |
[ 결과 ]
testKeyValue.properties 환경 변수를 확인할 수 있음
ConfigMap 이름이 iksoon-configmap-test에서
Key가 testKeyValue.properties(파일명)인 값을 가져와서
환경변수로 저장하는 것을 확인할 수 있음
[ 주의 ]
환경변수 testKeyValue.properties 에 파일내용이 모두 포함됨
파일 내용이 key-value 형태로 저장되어 있더라도
개행을 구분하여 key-value 형식으로 인식하는 것이 아니라
파일 전체 내용을 하나의 문자열로 처리하여
testKeyValue.properties 에 저장함.
[ 추가 기능 ]
envFrom.prefix가 포함되면 ConfigMap에서 모든 값을 가져오는 대신
prefix에 포함되는 값만 추려서 가져올 수 있음
4. ConfigMap Volume Object로 전달
ConfigMap 정보를 Volume Object 형식으로 Pod의 디스크 Volume으로 마운트 해서
Container에 파일 형대로 제공해 주는 것도 가능함
4.1. ConfigMap 설정 모두 전달
ConfigMap 전체 data 모두를 Volume으로 가져옴
[ ConfigMap.yaml 파일 예제 ]
apiVersion: v1 kind: ConfigMap metadata: name: iksoon-configmap-test data: K8S_VERSION: "kubernetes_version_test1" # data 하위에 전달할 Key-Value를 명시 K8S_CONFIGMAP: "Kubernetes_configMap_1" # Key : K8S_CONFIGMAP_TEST, Value : Kubernetes_configMap_1 K8S_TEST: "iksoon_TEST_1" # Key :K8S_TEST, Value :iksoon_TEST_1 |
[ deployment.yaml 파일 예제 ]
apiVersion: apps/v1 kind: Deployment metadata: name: iksoon-deployment labels: app: iksoon-tomcat spec: replicas: 1 selector: matchLabels: app: iksoon-pod template: metadata: labels: app: iksoon-pod spec: containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.4 ports: - containerPort: 8080 volumeMounts: # pod에 mount 할 voloume을 설정함 - name: iksoon-volume # name이 iksoon-volume인 volume을 mount 함. mountPath: /iksoon/ConfigMapTest # mount 할 경로 설정 volumes: # volume 설정 - name: iksoon-volume # volume name은 iksoon-volume으로 함 configMap: # volume에 ConfigMap 내용을 적용함 name: iksoon-configmap-test # name: 항목에 configMap 파일의 metadata:name 이 들어가야 함 --- apiVersion: v1 kind: Service metadata: name: iksoon-service spec: ports: - port: 8080 targetPort: 8080 selector: app: iksoon-pod |
[ 결과 ]
pod로 들어가서 확인.
volume이 mount 된 /iksoon/ConfigMapTest로 이동해보면
아래와 같이 파일을 확인할 수 있음
key : 파일이 되어있음
value : 파일의 내용이 되어있음
4.2. ConfigMap 설정 중 일부만 전달
ConfigMap 전체 data 중 선택한 일부만 Volume으로 가져옴
[ ConfigMap.yaml 파일 예제 ]
apiVersion: v1 kind: ConfigMap metadata: name: iksoon-configmap-test data: K8S_VERSION: "kubernetes_version_test1" # data 하위에 전달할 Key-Value를 명시 K8S_CONFIGMAP: "Kubernetes_configMap_1" # Key : K8S_CONFIGMAP_TEST, Value : Kubernetes_configMap_1 K8S_TEST: "iksoon_TEST_1" # Key :K8S_TEST, Value :iksoon_TEST_1 |
[ deployment.yaml 파일 예제 ]
apiVersion: apps/v1 kind: Deployment metadata: name: iksoon-deployment labels: app: iksoon-tomcat spec: replicas: 1 selector: matchLabels: app: iksoon-pod template: metadata: labels: app: iksoon-pod spec: containers: - name: iksoon-tomcat image: peksoon/iksoon_tomcat:1.0.4 ports: - containerPort: 8080 volumeMounts: # pod에 mount 할 voloume을 설정함 - name: iksoon-volume # name이 iksoon-volume인 volume을 mount 함. mountPath: /iksoon/ConfigMapTest # mount 할 경로 설정 volumes: # volume 설정 - name: iksoon-volume # volume name은 iksoon-volume으로 함 configMap: # volume에 ConfigMap 내용을 적용함 name: iksoon-configmap-test # name: 항목에 configMap 파일의 metadata:name 이 들어가야 함 items: # configMap의 data 항목 중에 가져올 key를 선정함 - key: K8S_VERSION # ConfigMap에 포함되어있는 Key path: Iksoon_K8S_VERSION # Volume에 저장되는 파일 이름 - key: K8S_CONFIGMAP # ConfigMap에 포함되어있는 Key path: Iksoon_K8S_CONFIGMAP # Volume에 저장되는 파일 이름 --- apiVersion: v1 kind: Service metadata: name: iksoon-service spec: ports: - port: 8080 targetPort: 8080 selector: app: iksoon-pod |
[ 결과 ]
pod로 들어가서 확인.
volume이 mount 된 /iksoon/ConfigMapTest로 이동해보면
아래와 같이 items에서 추가한
Iksoon_K8S_CONFIGMAP, Iksoon_K8S_VERSION 2개의 파일만 확인할 수 있음
key : 파일이 되어있음
value : 파일의 내용이 되어있음
[ 추가 참고 옵션 ]
volumeMounts: 옵션
subPath
Container에서 Volume을 Mount 하는 방식으로 접근할 때 발생하는 문제로
Mount 할 지점에 기존에 파일이 있을 경우가 있음
Mount가 되면 해당 Volume을 볼 수 있지만 그렇다면 기존 파일들은 어떻게 되는 것일까?
리눅스에서는 보통 파일이 사라지는 것이 아니라
숨겨진 파일로 살아만 있음.
(즉, 숨겨지는 것뿐만 아니라 접근이 되지 않음.)
때문에 k8s에서는 Mount를 할 때 이를 회피할 수 있는 옵션인 subPath 옵션이 존재함
defaultMode: 6600
접근 권한과 관련하여 ConfigMap은 Volume을 생성할 때 Permission을 부여
기본적으로는 644 권한을 가지고 있지만
defaultMode를 통해 접근 권한이 있는 리소스(사용자, 그룹 등)만 접근할 수 있음.
[ 참고) web에서 접근해서 확인하기 위한 Test용도 ingress.yaml 예제 ]
apiVersion: extensions/v1beta1 kind: Ingress metadata: name: iksoon-ingress-nginx namespace: default annotations: nginx.ingress.kubernetes.io/rewrite-target: /$2 spec: rules: - host: iksoon.test.com http: paths: - path: /app1(/|$)(.*) backend: serviceName: iksoon-service servicePort: 8080 |
제 글을 복사할 시 출처를 명시해주세요.
글에 오타, 오류가 있다면 댓글로 알려주세요! 바로 수정하겠습니다!
참고
https://kubernetes.io/ko/docs/concepts/configuration/configmap/
https://kubernetes.io/docs/tasks/inject-data-application/podpreset/
https://arisu1000.tistory.com/27843
https://timewizhan.tistory.com/entry/Kubernetes-ConfigMap
'Kubernetes > Kubernetes 이론' 카테고리의 다른 글
Kubernetes Update (2) | 2020.08.23 |
---|---|
Kubernetes Secret (0) | 2020.08.17 |
Kubernetes Pod 더 자세히 알아보기 (2) | 2020.08.07 |
Kubernetes 설치 과정 (0) | 2020.08.07 |
Kubernetes Addon (0) | 2020.08.05 |