brunch

You can make anything
by writing

C.S.Lewis

by Master Seo Jun 29. 2021

쿠버1탄-9. 쿠버네티스 -ConfigMap

다음은 쿠버네티스 스터디 자료를 참고해  정리한 내용입니다.


환경변수를 관리하자 Configmap,Secret 


<1> init 초기 실행 컨테이너 (선택)

<2> ConfigMap  환경변수 관리

<3> Secret  -  정보 저장용

<4> ConfigMap 개념 잡기 동영상

<5> 정리 



<1> init 초기 실행 컨테이너 (선택)


 master node의 api 서버 접속

ssh -i ~/.ssh/id_rsa ubuntu@api.k8s.serverchk.com


kubectl delete pod --all


1

init은 pod내에서 어플리케이션이 시작하지 전에 초기에 실행되는 컨테이너이다.

init 컨테이너 실행  > 어플리케이션 컨테이너 시작 순이 되겠다.


아래  내용은 

init초기 실행 컨데이너가 실패하는 환경이다.

컨테이너가 실패하는거를 조치하여  동작하도록 하는 설정이다.



2

init.yaml


cat << EOF > init.yaml

apiVersion: v1

kind: Pod

metadata:

  name: myapp-pod

  labels:

    app: myapp

spec:

  containers:

  - name: myapp-container

    image: busybox:1.28

    command: ['sh', '-c', 'echo The app is running! && sleep 3600']

  initContainers:

  - name: init-myservice

    image: busybox:1.28

    command: ['sh', '-c', "until nslookup myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for myservice; sleep 2; done"]

  - name: init-mydb

    image: busybox:1.28

    command: ['sh', '-c', "until nslookup mydb.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local; do echo waiting for mydb; sleep 2; done"]

EOF




3

kubectl apply -f init.yaml && kubectl get pod -w

pod/myapp-pod created

NAME        READY   STATUS     RESTARTS   AGE

myapp-pod   0/1     Init:0/2   0          0s

myapp-pod   0/1     Init:0/2   0          0s

myapp-pod   0/1     Init:1/2   0          1s

myapp-pod   0/1     PodInitializing   0          2s

myapp-pod   1/1     Running           0          3s


// 컨테이너중 1개가 제대로 안된다고 STATUS에 나옴


4

kubectl get pod -o wide


NAME        READY   STATUS    RESTARTS   AGE    IP               NODE                                               NOMINATED NODE   READINESS GATES

myapp-pod   1/1     Running   0          112s   100.98.158.143   ip-172-20-38-144.ap-northeast-1.compute.internal   <none>           <none>

// pod는 1개로 뜸


4

kubectl describe pod myapp-pod | grep 'Init Containers' -A 34


myapp-pod 는  성공


//  aws pod 성공, 컨터이너는 termicated , Completed로 표시됨

// 원래는  myapp-container는 init을 성공하지 못해  wait   상태이어여 한다?



5

명령어가 왜 실패 하는지 확인

컨테이너 netshoot로 로그인

kubectl run tmp-shell --rm -i --tty --image nicolaka/netshoot -- /bin/bash

bash-5.1#


6

cat /var/run/secrets/kubernetes.io/serviceaccount/namespace ; echo default


bash-5.1# cat /var/run/secrets/kubernetes.io/serviceaccount/namespace ; echo default

defaultdefault



7

bash-5.1#

nslookup www.google.com

성공


bash-5.1#  nslookup www.google.com

Server:         100.64.0.10

Address:        100.64.0.10#53

Non-authoritative answer:

Name:   www.google.com

Address: 172.217.31.164

Name:   www.google.com

Address: 2404:6800:4004:80d::2004


8

cmd에 설정된  도메인은 실패 


> myservice.$(cat /var/run/secrets/kubernetes.io/serviceaccount/namespace).svc.cluster.local

Server:         100.64.0.10

Address:        100.64.0.10#53

** server can't find myservice.\$\(cat: NXDOMAIN


9

exit



// 서비스 생성후 확인


10

myservice 생성


cat << EOF | kubectl apply -f - && watch -d "kubectl describe pod myapp-pod | grep Events -A 12"

apiVersion: v1

kind: Service

metadata:

  name: myservice

spec:

  ports:

  - protocol: TCP

    port: 80

    targetPort: 9376

EOF



11

kubectl get pod


ubuntu@ip-172-20-41-255:~$ kubectl get pod

NAME        READY   STATUS    RESTARTS   AGE

myapp-pod   1/1     Running   0          5m41s


12

kubectl describe pod myapp-pod


11

mydb 생성


 cat << EOF | kubectl apply -f - && watch -d "kubectl describe pod myapp-pod | grep Events -A 12"


apiVersion: v1

kind: Service

metadata:

  name: mydb

spec:

  ports:

  - protocol: TCP

    port: 80

    targetPort: 9377

EOF


service/mydb created



12

kubectl get pod

NAME        READY   STATUS    RESTARTS   AGE

myapp-pod   1/1     Running   0          7m32s



13

kubectl delete pod --all




<2> ConfigMap  환경변수 사용


설명 동영상

https://youtu.be/7j6JOlWL-dE


문서

https://kubernetes.io/docs/tasks/configure-pod-container/configure-pod-configmap/


clear


ConfigMap  환경변수 사용하면 ,컨테이너 이미지는 1개만 사용하고 , 각각의 환경 변수를 가져와서 서비스 하면 된다.

