본문 바로가기

Kubenetes/ConfigMap & Secret

Configmap

[Configmap의 주요 기능]

 

- 명령행 인자를 통한 컨테이너에 명령어 전달

- 각 컨테이너에 대한 사용자 정의 환경 변수 설정

- 특별한 볼륨 타입을 통해 컨테이너에 설정 파일을 마운트

 

 

ㅁ 도커에서 명령어 인자 정의

 

 - Entrypoint와 CMD

   Entrypoint는 컨테이너가 시작됐을 때 호출돼야 할 실행 파일을 정의

   CMD는 Entrypoint로 전달할 인자를 지정

 

  이미지가 실행될 때 수행할 명령을 지정하기 위해 CMD 명령을 사용할 수 있지만 올바른 방법은 ENTRYPOINT를 사용해 실행 파일을 수행하고 기본 인자가 필요한 경우에만 CMD를 지정하는 것.

 

 

$docker run <image>

-->

$docker run <image> <arguments>

 

shell과 exec 형식간의 차이점

 

ㅁ shell 형식: ENTRYPOINT node app.js.

ㅁ exec 형식: ENTRYPOINT ["node", "app.js"]

 

[예제1. fortune  이미지에 설정 가능한 인터벌 만들기] fortune-args / fortuneloop.sh

 

#!/bin/bash
trap "exit" SIGINT
INTERVAL=$1
echo Configured to generate new fortune every $INTERNAL 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

 

 

[예제2. 업데이트된 fortune 이미지를 위한 도커 파일:fortune-args/Dockerfile]

 

