10. ConfigMap

2021. 5. 8. 20:10ใ†๐ŸŽฏ OpenSource/K8S

 
  • ์ปจํ…Œ์ด๋„ˆ์˜ ์ฃผ ํ”„๋กœ์„ธ์Šค ๋ณ€๊ฒฝ
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋ช…๋ น์ค„ ์˜ต์…˜ ์ „๋‹ฌ
  • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋…ธ์ถœ๋˜๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •
  • ์ปจํ”ผ๊ทธ๋งต์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •
  • ์‹œํฌ๋ฆฟ์œผ๋กœ ๋ฏผ๊ฐํ•œ ์ •๋ณด ์ „๋‹ฌ

7.1 ์ปจํ…Œ์ด๋„ˆํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์„ค์ •

์ปจํ…Œ์ด๋„ˆํ™”๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์„ค์ •๊ฐ’๋“ค์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ตฌ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค.

  • ๋ช…๋ น์ค„ ์ธ์ˆ˜๋กœ ์„ค์ •๊ฐ’ ์ง€์ •
  • ์„ค์ •๊ฐ’์„ ํŒŒ์ผ์— ์ €์žฅํ•˜์—ฌ ์ ์šฉ
    • ๋‹จ์ ) ํ•ด๋‹น ์„ค์ • ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€ ์•ˆ์— ํฌํ•จํ•˜๊ฑฐ๋‚˜, ํŒŒ์ผ์ด ํฌํ•จ๋œ ๋ณผ๋ฅจ์„ mountํ•˜์—ฌ ์‚ฌ์šฉํ•ด์•ผ ํ•ด์„œ ๊นŒ๋‹ค๋กญ๋‹ค. 
  • ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉ (ex. MYSQL_ROOT_PASSWORD)
  • Configmap ์ด๋ž€ ์„ค์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ์˜๋ฏธํ•œ๋‹ค. 

์ปจํ”ผ๊ทธ๋งต์„ ์‚ฌ์šฉํ•ด ๋‹ค์Œ ๋ฐฉ๋ฒ•์œผ๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ์ปจํ…Œ์ด๋„ˆ์— ๋ช…๋ น์ค„ ์ธ์ˆ˜ ์ „๋‹ฌ
  • ๊ฐ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์œ„ํ•œ ์‚ฌ์šฉ์ž ์ •์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ง€์ •
  • ํŠน์ˆ˜ํ•œ ์œ ํ˜•์˜ ๋ณผ๋ฅจ์„ ํ†ตํ•ด ์„ค์ • ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ์— ๋งˆ์šดํŠธ

์ด๋Ÿฌํ•œ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ค‘์—์„œ ๋ณด์•ˆ์ƒ ๋ฏผ๊ฐํ•œ ๋‚ด์šฉ์€ Secret์ด๋ผ๋Š” ์˜ค๋ธŒ์ ํŠธ๋ฅผ ์ด์šฉํ•˜์—ฌ ์ „๋‹ฌํ•˜๊ฒŒ ๋œ๋‹ค.

 

7.2 ์ปจํ…Œ์ด๋„ˆ์— ๋ช…๋ น์ค„ ์ธ์ž ์ „๋‹ฌ

7.2.1 ๋„์ปค์—์„œ ๋ช…๋ น์–ด์™€ ์ธ์ž ์ •์˜

์ปจํ…Œ์ด๋„ˆ์—์„œ ์‹คํ–‰ํ•˜๋Š” ์ „์ฒด ๋ช…๋ น์€ ๋ช…๋ น์–ด/์ธ์ž ์ด๋ ‡๊ฒŒ ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.

  • ENTRYPOINT : ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์‹œ์ž‘๋  ๋•Œ ํ˜ธ์ถœ๋  ๋ช…๋ น์–ด ์ •์˜
  • CMD : ENTRYPOINT ์— ์ „๋‹ฌ๋˜๋Š” ์ธ์ž ์ •์˜

์œ„์˜ ๋‘ ๋ช…๋ น์–ด ํƒ€์ž…์€ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์“ฐ์ธ๋‹ค.

์„ค๋ช… ๋„์ปค ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค
์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ์‹คํ–‰๋˜๋Š” ์‹คํ–‰ ํŒŒ์ผ ENTRYPOINT command
์‹คํ–‰ํŒŒ์ผ์— ์ „๋‹ฌ๋˜๋Š” ์ธ์ž CMD args

 

7.2.2 Pod์—์„œ ๋ช…๋ น๊ณผ ์ธ์ž ์žฌ์ •์˜

์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ •์˜ํ•  ๋•Œ, command์™€ args ๋ชจ๋‘ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. 

์ƒ์„ฑ ํ›„์—๋Š” args์˜ value ๊ฐ’์„ ์ฃผ๋กœ ์žฌ์ •์˜ํ•œ๋‹ค.

์ด๋•Œ command์™€ args ํ•„๋“œ๋Š” pod ์ƒ์„ฑ ํ›„์— ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์—†๋‹ค. 

spec:
  containers:
   - commnad: ["/bin/command"]
     args: ["arg1", "arg2", "arg3"]

args value๋ฅผ ์ง€์ •ํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ์— ์ธ์ž๊ฐ’์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: fortune5s
spec:
  containers:
  - image: luksa/fortune:args
    args: ["5"]
    name: html-generator
...

์œ„์˜ yaml ํŒŒ์ผ์—์„œ args๋กœ 5๋ฅผ fortuneloop.sh ์Šคํฌ๋ฆฝํŠธ๋กœ ๋„˜๊ฒผ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น pod๋Š” 5์ดˆ๋งˆ๋‹ค ์ƒˆ๋กœ์šด ์šด์„ธ ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋œ๋‹ค.

root@master001:~/Chapter07# curl http://172.30.65.180
The first thing we do, lets kill all the lawyers.
                -- Wm. Shakespeare, "Henry VI", Part IV
root@master001:~/Chapter07# curl http://172.30.65.180
The first thing we do, lets kill all the lawyers.
                -- Wm. Shakespeare, "Henry VI", Part IV
root@master001:~/Chapter07# curl http://172.30.65.180
FORTUNE PROVIDES QUESTIONS FOR THE GREAT ANSWERS: #19
A:      To be or not to be.
Q:      What is the square root of 4b^2?

 

7.3 ์ปจํ…Œ์ด๋„ˆ์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” pod์˜ ๊ฐ ์ปจํ…Œ์ด๋„ˆ๋งˆ๋‹ค ๊ฐœ๋ณ„์ ์œผ๋กœ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋ฆฌ์ŠคํŠธ(ํŒŒ์ผ)๋กœ ๊ฐ ์ปจํ…Œ์ด๋„ˆ์— ์ ์šฉ์‹œํ‚ค๊ฒŒ ๋œ๋‹ค.

์ปจํ…Œ์ด๋„ˆ๋ณ„ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •

์ด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ฒˆ์—๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ interval์„ ์„ค์ •ํ•ด ๋ณธ๋‹ค. 

ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๊ฐ’์„ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— fortuneloop.sh ํŒŒ์ผ์—์„œ ๊ธฐ์กด์—๋Š” ์ธ์ž๊ฐ’์œผ๋กœ interval์„ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ถ€๋ถ„์„ ์ฃผ์„์ฒ˜๋ฆฌํ•œ๋‹ค. 

#!/bin/bash
trap "exit" SIGINT
# INTERVAL=$1 : INTERVAL๋ฅผ ์ธ์ž๊ฐ’์œผ๋กœ ๊ฐ€์ ธ์˜ค๋„๋ก ์„ค์ •
echo Configured to generate new fortune every $INTERVAL seconds

mkdir -p /var/htdocs

while :
do
  echo $(date) Writing fortune to /var/htdocs/index.html
  /usr/games/fortune > /var/htdocs/index.html
  sleep $INTERVAL
done

7.3.1 ์ปจํ…Œ์ด๋„ˆ ์ •์˜์— ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ง€์ •

์ƒˆ๋กœ์šด fortuneloop.sh ํŒŒ์ผ์„ ํฌํ•จํ•œ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜์—ฌ docker ํ—ˆ๋ธŒ๋กœ ํ‘ธ์‹œํ•œ๋‹ค. 

๊ทธ๋ฆฌ๊ณ  pod ์ƒ์„ฑํ•˜๋Š” yaml ํŒŒ์ผ์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋ชฉ๋ก์— ๋‹จ์ผ ๋ณ€์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ƒ์„ฑํ•œ๋‹ค.

์šด์„ธ๊ฐ€ 1์ดˆ์— ํ•œ๋ฒˆ์”ฉ ๋ฐ”๋€Œ๋„๋ก INTERVAL ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ •ํ–ˆ๋‹ค.

metadata:
  name: fortune-env
spec:
  containers:
  - image: luksa/fortune:env
    env:
    - name: INTERVAL
      value: "1"

1์ดˆ๋งˆ๋‹ค ์šด์„ธ ๋ฉ”์‹œ์ง€๊ฐ€ ๋ฐ”๋€Œ์–ด์„œ ์ถœ๋ ฅ๋œ๋‹ค.

