[kubernetes-실습] Volumes and Data : ConfigMap 간단 테스트

# ConfigMap에 대해 간단하게 테스트 해보자

# 주요 색들을 포함한 ConfigMap을 생성해 보자.
# 먼저 primary라는 디렉토리를 만들고 색과 관련된 파일들을 생성해본다.
ps0107@k8smaster1:~$ mkdir primary                                                                                                   
ps0107@k8smaster1:~$ echo c > primary/cyan                                                                                           
ps0107@k8smaster1:~$ echo m > primary/magenta
ps0107@k8smaster1:~$ echo y > primary/yellow
ps0107@k8smaster1:~$ echo k > primary/black
ps0107@k8smaster1:~$ echo "known as key" >> primary/black                                                                            
ps0107@k8smaster1:~$ echo blue > favorite                                                                                            

# configMap을 생성하는 3가지 방법이 있다.
# 1. literal value
# 2. file
# 3. directory
ps0107@k8smaster1:~$ kubectl create configmap colors ₩
--from-literal=text=black ₩
--from-file=./favorite ₩
--from-file=./primary/         
configmap/colors created

# configMap 생성 확인
ps0107@k8smaster1:~$ kubectl get configmap colors                                                                                    
NAME     DATA   AGE
colors   6      22s

ps0107@k8smaster1:~$ kubectl get configmap colors -o yaml                                                                            
apiVersion: v1
data:
  black: |      #-> value 자체가 여러 라인일 경우 pipe로 주고 여러 라인 사용
    k
    known as key
  cyan: |
    c
  favorite: |
    blue
  magenta: |
    m
  text: black
  yellow: |
    y
kind: ConfigMap
metadata:
  creationTimestamp: "2020-02-03T07:39:51Z"
  name: colors
  namespace: default
  resourceVersion: "691846"
  selfLink: /api/v1/namespaces/default/configmaps/colors
  uid: f555ef1d-cfd5-4ce4-bc19-4ef81bc51466

# configMap을 이용하여 pod를 생성해보자
ps0107@k8smaster1:~$ vi simpleshell.yaml                                                                                            
apiVersion: v1
kind: Pod
metadata:
  name: shell-demo
spec:
  containers:
  - name: nginx
    image: nginx
    env:      # -> colors라는 configmap에 favorite 라는 key에 대한 value를 ilike 라는 환경 변수에 저장
    - name: ilike 
      valueFrom:
        configMapKeyRef:
          name: colors
          key: favorite

# nginx pod 하나 생성  
ps0107@k8smaster1:~$ kubectl create -f simpleshell.yaml 
pod/shell-demo created

# 해당 pod에 환경변수 ilike를 조회해 본다.
ps0107@k8smaster1:~$ kubectl exec -it shell-demo -- /bin/bash -c 'echo $ilike'
blue

# 해당 pod 삭제
ps0107@k8smaster1:~$ kubectl delete pod shell-demo 
pod "shell-demo" deleted

# 이번엔 envFrom를 사용하여 colors라는 configMap 전체를 참조하게 한다.
ps0107@k8smaster1:~$ vi simpleshell.yaml                                                                                            
apiVersion: v1
kind: Pod
metadata:
  name: shell-demo
spec:
  containers:
  - name: nginx
    image: nginx
#    env:
#    - name: ilike
#      valueFrom:
#        configMapKeyRef:
#          name: colors
#          key: favorite
    envFrom:
    - configMapRef:
       name: colors

# 테스트를 위한 nginx pod 하나 생성
ps0107@k8smaster1:~$ kubectl create -f simpleshell.yaml 
pod/shell-demo created

# 생성된 pod의 전체 env 설정 값들을 출력해본다.
ps0107@k8smaster1:~$ kubectl exec -it shell-demo -- /bin/bash -c 'env'
black=k
known as key

KUBERNETES_SERVICE_PORT_HTTPS=443
cyan=c

yellow=y

KUBERNETES_SERVICE_PORT=443
HOSTNAME=shell-demo
PWD=/
PKG_RELEASE=1~buster
HOME=/root
KUBERNETES_PORT_443_TCP=tcp://10.96.0.1:443
text=black
NJS_VERSION=0.3.8
TERM=xterm
favorite=blue

SHLVL=0
KUBERNETES_PORT_443_TCP_PROTO=tcp
KUBERNETES_PORT_443_TCP_ADDR=10.96.0.1
KUBERNETES_SERVICE_HOST=10.96.0.1
KUBERNETES_PORT=tcp://10.96.0.1:443
KUBERNETES_PORT_443_TCP_PORT=443
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_VERSION=1.17.8
magenta=m
_=/usr/bin/env

# 확인 했으면 해당 pod를 삭제 한다.
ps0107@k8smaster1:~$ kubectl delete pod shell-demo 
pod "shell-demo" deleted

# 이번엔 자동차 관련 ConfigMap을 생성해 보자. 먼저 아래와 같이 yaml파일을 생성한다.
ps0107@k8smaster1:~$ cat car-map.yaml 
apiVersion: v1
kind: ConfigMap
metadata:
  name: fast-car
  namespace: default
data:
  car.make: Ford
  car.model: Mustang
  car.trim: Shelby
 
# configMap을 생성한다.
ps0107@k8smaster1:~$ kubectl create -f car-map.yaml 
configmap/fast-car created

# 생성된 configMap 객체에 대한 정보를 yaml형태로 확인해본다.
ps0107@k8smaster1:~$ kubectl get configmap fast-car -o yaml                                                                          
apiVersion: v1
data:
  car.make: Ford
  car.model: Mustang
  car.trim: Shelby
kind: ConfigMap
metadata:
  creationTimestamp: "2020-02-03T07:45:24Z"
  name: fast-car
  namespace: default
  resourceVersion: "692322"
  selfLink: /api/v1/namespaces/default/configmaps/fast-car
  uid: 2aaa4f19-37f7-44aa-a31c-ace3ae5fc289

# 자동차 configMap 를 테스트 하기 위해 아까 사용한 simpleshell.yaml파일을 수정한다.
ps0107@k8smaster1:~$ vi simpleshell.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: shell-demo
spec:
  containers:
    - name: nginx
      image: nginx
      volumeMounts:
      - name: car-vol
        mountPath: /etc/cars
  volumes:
    - name: car-vol
      configMap:
        name: fast-car

# pod를 생성한다.
ps0107@k8smaster1:~$ kubectl create -f simpleshell.yaml 
pod/shell-demo created

# 해당 pod 에 monutPath를 조회해본다.
ps0107@k8smaster1:~$ kubectl exec -it shell-demo -- /bin/bash -c 'df -ha | grep car'
/dev/sda1       9.7G  5.1G  4.6G  53% /etc/cars

# 해당 pod의 마운트 path에 configMap 에 대해 생성된 파일들을 조회해본다.
ps0107@k8smaster1:~$ kubectl exec -it shell-demo -- /bin/bash -c 'cat /etc/cars/car.trim'                                            
Shelby

# 테스트가 끝났으니 리소스를 정리한다.
ps0107@k8smaster1:~$ kubectl delete pods shell-demo 
pod "shell-demo" deleted
ps0107@k8smaster1:~$ kubectl delete configmap fast-car colors                                                                        
configmap "fast-car" deleted
configmap "colors" deleted