[kuber-study] Chapter7. ConfigMaps and Secrets (1)

jeonghyun yu·2022년 1월 28일
0

kuber-study

목록 보기
3/7
post-thumbnail

configuration을 저장하는 법

배포된 인스턴스 간에 다른 설정, 외부 시스템에 액세스하기 위한 자격 증명 등을 애플리케이션에 전달하는 방법이 필요하다.

  • 애플리케이션 command-line에 저장 -> ❌
  • 환경 변수로 저장 -> 🙆‍♀️, but 어디에?
    1) Docker 컨테이너 이미지에 저장 -> ❌
    2) gitRepo 볼륨에 저장 -> 🤷‍♀️
    3) ConfigMap -> 👍
    4) Secret -> 보안까지 👍


컨테이너에 command-line 인자 전달

이미지에 정의된 기본 명령만이 아닌 다른 명령을 실행하는 법

Docker에서 명령 및 인자 정의

컨테이너에서 실행되는 명령어는 command와 argument 두 부분으로 구성되어있다.

spec:
  containers:
  - name: command-demo-container
    image: debian
    command: ["printenv"]
    args: ["HOSTNAME", "KUBERNETES_PORT"]
  restartPolicy: OnFailure

ENTRYPOINT와 CMD

Dockerfile 명령어 정의 부분

  • ENTRYPOINT : 컨테이너가 시작할 때 호출되는 실행 파일
  • CMD : ENTRYPOINT에 전달되는 인자

docker run <image> or docker run <image> <arguments>

셸과 exec

  • shell : ENTRYPOINT node app.js
  • exec : ENTRYPOINT ["node", "app.js"]

명령이 셸 내부에서 호출되는지의 차이

$ docker exec -it e4bad ps x
 PID TTY STAT TIME COMMAND
 1   ?   Ss   0:00 /bin/sh -c node app.js
 7   ?   Sl   0:00 node app.js
 13  ?   Rs+  0:00 ps x
 
$ docker exec 4675d ps x
 PID TTY STAT TIME COMMAND
 1   ?   Ssl  0:00 node app.js
 12  ?   Rs   0:00 ps x

command-line 인자 전달 예제

fortune 이미지에서 실행 간격을 조정

  • fortuneloop.sh에 INTERVAL 추가
#!/bin/bash
trap "exit" SIGINT
INTERVAL=$1
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
  • Dockerfile에 기본 명령어와 인자 추가
FROM ubuntu:latest
RUN apt-get update ; apt-get -y install fortune
ADD fortuneloop.sh /bin/fortuneloop.sh
ENTRYPOINT ["/bin/fortuneloop.sh"] 
CMD ["10"] 
  • $ docker run -it <image>
$ docker run -it docker.io/luksa/fortune:args
Configured to generate new fortune every 10 seconds
Fri May 19 10:39:44 UTC 2017 Writing fortune to /var/htdocs/index.html
  • $ docker run -it <image> <arg>
$ docker run -it docker.io/luksa/fortune:args 15
Configured to generate new fortune every 15 seconds

컨테이너에서 command 및 arguments 재정의

kind: Pod
spec:
  containers:
  - image: some/image
    command: ["/bin/command"]
    args: ["arg1", "arg2", "arg3"]
  • ENTRYPOINT ~~ command
  • CMD ~~ args

예시

apiVersion: v1
kind: Pod
metadata:
  name: fortune2s 
spec:
  containers:
  - image: luksa/fortune:args 
    args: ["2"] 
    name: html-generator
    volumeMounts:
    - name: html
      mountPath: /var/htdocs
  • 배열, 나열 둘 다 가능 (숫자는 "", 문자열은 그냥 작성)
args:
- "2"
- foo


컨테이너의 환경변수

pod의 각 컨테이너에 대한 사용자 정의 환경 변수 목록을 지정할 수 있다.

  • fortuneloop.sh 에서 INTERVAL 초기화 부분 제거
#!/bin/bash
trap "exit" SIGINT
echo Configured to generate new fortune every $INTERVAL seconds
  • env 정의
kind: Pod
spec:
  containers:
  - image: luksa/fortune:env
    env: 
    - name: INTERVAL 
      value: "30" 
    name: html-generator

➕ 각 컨테이너에서는 동일한 네임스페이스에 있는 각 서비스의 환경 변수를 자동으로 노출한다.

기존 환경변수 참조

$(VAR) 구문을 사용하여 참조 가능

env:
- name: FIRST_VAR
  value: "foo"
- name: SECOND_VAR
  value: "$(FIRST_VAR)bar"

하드코딩한 환경변수의 단점

프로덕션과 개발 pod를 개별로 정의해야할 필요가 있을 때 설정을 분리해서 작성한다면 비효율적



0개의 댓글