root@master001:~/Chapter07# curl http://172.30.254.30
Bridge ahead.  Pay troll.
root@master001:~/Chapter07# curl http://172.30.254.30
Q:      What is the sound of one cat napping?
A:      Mu.
root@master001:~/Chapter07# curl http://172.30.254.30
You own a dog, but you can only feed a cat.
root@master001:~/Chapter07# curl http://172.30.254.30
You tread upon my patience.
                -- William Shakespeare, "Henry IV"

 

7.3.2 ๋ณ€์ˆ˜์—์„œ ๋‹ค๋ฅธ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ์ฐธ์กฐ

yaml ํŒŒ์ผ ์•ˆ์— $(VAR)์„ ์‚ฌ์šฉํ•ด ์ด๋ฏธ ์ •์˜๋œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋‚˜ ๊ธฐํƒ€ ๊ธฐ์กด ๋ณ€์ˆ˜๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค.

env:
- name: FIRST_VAR
  value: "Wongyeong"
- name: SECOND_VAR
  value: "$(FIRST_VAR)LEE"

 

7.3.3 ํ•˜๋“œ์ฝ”๋”ฉ๋œ ํ™˜๊ฒฝ๋ณ€์ˆ˜์˜ ๋‹จ์ 

pod์˜ yaml ํŒŒ์ผ์— ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ํ•˜๋“œ์ฝ”๋”ฉํ•˜๋Š” ๊ฒƒ์€ ๋™์ผํ•œ pod์—๋„ ๊ฐ™์€ ์„ค์ •์„ ์ผ์ผํžˆ ํ•ด์•ผํ•จ์„ ์˜๋ฏธํ•œ๋‹ค.

๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ํ™˜๊ฒฝ์—์„œ ๋™์ผํ•œ ์ •์˜๋ฅผ ์žฌ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ปจํ”ผ๊ทธ๋งต ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ฌ์šฉํ•ด ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋‚ด์šฉ์„ pod ์ •์˜์—์„œ ๋ถ„๋ฆฌํ•œ๋‹ค.

 

 

7.4 ConfigMap์œผ๋กœ ์„ค์ • ๋ถ„๋ฆฌ

ํ™˜๊ฒฝ์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฑฐ๋‚˜ ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ์˜ต์…˜์€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ •์˜ ์†Œ์Šค์™€ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ด€๋ฆฌํ•œ๋‹ค.

ConfigMap์œผ๋กœ ์ด๋Ÿฌํ•œ ์„ค์ •๊ฐ’์„ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋‹ค.

 

7.4.1 ConfigMap?

  • ConfigMap์€ ์„ค์ •๊ฐ’์˜ ๋‚ด์šฉ์„ key-value ์Œ์œผ๋กœ ๊ตฌ์„ฑํ•œ ๋งต์ด๋‹ค.
  • ConfigMap์˜ ๋‚ด์šฉ์€ ์ปจํ…Œ์ด๋„ˆ์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋˜๋Š” ๋ณผ๋ฅจ ํŒŒ์ผ๋กœ ์ „๋‹ฌ๋œ๋‹ค. 
  • Pod๋Š” ConfigMap์„ ์ด๋ฆ„์œผ๋กœ ์ฐธ์กฐํ•œ๋‹ค.
    • ์„œ๋กœ ๋‹ค๋ฅธ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋™์ผํ•œ ์ด๋ฆ„์˜ ConfigMap์„ ์ƒ์„ฑํ•ด๋„ ๊ฐ ์ปจํ”ผ๊ทธ๋งต์€ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.

7.4.2 ConfigMap ์ƒ์„ฑ

kubectl create configmap

root@master001:~/Chapter07# kubectl create configmap fortune-config --from-literal=sleep-interval=10
configmap/fortune-config created
  • from-literal : ๋ฌธ์ž์—ด ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํ•ด๋‹น ์˜ต์…˜์„ ์—ฌ๋Ÿฌ๋ฒˆ ์ „๋‹ฌํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋ฌธ์ž์—ด ํ•ญ๋ชฉ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ

์œ„ ๋ช…๋ น์–ด๋กœ sleep-interval=20์ด๋ผ๋Š” ๋‹จ์ผ ํ•ญ๋ชฉ์„ ๊ฐ€์ง„ configmap์ด ์ƒ์„ฑ๋œ๋‹ค.

ํ•ด๋‹น configmap์— ์„ค์ •๋œ ํ•ญ๋ชฉ๊ณผ map์˜ ์ด๋ฆ„์„ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

root@master001:~/Chapter07# kubectl get configmap fortune-config -o yaml
apiVersion: v1
data:
  sleep-interval: "10"
kind: ConfigMap
metadata:
  creationTimestamp: "2021-05-08T10:48:10Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:sleep-interval: {}
    manager: kubectl-create
    operation: Update
    time: "2021-05-08T10:48:10Z"
  name: fortune-config
  namespace: default
  resourceVersion: "15407755"
  uid: e19889c4-83bc-49ac-a01c-7b013074bec0

 

ํŒŒ์ผ ๋‚ด์šฉ์œผ๋กœ ConfigMap ์ƒ์„ฑ

์ปจํ”ผ๊ทธ๋งต์— ์ „์ฒด ์„ค์ • ํŒŒ์ผ๊ณผ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ํ†ต์œผ๋กœ ์ €์žฅํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค.

$ kubectl create configmap my-config --from-file=config-file.conf

# ์ˆ˜๋™์œผ๋กœ key ์ง€์ • ๊ฐ€๋Šฅ: customkey๋กœ ์ง€์ •ํ•˜๋Š” ์˜ˆ
$ kubectl create configmap my-config --from-file=customkey=config-file.conf

 

๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ๋Š” ํŒŒ์ผ๋กœ ์ƒ์„ฑ

๋””๋ ‰ํ„ฐ๋ฆฌ ์•ˆ์˜ ๋ชจ๋“  ํŒŒ์ผ์„ ๊ฐ€์ ธ์™€์„œ ์ƒ์„ฑํ•œ๋‹ค.

๊ฐ ํŒŒ์ผ์„ ๊ฐœ๋ณ„ ํ•ญ๋ชฉ์œผ๋กœ ์ €์žฅํ•˜๋ฉฐ, ์ด๋•Œ ํŒŒ์ผ์ด๋ฆ„์ด key๋กœ ์‚ฌ์šฉํ•˜๊ธฐ์— ์œ ํšจํ•œ ํŒŒ์ผ๋งŒ ์ถ”๊ฐ€ํ•œ๋‹ค.

$ kubectl create configmap my-config --from-file=/path/to/dir

 

๋‹ค์–‘ํ•œ ์˜ต์…˜ ๊ฒฐํ•ฉ

์œ„์˜ ๋ฐฉ๋ฒ•๋“ค์„ ์กฐํ•ฉํ•ด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

$ kubectl create configmap my-config \
  --from-file=foo.json \         # ๋‹จ์ผ ํŒŒ์ผ
  --from-file=bar=foobar.conf \  # ์‚ฌ์šฉ์ž ์ •์˜ key ๋ฐ‘์— ์ €์žฅ๋œ ํŒŒ์ผ
  --from-file=config-opts/ \     # ๋””๋ ‰ํ„ฐ๋ฆฌ
  --from-literal=some=thing      # ๋ฌธ์ž์—ด ๊ฐ’

 

7.4.3 ConfigMap ํ•ญ๋ชฉ์„ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์ปจํ…Œ์ด๋„ˆ์— ์ „๋‹ฌ

์ด์ œ ConfigMap์„ Pod์•ˆ์˜ ์ปจํ…Œ์ด๋„ˆ์— ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณธ๋‹ค.

์ด์—๋Š” ์—ฌ๋Ÿฌ ์˜ต์…˜์ด ์žˆ๋‹ค.

  1. env.valueFrom
  2. envFrom

valueFrom ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ConfigMap์—์„œ ๊ฐ€์ ธ์˜ค๋„๋ก ์„ ์–ธํ•  ์ˆ˜ ์žˆ๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: fortune-env-from-configmap
  labels:
    app: kubia
spec:
  containers:
    - image: luksa/fortune:env
      name: html-generator
      env:
        - name: INTERVAL          
          valueFrom:
            configMapKeyRef: 
              name: fortune-config  # ์ด๋ฆ„์„ ํ†ตํ•œ ConfigMap ์ฐธ์กฐ 
              key: sleep-interval   # fortune-config ์˜ sleep-interval ํ‚ค์— ์ €์žฅ๋œ ๊ฐ’์œผ๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์„ค์ •
...

์ด ์ƒํ™ฉ์—์„œ ๋งŒ์•ฝ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ConfigMap์„ ์ฐธ์กฐํ•  ๊ฒฝ์šฐ ํ•ด๋‹น ์ปจํ…Œ์ด๋„ˆ๋Š” ์‹œ์ž‘๋˜์ง€ ์•Š๋Š”๋‹ค.

๊ทธ ํ›„์— ํ•ด๋‹น ConfigMap์ด ์ƒ์„ฑ๋˜๋ฉด ์‹คํŒจ๋œ ์ปจํ…Œ์ด๋„ˆ๋„ ์ž๋™์œผ๋กœ ์˜ฌ๋ผ์˜ค๊ฒŒ ๋œ๋‹ค.

( optional: true ๋ฅผ ์„ค์ •ํ•˜๋ฉด ์ปจํ”ผ๊ทธ๋งต์„ ๋ชป์ฐพ์•„๋„ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘์‹œํ‚จ๋‹ค)

 