아니면, 개발환경 컨테이너 이미지, 상용환경 컨테이너 이미지를 각각 관리해야 한다.



1

kubectl create configmap log-level --from-literal LOG_LEVEL=DEBUG

configmap/log-level created

// log lovel이 debug인 configmap 생성한다.



2

확인

kubectl get configmap

NAME                   DATA   AGE

kube-root-ca.crt   1      46h

log-level                1      8s

// 이름이  log-level 


3

kubectl describe configmaps log-level

Name:         log-level

Namespace:    default

Labels:       <none>

Annotations:  <none>

Data

====

LOG_LEVEL:

----

DEBUG

Events:  <none>


4


pod를 만들어  config map에서 정보를 가져와 사용하도록 해보자



cat << EOF > configmap-pod.yaml

apiVersion: v1

kind: Pod

metadata:

  name: configmap-pod

spec:

  containers:

    - name: configmap-pod

      image: busybox

      args: ['tail', '-f', '/dev/null']

      envFrom:

      - configMapRef:

          name: log-level

EOF


5

Pod 생성

kubectl apply -f configmap-pod.yaml

pod/configmap-pod created



5

pod  확인

exec로 pod에 명령어 실행한다. env에 어떤값이 있는가 확인 ?

kubectl exec configmap-pod -- env

// LOG_LEVEL=DEBUG 값을 불러온 것이다.

// 평문으로 저장 된것이다.


PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

HOSTNAME=configmap-pod

LOG_LEVEL=DEBUG

KUBERNETES_PORT_443_TCP=tcp://100.64.0.1:443

KUBERNETES_PORT_443_TCP_PORT=443

MYSERVICE_PORT_80_TCP_PORT=80

MYSERVICE_PORT_80_TCP_ADDR=100.65.11.126

MYDB_SERVICE_HOST=100.65.166.169

MYDB_SERVICE_PORT=80

MYDB_PORT=tcp://100.65.166.169:80

KUBERNETES_PORT=tcp://100.64.0.1:443

MYDB_PORT_80_TCP_PROTO=tcp

MYSERVICE_SERVICE_HOST=100.65.11.126

MYSERVICE_SERVICE_PORT=80

KUBERNETES_SERVICE_PORT_HTTPS=443

MYSERVICE_PORT=tcp://100.65.11.126:80

MYDB_PORT_80_TCP_PORT=80

KUBERNETES_PORT_443_TCP_PROTO=tcp

KUBERNETES_SERVICE_PORT=443

KUBERNETES_PORT_443_TCP_ADDR=100.64.0.1

MYSERVICE_PORT_80_TCP=tcp://100.65.11.126:80

MYSERVICE_PORT_80_TCP_PROTO=tcp

MYDB_PORT_80_TCP=tcp://100.65.166.169:80

MYDB_PORT_80_TCP_ADDR=100.65.166.169

KUBERNETES_SERVICE_HOST=100.64.0.1

HOME=/root


5

삭제

kubectl delete pod --all && kubectl delete configmaps log-level




<3>  secret  -  정보 저장용


configmap 과 유사하게 불러오는 것임.

base 64로 암호화 됨

하지만 취약한 암호화로 사용은 힘들다.


1

kubectl get secrets

NAME                  TYPE                                  DATA   AGE

default-token-fpltq   kubernetes.io/service-account-token   3      46h



2

password=1q2w3e4r  저장

kubectl create secret generic my-password --from-literal password=1q2w3e4r

secret/my-password created



3

확인

kubectl get secrets  

NAME                  TYPE                                  DATA   AGE

default-token-fpltq   kubernetes.io/service-account-token   3      46h

my-password           Opaque                                1      58s



4

kubectl describe secrets my-password

Name:         my-password

Namespace:    default

Labels:       <none>

Annotations:  <none>

Type:  Opaque

Data

====

password:  8 bytes



5

kubectl get secrets my-password -o jsonpath='{.data.password}' ; echo

MXEydzNlNHI=


6

// base 64로 암호화 한거라 약한 암호화 이다.

 echo MXEydzNlNHI= |base64 -d ;echo

1q2w3e4r



7

시크릿이 안전하지 않다~

kubectl get secrets my-password -o jsonpath='{.data.password}' | base64 -d ; echo

1q2w3e4r





<4> Configmap 개념 잡기 동영상


1

변수값이 조금 틀리다고 이미지를 여러개 관리할 필요가 없다.

변경될수 있는 변수는 Configmap 사용하여 이미지는 하나로 관리가 가능하다.


2

개념 잡기 동영상

https://youtu.be/7j6JOlWL-dE




<5> 정리 


1

 init 초기 실행 컨테이너가 있다!

init은 pod내에서 어플리케이션이 시작하지 전에 초기에 실행되는 컨테이너이다.

init 컨테이너 실행  > 어플리케이션 컨테이너 시작 순이 되겠다.


2

 configmap  환경변수 관리를 관리가 가능하다.

이미지를 여러개 만들 필요 없이  1개 이미지 쓰고 나머지는  configmap  환경변수로 관리하자


3

secret  -  정보 저장용 으로 사용 한다.

보안은 되지 않는다.

사용하지 말자. 



다음 과정

https://brunch.co.kr/@topasvga/1674


감사합니다.      

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari