컨피그맵(configmap)은 일반적인 설정값을 담아 저장할 수 있는 오브젝트다.
네임스페이스에 속하기 때문에 네임스페이스 별로 컨피그맵이 존재한다.
Configmap 생성하는 방법
kubectl create configmap <컨피그맵 이름> -—from-literal key=value
kubectl create configmap <컨피그맵 이름> -—from-file key=<파일경로> 또는 <파일경로>
kubectl create configmap <컨피그맵 이름> -—from-env-file <env 파일경로>
kubectl create configmap <컨피그맵 이름> -—from-literal key=value —dry-run -o yaml
컨피그맵을 파드에서 사용하는 방법
- 컨피그맵 값을 컨테이너 환경변수로 사용
- 컨피그맵 값을 파드 내부 파일로 마운트해서 사용
1. —from-literal
컨피그맵은 kubectl 으로 생성할 수 있다.
—-from-literal
옵션으로 설정값을 여러 개 정의할 수 있다.$ kubectl create configmap basic-configmap \ --from-literal ENV=dev \ --from-literal LOG_LEVEL=DEBUG
$ ku get cm NAME DATA AGE basic-configmap 2 3s kube-root-ca.crt 1 35s
생성한 컨피그맵은 YAML 형식으로 조회할 수 있다.
$ ku get cm basic-configmap -o yaml apiVersion: v1 data: ENV: dev LOG_LEVEL: DEBUG kind: ConfigMap metadata: creationTimestamp: "2022-04-04T11:57:15Z" name: basic-configmap namespace: default resourceVersion: "4059654" uid: 855d8b36-5490-4086-b711-b162e00c0f45
컨피그맵 값을 컨테이너 환경변수로 사용하기
컨피그맵에 저장된 key-value 가 컨테이너의 환경변수 key-value 로 그대로 사용되기 때문에 컨테이너 쉘에서
$ echo LOG_LEVEL
으로 확인 가능하다. 애플리케이션이 시스템 환경변수에서 설정값을 가져오면 이 방법을 사용하면 된다.1-a. envFrom
apiVersion: v1 kind: Pod metadata: name: env-from-sysvar spec: containers: - name: my-container image: busybox args: ['tail', '-f', '/dev/null'] envFrom: - configMapRef: name: basic-configmap # LOG_LEVEL=DEBUG, ENV=dev - configMapRef: name: special-configmap # container=docker
basic-configmap
, special-configmap
두 개의 컨피그맵으로부터 key-value 를 가져와 환경변수를 생성하도록 했다.envFrom
은 하나의 컨피그맵에 다수의 key-value 가 존재하더라도 모두 환경변수로 가져오도록 한다. 따라서 위에서 env-from-sysvar
파드는 LOG_LEVEL
, ENV
, container
3개 환경변수에 접근할 수 있다.$ kubectl exec [POD] —- env
명령어로 파드 컨테이너의 환경변수를 조회해본다.KUBERNETES_
으로 시작하는 환경변수들도 있는데, 이는 쿠버네티스가 자동으로 디폴트 네임스페이스에 존재하는 kubernetes
라는 서비스에 대한 접근 정보를 컨테이너 환경변수로 설정했기 때문이다. 1-b. valueFrom
apiVersion: v1 kind: Pod metadata: name: value-from-sysvar spec: containers: - name: my-container image: busybox args: ['tail', '-f', '/dev/null'] env: - name: ENV_KEYNAME_1 # 가져온 값으로 설정될 컨테이너 내 환경변수 이름 valueFrom: configMapKeyRef: name: basic-configmap # 참조할 컨피그맵 이름 key: LOG_LEVEL # 가져올 값의 키 - name: ENV_KEYNAME_2 valueFrom: configMapKeyRef: name: special-configmap key: container
valueFrom
을 사용하면 컨피그맵 내에 특정 key-value 를 선택해서 파드에서 사용할 키 이름을 바꿀 수 있다.basic-configmap
에 있는 LOG_LEVEL=DEBUG
키/값의 값이 컨테이너에서는 ENV_KEYNAME_1
이라는 키의 환경변수로 들어갔고, spcial-configmap
에 있는 container=docker
키/값의 값이 ENV_KEYNAME_2
라는 키의 환경변수로 들어갔다.2. —from-file
컨피그맵 값을 파드 내부 파일로 마운트해서 사용하기
컨피그맵의 키/값을 컨테이너 내에 특정 위치에 파일로 마운트한다.
apiVersion: v1 kind: Pod metadata: name: env-from-volume spec: volumes: - name: v-cm-basic # 컨피그맵 볼륨 configMap: name: basic-configmap # 키/값을 가져올 컨피그맵 이름 containers: - name: my-container image: busybox args: ['tail', '-f', '/dev/null'] volumeMounts: - name: v-cm-basic # volumes 에서 정의한 컨피그맵 볼륨 이름 mountPath: /etc/config # 마운트 된 컨피그맵 경로
containers[].volumeMounts[].mountPath
위치에 각 키/값이 키 이름으로 된 파일로 마운트 된 것을 확인할 수 있다.위 방법으로
nginx.conf
, mysql.cnf
과 같은 파일을 통째로 컨피그맵에 저장한 뒤 볼륨 파드 내부에 제공할 수 있다. --from-file
옵션을 사용하면 컨피그맵 값을 파일로 생성할 수 있다. 키 이름은 디폴트로 파일 이름으로 만들어진다.$ ku create configmap index-file --from-file index.html
키 이름을 직접 지정하고 싶으면 아래와 같이 한다. (
custom-key
라는 키로 컨피그맵 생성)$ ku create configmap index-file --from-file custom-key=index.html
nginx.conf.template 파일을 컨피그맵으로 만들어서 nginx 파드에 마운트하기
nginx.conf.template
파일을 아래와 같이 만들었다.ubuntu@ip-10-220-12-225:~/k8s-practice$ cat nginx.conf.template user nginx; worker_processes auto; pid /var/run/nginx.pid; events { worker_connections 1024; multi_accept on; } http { log_format main '$remote_addr - $remote_user [$time_local] $status ' '"$request" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; error_log /var/log/nginx/error.log warn; access_log /var/log/nginx/access.log main; server { listen 80 default_server; location / { proxy_pass http://${APP_ADDRESS}; } } }
템플릿 파일로
nginx-configmap
이라는 이름의 컨피그맵을 생성한다. (키 이름을 따로 지정하지 않았으므로 파일이름이 키 이름이 된다.)ubuntu@ip-10-220-12-225:~/k8s-practice$ ku create configmap nginx-configmap --from-file nginx.conf.template configmap/nginx-configmap created
ubuntu@ip-10-220-12-225:~/k8s-practice$ ku describe cm nginx-configmap Name: nginx-configmap Namespace: default Labels: <none> Annotations: <none> Data ==== nginx.conf.template: ---- user nginx; worker_processes auto; pid /var/run/nginx.pid; events { worker_connections 1024; multi_accept on; } http { log_format main '$remote_addr - $remote_user [$time_local] $status ' '"$request" $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; error_log /var/log/nginx/error.log warn; access_log /var/log/nginx/access.log main; server { listen 80 default_server; location / { proxy_pass http://${APP_ADDRESS}; } } } BinaryData ==== Events: <none>
위에서 만든 컨피그맵을 볼륨에 마운트하는 파드를 생성한다.
apiVersion: v1 kind: Pod metadata: name: conf-from-file spec: volumes: - name: nginx-conf-vol # 컨피그맵 볼륨 configMap: name: nginx-configmap # 파드 볼륨에 마운트 시킬 nginx 컨피그맵 containers: - name: my-container image: nginx:latest volumeMounts: - name: nginx-conf-vol # 위에서 정의한 볼륨 이름 mountPath: /etc/nginx/nginx.conf.template # 컨피그맵을 마운트 시킬 경로 subPath: nginx.conf.template # 이미지 빌드할 때 이미 생성된 디렉토리 (/etc/nginx) 에 단일 파일을 마운트하려면 subPath 를 설정한다.
conf-from-file
이라는 파드 내부에 /etc/nginx/nginx.conf.template
위치에 템플릿 파일이 마운트 된 것을 확인할 수 있다.한 가지 주의할 점: 컨피그맵을
subPath
볼륨 마운트로 사용하는 컨테이너는 컨피그맵 업데이트를 수신하지 않는다.3. —from-env-file
—-from-env-file
옵션으로 여러 개의 키/값 형태의 내용으로 구성된 설정 파일을 한꺼번에 컨피그맵으로 가져올 수 있다.ubuntu@ip-10-220-12-225:~/k8s-practice$ cat multiple.env KEY1=VALUE1 KEY2=VALUE2 KEY3=VALUE3
ubuntu@ip-10-220-12-225:~/k8s-practice$ ku create cm mutiple-key-value-configmap --from-env-file multiple.env configmap/mutiple-key-value-configmap created
4. —from-<env-file/file/literal> —dry-run -o yaml
컨피그맵을 반드시 명령어를 통해 생성해야 하는 것은 아니다.
—dry-run
과 -o yaml
옵션을 사용하면 YAML 파일로 뽑을 수 있다.참고로
apply
, create
같은 명령어에 —dry-run=client
옵션을 주면 리소스는 생성하지 않으면서 실행 가능 여부를 확인할 수 있다.ubuntu@ip-10-220-12-225:~/k8s-practice$ ku create configmap cm-to-file --from-literal KEY1=VALUE1 --dry-run=client -o yaml > configmap.yaml
ubuntu@ip-10-220-12-225:~/k8s-practice$ cat configmap.yaml apiVersion: v1 data: KEY1: VALUE1 kind: ConfigMap metadata: creationTimestamp: null name: cm-to-file
ubuntu@ip-10-220-12-225:~/k8s-practice$ ku apply -f configmap.yaml configmap/cm-to-file created
ubuntu@ip-10-220-12-225:~/k8s-practice$ ku describe cm cm-to-file Name: cm-to-file Namespace: default Labels: <none> Annotations: <none> Data ==== KEY1: ---- VALUE1 BinaryData ==== Events: <none>
참고자료