7.4.4 ConfigMap์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ํ•œ ๋ฒˆ์— ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ

envFrom ์†์„ฑ์„ ์‚ฌ์šฉํ•ด ConfigMap์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ๋…ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค.

spec:
  containers:
    - image: some-image
      envFrom:                    #  env๋Œ€์‹  envFrom 
        - prefix: CONFIG_         #  ๋ชจ๋“  ํ™˜๊ฒฝ๋ณ€์ˆ˜๋Š” CONFIG_ ์ ‘๋‘์‚ฌ๋ฅผ ๊ฐ€์ง             
          configMapKeyRef:        #  my-config-map์ด๋ž€ ์ด๋ฆ„์˜ ์ปจํ”ผ๊ทธ๋งต ์ฐธ์กฐ
            name: my-config-map

ConfigMap์— FOO, BAR ๋ผ๋Š” ํ‚ค๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ปจํ…Œ์ด๋„ˆ์—๋Š” CONFIG_FOO, CONFIG_BAR ๋ผ๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜๊ฐ€ ์ ์šฉ๋œ๋‹ค.

FOO-BAR ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ๋Œ€์‹œ(-)๋ฅผ ํฌํ•จํ•˜์—ฌ ์˜ฌ๋ฐ”๋ฅธ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ด๋ฆ„์ด ๋  ์ˆ˜ ์—†๋‹ค.

 

7.4.5 ConfigMap ํ•ญ๋ชฉ์„ ๋ช…๋ น์ค„ ์ธ์ž๋กœ ์ „๋‹ฌ

์ปจํ”ผ๊ทธ๋งต ํ•ญ๋ชฉ์„ ์ปจํ…Œ์ด๋„ˆ์˜ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋กœ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ ์‚ฌ์šฉ

apiVersion: v1
kind: Pod
metadata:
  name: fortune2s-args-configmap
  labels:
    app: kubia
spec:
  containers: 
    - image: luksa/fortune:args  # ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ args ๋กœ ๋ถ€ํ„ฐ INTERVAL ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ์ด๋ฏธ์ง€ ์‚ฌ์šฉ
      name: html-generator
      env:
        - name: INTERVAL         # ConfigMap ์‚ฌ์šฉํ•˜์—ฌ ํ™˜๊ฒฝ๋ณ€์ˆ˜ INTERVAL ์ •์˜ 
          valueFrom:
            configMapKeyRef:
              name: fortune-config
              key: sleep-interval
      args: ["$(INTERVAL)"]       # ํ™˜๊ฒฝ๋ณ€์ˆ˜ INTERVAL ๋กœ ์ง€์ •ํ•œ ๊ฐ’์„ argument ๋กœ ์‚ฌ์šฉ

 

7.4.6 ConfigMap ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•œ ์ „๋‹ฌ

ConfigMap ๋ณผ๋ฅจ์„ ์‚ฌ์šฉํ•ด ํŒŒ์ผ๋กœ ์ปจํ”ผ๊ทธ๋žฉ์˜ ๊ฐ ํ•ญ๋ชฉ์„ ๋…ธ์ถœ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค.

์ด๋Š” ๋Œ€๋ถ€๋ถ„ ๋Œ€ํ˜• ์„ค์ • ํŒŒ์ผ์„ ์ปจํ…Œ์ด๋„ˆ์— ์ „๋‹ฌํ•˜๋Š” ์šฉ๋„๋กœ ์“ฐ์ธ๋‹ค.

 

ConfigMap ์ƒ์„ฑ

Nginx ์ปจํ…Œ์ด๋„ˆ์˜ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์„ค์ • ํŒŒ์ผ๋กœ ์„ธํŒ….

Nginx ์ปจํ…Œ์ด๋„ˆ๋Š” ํด๋ผ์ด์–ธํŠธ๋กœ ์‘๋‹ต์„ ์••์ถ•ํ•ด์„œ ๋ณด๋‚ด๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

$ vi configmap-files/my-nginx-config.conf
server {
  listen  80;
  server_name www.kubia-example.com;

  # ํ‰๋ฌธ ๋ฐ xml ํŒŒ์ผ์— ๋Œ€ํ•ด gzip ์••์ถ• ํ™œ์„ฑํ™”
  gzip  on;
  gzip_types  text/plain application/xml;

  location / {
    root /usr/share/nginx/html;
    index index.html index.htm;
  }
}

configmap-files ๋””๋ ‰ํ„ฐ๋ฆฌ ํ•˜์œ„์— ์žˆ๋Š” ๋ชจ๋“  ํŒŒ์ผ์„ ์‚ฌ์šฉํ•œ ์ปจํ”ผ๊ทธ๋งต์„ ์ƒ์„ฑํ•œ๋‹ค.