FROM ubuntu:latest
RUN apt-get update ; apt-get -y install fortune
ADD fortuneloop.sh /bin/fortuneloop.sh
ENTRYPOINT ["/bin/fortuneloop.sh]                               #ENTRYPOINT 명령어 exel 형식
CMD ["10"]                                                                       #실행을 위한 기본 인자 실행을 위한 기본 값을 갖는 인자

 

 

도커 허브에 이미지를 빌드하고 푸시, 이미지를 최신 이미지 대신 인자로 태그 지정

 

$ docker build -t docker.io/luksa/fortune:args

$ docker push docker.io/luksa/fortune:args

 

도커가 로컬에서 실행해 이미지를 테스트

 

$ docker run -it docker.io/luksa/fortune:args

 

인자를 통해 기본 슬립 간격을 재정의

 

$ docker run -it odcker.io/luksa/fortune:args 15

 

 

 [사용자 정의 명령어와 인자를 명시하기 위한 Pod의 정의]

kind: Pod
spec:
    containers:
    - image: some/image
      command: ["/bin/command"]
      args: ["arg1", "arg2", "arg3"]
도커 쿠버네티스 설명
ENTRYPOINT Command 컨테이너 내부에서 실행되는 실행 파일
args 실행 파일에 전달된 인자

 

[사용자 정의 인터벌을 통해 fortune Pod 실행하기]

 

apiVersion: v1
kind: Pod
metadata:
    name: fortune2s                               #Pod의 이름을 변경
spec: 
    containers:
     - image: luksa/fortune:args              # fortune:latest 대신에 fortune: args 사용
        args: ["2"]                                       #2초마다 스크립트를 생성하는 인자
        name: html-generator
        volumeMounts:
        - name: html
           mountPath: /var/htdocs
...

 

 

컨테이너의 환경 변수 설정

 

[환경 변수를 통해 인터벌을 설정할 수 있는 fortune 이미지 만들기]

 

#!/bin/bash
trap "exit" SIGINT
echo Configured to generate new fortune every $INTERNAL seconds
mkdir =p /var/htdocs
while : 
do
    echo $(date) writing fortuen to /var/htdocs/index.html
    /usr/games/fortune > /var/htdocs/index.html
sleep $INTERNAL
done

 

[컨테이너 환경 변수 지정]

 

kind: Pod
spec:
    containers:
    - image: luksa/fortune:env
      env:
      - name: INTERNAL
         value: "30"
      name: html-generator
...

 

 

ㅁ ConfigMap 소개

 

쿠버네티스는 설정 옵션을 ConfigMap이라는 별도의 객체로 분리

이 객체는 간단한 문구부터 전체 설정 파일에 이르는 값을 갖는 키/값 쌍을 포함하는 Map

 

애플리케이션은 ConfigMap을 직접 읽거나 그것이 존재하는 것을 알 필요가 없음

맵의 내용은 대신 환경 변수 또는 볼륨의 파일로 컨테이너에 전달되고 환경 변수는 $(ENV_VAR)구문을 사용해 명령줄 인자에서 참조할 수 있다.

애플리케이션은 필요한 경우 쿠버네티스 REST API 엔드포인트를 통해 ConfigMap의 내용을 직접 읽을 수 있지만, 반드시 필요한 경우가 아니면 애플리케이션을 최대한 쿠버네티스에 종속적이지 않도록 유지해야 한다.

 

애플리케이션이 ConfigMap을 사용하는 방식에 관계없이 이와 같은 분리된 독립 실행형 객체를 설정하면 동일한 이름의 ConfigMap에 대해 각각 다른 매니페스트(개발, 테스트, QA)의 유지가 가능해짐

 

Pod는 이름으로 ConfigMap을 참조하기 때문에 각 환경에서 서로 다른 설정으로 사용할 수 있다.

 

 

ㅁ ConfigMap 생성

 

단일키가 있는 맵을 작성하고 이 맵을 사용해 이전 예제의 Interval 환경 변수를 채움

YAML을 게시하기 위해 일반적으로 사용했던 kubectl create -f 명령 대신 ConfigMap을 작성하는 전용 명령 kubectl create configmap을 사용

 

[kubectl create configmap 명령 사용]

 

$ kubectl create configmap fortune-config --from-literal=sleep-interval=25

 

여러개의 리터럴 엔트리를 포함하는 ConfigMap을 만들려면 --from-literal 인자를 여러개 추가

 

$ kubectl create configmap myconfigmap

     -- from-literal=foo=bar --from-literal=bar=baz --from-literal=one=two

 

 

ㅁ CofigMap의 Yaml 디스크립터를 보는 방법

 

$ kubectl get configmap fortune-config -o yaml

apiVersion: v1
data:
   sleep-interval: "25"
kind: ConfigMap
metadata:
    creationTimestamp: 2016-08-11T2:32:08Z
    name: fortune-config
    namespace: default
    resourceVersion: "910025"
    selfLink: /api/v1/namespaces/default/configmaps/fortune-config
    uid: 88c4165e-6002-11e6-a50d-42010af00237

$ kubectl create -f fortune-config.yaml

 

[파일 내용으로 ConfigMap 엔트리 생성]

 

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

 --> kubectl은 kubectl을 실행하는 디렉터리에서 config-file.conf 파일을 찾음

 --> 이 경우 파일 이름이 map의 key로 사용

 

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

 --> 이 경우 key = customkey, value = config-file.conf

 --> 리터럴과 마찬가지로 --from-file 인자를 여러번 사용해 여러 파일 추가 가능

 

[디렉토리에 있는 파일로부터 ConfigMap 만들기]

 

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

 

[옵션 결합]

 

CofigMap을 만들 때 지금까지 언급한 모든 옵션 조합 가능

 

$ kubectl create configmap my-config \

    --from-file=foo.json                         \     # 단일 파일

    --from-file=bar=foobar.conf           \      # 사용자 정의 키 밑에 저장된 파일

    --from-file=config-opts/                 \      # 전체 디렉토리

    --from-literal=some=thing             \       # 리터럴 값

 

개별 파일, 디렉터리, 리터럴 값에서 ConfigMap 만들기

 

ㅁ 컨테이너의 환경 변수로 ConfigMap 엔트리 전달

 

[ConfigMap상의 환경 변수가 있는 포드: fortune-pod-env-configmap.yaml]

apiVersion: v1
kind: Pod
metadata:
    name: fortune-env-from-configmap
spec:
    containers:
    - image: luksa/fortune:env
      env:
      - name: INTERVAL                          # INTERVAL이라는 환경 변수를 설정
         valueFrom:
             configMapKeyRef:                   #.고정값을 설정하는 대신에 ConfigMap 키로부터 초기화함
                   name: fortune-config        # 참조하고 있는 ConfigMap의 이름
                   key: sleep-interval             # ConfigMap에서 이 키에 저장된 값으로 변수를 설정

환경 변수로서 ConfigMap 항목을 컨테이너에 전달하기

[ Pod에 존재하지 않는 ConfigMap의 참조]

 

Pod를 생성할 때 참조했던 ConfigMap이 없으면 존재하지 않는 ConfigMap을. 참조하는 컨테이너는 시작되지 않지만 다른 컨테이너들은 정상적으로 시작됨

그런 다음 누락된 ConfigMap을 생성하는 경우, 실패한 컨테이너는 Pod를 다시 생성할 필요 없이 시작 된다.

 

ㅁ ConfigMap의 모든 항목을 한번에 환경 변수로 전달

spec:
    containers:
    - image: some-image
      envFrom:                         # env대신에 envFrom을 사용
        - prefix: CONFIG_          # 모든 환경 변수는 CONFIG_ 의 접두어가 붙여짐
           configMapRef:            # my-config-map으로 불리는 ConfigMap을 참조
              name: my-config-map

 

ㅁ ConfigMap 항목을 명령행 인자로 전달

ConfigMap 항목을 명령행 인자로 전달

 

인자로 ConfigMap 항목을 사용하기: fortune-pod-args-configmap.yaml

apiVersion: v1
kind: Pod
metadata:
    name: fortune-args-from-configmap
spec:
    containers:
    - image: luksa/fortune:args        # 환경 변수가 아닌 첫번째 인자에서 interval을 사용하는 이미지 사용
      env:                                           # 환경 변수 정의하기
      - name: INTERVAL
         valueFrom: 
             configMapKeyRef:
                 name: fortune-config
                 key: sleep-interval
        args: ["$(INTERVAL)" ]            # 인자에 환경 변수를 참조하기
...

 

ㅁ ConfigMap 엔트리를 파일로 노출하기 위해 ConfigMap 볼륨 사용

 

[ConfigMap 생성] my-nginx-config.confg.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;
 }
}

 

ConfigMap-files 디렉터리의 내용과 파일

 

$ kubectl create configmap fortune-config --from-file=configmap-files

 

[파일로부터 생성된 ConfigMap의 YAML 정의]

 

$ 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
...