root@master001:~/Chapter07# kubectl create configmap fortune-config --from-file=configmap-files
configmap/fortune-config created

ํ•ด๋‹น ConfigMap์˜ yaml ํŒŒ์ผ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

root@master001:~/Chapter07# kubectl get configmap fortune-config -o yaml
apiVersion: v1
data:
  my-nginx-config.conf: |
    server {
        listen              80;
        server_name         www.kubia-example.com;

        gzip on;
        gzip_types text/plain application/xml;

        location / {
            root   /usr/share/nginx/html;
            index  index.html index.htm;
        }

    }
  sleep-interval: |
    25
kind: ConfigMap
metadata:
  creationTimestamp: "2021-05-08T15:24:57Z"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:data:
        .: {}
        f:my-nginx-config.conf: {}
        f:sleep-interval: {}
    manager: kubectl-create
    operation: Update
    time: "2021-05-08T15:24:57Z"
  name: fortune-config
  namespace: default
  resourceVersion: "15449748"
  uid: bd477478-5516-4758-b54f-72f9e3d0699c

data ํ•˜์œ„๋กœ my-nginx-config.conf์™€ sleep-interval ์„ค์ •๊ฐ’์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์ด์ œ ์ด ์ปจํ”ผ๊ทธ๋งต์„ ๋‘ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๋™์‹œ์— ์‚ฌ์šฉํ•˜๋„๋ก ํ•œ๋‹ค.

 

๋ณผ๋ฅจ ์•ˆ์— ์žˆ๋Š” ConfigMap ํ•ญ๋ชฉ ์‚ฌ์šฉ

ConfigMap์˜ ๋‚ด์šฉ์„ ๊ฐ€์ง„ ๋ณผ๋ฅจ์„ ์ƒ์„ฑํ•œ๋‹ค.

ConfigMap ํ•ญ๋ชฉ์„ ํŒŒ์ผ๋กœ ๋งˆ์šดํŠธํ•œ pod๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์„ค์ •ํ•œ๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: fortune-configmap-volume
spec:
  containers:
  - image: luksa/fortune:env
    env:
    - name: INTERVAL
      valueFrom:
        configMapKeyRef:
          name: fortune-config
          key: sleep-interval
    name: html-generator
    volumeMounts:
    - name: html
      mountPath: /var/htdocs
  - image: nginx:alpine
    name: web-server
    volumeMounts:
    - name: html
      mountPath: /usr/share/nginx/html
      readOnly: true
    - name: config
      mountPath: /etc/nginx/conf.d     # <- ์ปจํ”ผ๊ทธ๋งต ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธํ•˜๋Š” ์œ„์น˜
      readOnly: true
    - name: config                     
      mountPath: /tmp/whole-fortune-config-volume
      readOnly: true
    ports:
      - containerPort: 80
        name: http
        protocol: TCP
  volumes:
  - name: html
    emptyDir: {}
  - name: config       # <- ํ•ด๋‹น ๋ณผ๋ฅจ์€ fortune-config ์ปจํ”ผ๊ทธ๋งต์„ ์ฐธ์กฐ
    configMap:
      name: fortune-config

nginx๋Š” /etc/nginx/nginx.conf ํŒŒ์ผ์˜ ์„ค์ •๊ฐ’์„ ์ฝ๋Š”๋‹ค.

nginx.conf ํŒŒ์ผ์„ ๋ณด๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด /etc/nginx/conf.d/ ๋””๋ ‰ํ„ฐ๋ฆฌ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋“  .conf ํŒŒ์ผ์„ ์ฝ๋„๋ก ๋˜์–ด์žˆ๋‹ค.

  include /etc/nginx/conf.d/*.conf

๋”ฐ๋ผ์„œ ์œ„์˜ yamlํŒŒ์ผ์—์„œ config ๋ณผ๋ฅจ์ด fortune-config ์˜ ์ปจํ”ผ๊ทธ๋งต์„ ์ฐธ์กฐํ•จ์— ๋”ฐ๋ผ nginx ์ปจํ…Œ์ด๋„ˆ๋Š” fortune-config ๋ฅผ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.

 

์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค.

<nginx์˜ ConfigMap ๋ณผ๋ฅจ๊ณผ ๋งˆ์šดํŠธ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ ํ™•์ธ>

root@master001:~/Chapter07# kubectl exec fortune-configmap-volume -c web-server -- ls /etc/nginx/conf.d
my-nginx-config.conf
sleep-interval

๋‹จ, ์ด๋•Œ sleep-interval์€ html-generator ์ปจํ…Œ์ด๋„ˆ์—์„œ ์“ฐ์ด๋Š” ๊ฒƒ์œผ๋กœ, web-server์—๋Š” ๋…ธ์ถœ๋  ํ•„์š”๊ฐ€ ์—†๋‹ค.

๋”ฐ๋ผ์„œ ๋ถˆ๋ฅจ์— ํŠน์ • ConfigMap ํ•ญ๋ชฉ๋งŒ ๋…ธ์ถœํ•˜๋Š” ๋ฒ•์„ ์•Œ์•„๋ณธ๋‹ค.

  volumes:
  - name: html
    emptyDir: {}
  - name: config
    configMap:
      name: fortune-config
      items:    # <- ๋ณผ๋ฅจ์— ํฌํ•จํ•  ํ•ญ๋ชฉ์„ ์กฐํšŒํ•˜์—ฌ ์„ ํƒ 
      - key: my-nginx-config.conf      # <- ํ•ด๋‹น value๋ฅผ ๊ฐœ๋ณ„์ ์œผ๋กœ ์„ ํƒ
        path: gzip.conf                # <- gzip.conf ๋ผ๋Š” ์ด๋ฆ„์˜ ํŒŒ์ผ๋กœ /etc/nginx/conf.d์— ์ƒ์„ฑ

<nginx์˜ ConfigMap ๋ณผ๋ฅจ๊ณผ ๋งˆ์šดํŠธ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ ํ™•์ธ>

root@master001:~/Chapter07# kubectl exec fortune-configmap-volume-with-items -c web-server -- ls /etc/nginx/conf.d
gzip.conf
๐Ÿ˜จ (๏ผƒ°ะ”°)
mount๋ฅผ ํ•˜๋ฉด ๋งˆ์šดํŠธํ•œ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ์žˆ๋Š” ํŒŒ์ผ๋งŒ ํฌํ•จํ•˜๊ณ , ๊ธฐ์กด์— ๋กœ์ปฌ(์ปจํ…Œ์ด๋„ˆ)์˜ ํ•ด๋‹น ๊ฒฝ๋กœ์— ์žˆ๋Š” ํŒŒ์ผ์€ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๋‹ค.
์ด๋ฅผ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๊ฐœ๋ณ„ ConfigMap ํ•ญ๋ชฉ์„ ํŒŒ์ผ๋กœ ๋งˆ์šดํŠธ ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•œ๋‹ค.

 

๊ฐœ๋ณ„ ConfigMap ํ•ญ๋ชฉ์„ file๋กœ ๋งˆ์šดํŠธํ•˜๊ธฐ

์ „์ฒด ๋ณผ๋ฅจ์„ ๋งˆ์šดํŠธ ํ•˜๋Š”๋Œ€์‹  volumeMount์— subPath ์†์„ฑ์œผ๋กœ ํŒŒ์ผ์ด๋‚˜ ๋””๋ ‰ํ„ฐ๋ฆฌ ํ•˜๋‚˜๋งŒ์„ ๋ณผ๋ฅจ์— ๋งˆ์šดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

spec:
  containers:
    - image: some/image
      volumeMounts:
        - name: myvolume
          mountPath: /etc/someconfig.conf   # ์ปจํ…Œ์ด๋„ˆ์˜ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์•„๋‹Œ ํŒŒ์ผ์„ ๋งˆ์šดํŠธ
          subPath: myconfig.conf            # ConfigMap ๋ณผ๋ฅจ์˜ myconfig.conf ํ•ญ๋ชฉ๋งŒ ๋งˆ์šดํŠธ 

ํ•˜์ง€๋งŒ ์ด ๋ฐฉ๋ฒ•์€ ํŒŒ์ผ ์—…๋ฐ์ดํŠธ์— ๊ฒฐํ•จ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.

 

ConfigMap ๋ถˆ๋ฅจ ์•ˆ์— ์žˆ๋Š” ํŒŒ์ผ ๊ถŒํ•œ ์„ค์ •

๊ธฐ๋ณธ์ ์œผ๋กœ ConfigMap ๋ณผ๋ฅจ์˜ ๋ชจ๋“  ํŒŒ์ผ ๊ถŒํ•œ์€ 0644๋กœ ์„ค์ •๋˜๋ฉฐ, ์ด๋Š” defaultMode ์†์„ฑ์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

  volumes:
  - name: html
    emptyDir: {}
  - name: config
    configMap:
      name: fortune-config
      defaultMode: 0660

ConfigMap์€ ๋ณด์•ˆ์ƒ ์ค‘์š”ํ•˜์ง€ ์•Š์€ ์„ค์ • ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š”๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜์ง€๋งŒ,

ํ•„์š”์— ๋”ฐ๋ผ ํŒŒ์ผ์˜ ๊ถŒํ•œ์„ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

 

7.4.7 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์žฌ์‹œ์ž‘ ์—†์ด ์„ค์ • ์—…๋ฐ์ดํŠธ

ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋˜๋Š” ๋ช…๋ น์ค„ ์ธ์ˆ˜๋ฅผ ์„ค์ • ์†Œ์Šค๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์˜ ๋‹จ์ ์€ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Š” ConfigMap์„ ๋ณผ๋ฅจ์œผ๋กœ ๋…ธ์ถœํ•˜๋ฉด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์žฌ์‹œ์ž‘ ์—†์ด ์—…๋ฐ์ดํŠธ ํ•  ์ˆ˜ ์žˆ๋‹ค.

ConfigMap์„ ์—…๋ฐ์ดํŠธํ•˜๋ฉด, ์ด๋ฅผ ์ฐธ์กฐํ•˜๋Š” ๋ชจ๋“  ๋ณผ๋ฅจ์˜ ํŒŒ์ผ์ด ์—…๋ฐ์ดํŠธ๋œ๋‹ค.

 

์ปจํ”ผ๊ทธ๋งต ํŽธ์ง‘

ConfigMap ํŽธ์ง‘ ํ›„ pod ์•ˆ์—์„œ ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค๊ฐ€ ConfigMap ๋ณผ๋ฅจ์— ๋…ธ์ถœ๋œ ํŒŒ์ผ์„ ๋‹ค์‹œ ๋กœ๋“œํ•˜๋„๋ก ํ•œ๋‹ค.

1) ConfigMap ํŽธ์ง‘

gzip on -> gzip off๋กœ ์ˆ˜์ •

root@master001:~/Chapter07# vi fortune-pod-configmap-volume-defaultMode.yaml
configmap/fortune-config edited

vi ๋กœ ํŒŒ์ผ์„ ์ €์žฅํ•˜๊ณ  ๋‚˜์˜ค๋Š” ์ˆœ๊ฐ„ ConfigMap์ด ์—…๋ฐ์ดํŠธ ๋˜๋ฉด์„œ ๋ณผ๋ฅจ์˜ ์‹ค์ œ ํŒŒ์ผ๋„ ์—…๋ฐ์ดํŠธ ๋œ๋‹ค.

root@master001:~/Chapter07# kubectl exec fortune-configmap-volume -c web-server cat /etc/nginx/conf.d/my-nginx-config.conf
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
server {
    listen              80;
    server_name         www.kubia-example.com;

    gzip off;
    gzip_types text/plain application/xml;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

}

์œ„์™€ ๊ฐ™์ด ํŒŒ์ผ์ด ์—…๋ฐ์ดํŠธ ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค๋งŒ nginx๋Š” ํŒŒ์ผ์˜ ๋ณ€๊ฒฝ์„ ๊ฐ์‹œํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์งˆ์ ์œผ๋กœ ๋ฐ˜์˜๋˜์ง€๋Š” ์•Š์•˜๋‹ค.

๋”ฐ๋ผ์„œ Nginx์—๊ฒŒ ์„ค์ •ํŒŒ์ผ์„ ๋‹ค์‹œ ๋กœ๋“œํ•˜๋„๋ก ํ•œ๋‹ค.

root@master001:~/Chapter07# kubectl exec fortune-configmap-volume -c web-server -- nginx -s reload
2021/05/09 02:27:04 [notice] 34#34: signal process started

์ด๋Š” ์‹ฌ๋ณผ๋ฆญ ๋งํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์›๋ณธ ํŒŒ์ผ์„ ์ฐธ์กฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋Šฅํ•˜๋‹ค.

root@master001:~/Chapter07# kubectl exec -it fortune-configmap-volume -c web-server -- ls -lA /etc/nginx/conf.d
total 4
drwxr-xr-x    2 root     root          4096 May  9 02:23 ..2021_05_09_02_23_08.552611578
lrwxrwxrwx    1 root     root            31 May  9 02:23 ..data -> ..2021_05_09_02_23_08.552611578
lrwxrwxrwx    1 root     root            27 May  8 15:50 my-nginx-config.conf -> ..data/my-nginx-config.conf
lrwxrwxrwx    1 root     root            21 May  8 15:50 sleep-interval -> ..data/sleep-interval

 

 

'๐ŸŽฏ OpenSource > K8S' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

12. Accessing to Pod metadata from application  (2) 2021.05.09
11. Secret  (0) 2021.05.09
09. Job์œผ๋กœ ์™„๋ฃŒ ๊ฐ€๋Šฅํ•œ ๋‹จ์ผ task ๊ตฌํ˜„ํ•˜๊ธฐ  (0) 2021.04.05
08. DaemonSet  (0) 2021.04.05
07. ReplicaSet  (0) 2021.04.05