모음/[쿠버네티스 인 액션]

[쿠버네티스 인 액션] 7장. 컨피그맵과 시크릿 - 컨테이너에 명령어 인수 전달, 각 컨테이너에 사용자 정의 환경변수 지정

ttoance 2024. 10. 2. 07:36

7.1 컨테이너화된 애플리케이션 설정 

- 일반적으로 명령줄 인수로 설정 넘겨주는 것으로 시작해서 옵션 목록이 커지면 파일에 저장하고 사용한다. 

- 컨테이너화된 애플리케이션에서는 설정을 애플리케이션에 전달할 때 환경변수를 사용한다. 왜 그럴까 ?

> 만약 파일에 저장할 경우, 설정 파일을 컨테이너 이미지 안에 포함하거나 파일이 포함돼 있는 볼륨울 컨테이너에 마운트 해야해서 어렵다.

> 또, 파일을 이미지 안에 넣고 빌드하는 것은 애플리케이션 소스코드에 설정 파일을 넣고 하드코딩하는 것과 동일하다. 

- 다른 방법으로는 최상위 레벨의 쿠버네티스 리소스에 저장하고 이를 기타 다른 깃 저장소 혹은 다른 파일 기반 스토리지에 저장하고 사용. 

 

▶ 정리하면, 다음 3가지 방법이 있다. 

1) 컨테이너에 명령줄 인수 전달 

2) 각 컨테이너를 위한 사용자 정의 환경변수 지정 

3) 특수한 유형의 볼륨을 통해 설정 파일을 컨테이너에 마운트 (*이중, 보안이 필요한 것은 시크릿 이라는 쿠버네티스에서 제공하는 다른 오브젝트 존재) 

 

 

7.2 컨테이너에 명령줄 인자 전달 

1) 사전지식 

- entrypoint과 cmd 

컨테이너에서 실행하는 전체 명령이 명령어와 인자 두 부분으로 구성돼 있다. 

> entrypoint : 컨테이너가 시작될 때 호출될 명령어 정의 

> cmd : entrypoint에 전달되는 인자 정의 

 

- 명령어는 두 가지 다른 형식을 지원한다. (shell형식과 exec형식)

> shell : entrypoint node app.js 

> exec : entrypoint ["node", "app.js"]

 

 

https://stackoverflow.com/questions/44316361/difference-between-docker-entrypoint-and-kubernetes-container-spec-command

 

Difference between Docker ENTRYPOINT and Kubernetes container spec COMMAND?

Dockerfile has a parameter for ENTRYPOINT and while writing Kubernetes deployment YAML file, there is a parameter in Container spec for COMMAND. I am not able to figure out what's the difference a...

stackoverflow.com

 

 

Dockerfile:

FROM alpine:latest
COPY "executable_file" /
ENTRYPOINT [ "./executable_file" ]

Kubernetes yaml file:

 spec:
    containers:
      - name: container_name
        image: image_name
        args: ["arg1", "arg2", "arg3"]

 

 

 

2) 실습

- fortune 이미지에서 간격 설정 

https://github.com/luksa/kubernetes-in-action/tree/master/Chapter07/fortune-args

 

kubernetes-in-action/Chapter07/fortune-args at master · luksa/kubernetes-in-action

Code from the Kubernetes in Action book. Contribute to luksa/kubernetes-in-action development by creating an account on GitHub.

github.com

 

fortuneloop.sh 

#!/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 build -t docker.io/sootoance/fortune:args .

docker build -t docker.io/sootoance/fortune:args .

 

docker push docker.io/sootoance/fortune:args

docker push docker.io/sootoance/fortune:args

 

 

docker run -it docker.io/sootoance/fortune:args 15

docker run -it docker.io/sootoance/fortune:args 15

 

보면 15초마다 가져오는 것을 알 수 있다. 

 

- 쿠버네티스 파드에서 실행 

https://github.com/luksa/kubernetes-in-action/blob/master/Chapter07/fortune-pod-args.yaml

 

kubernetes-in-action/Chapter07/fortune-pod-args.yaml at master · luksa/kubernetes-in-action

Code from the Kubernetes in Action book. Contribute to luksa/kubernetes-in-action development by creating an account on GitHub.

github.com

apiVersion: v1
kind: Pod
metadata:
  name: fortune2s
spec:
  containers:
  - image: sootoance/fortune:args
    args: ["2"]
    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
    ports:
    - containerPort: 80
      protocol: TCP
  volumes:
  - name: html
    emptyDir: {}

args 로 인자값 줄 수 있다. 

 

kubectl create -f fortune-pod-args.yaml
kubectl port-forward fortune 8080:80
curl http://localhost:8080

 

2초마다 바뀌는 것을 알 수 있다. 

 

 

7.3 컨테이너의 환경변수 설정 

- 컨테이너마다 환경변수를 줄 수 있다. 

 

 

- 환경변수 받아서 하도록 스크립트 수정 

https://github.com/luksa/kubernetes-in-action/blob/master/Chapter07/fortune-env/fortuneloop.sh

 

kubernetes-in-action/Chapter07/fortune-env/fortuneloop.sh at master · luksa/kubernetes-in-action

Code from the Kubernetes in Action book. Contribute to luksa/kubernetes-in-action development by creating an account on GitHub.

github.com

fortuneloop.sh

#!/bin/bash
trap "exit" SIGINT

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

자바로 작성된 경우, System.getenv("INTERNAL"), NodeJS 로 작성된 경우에는 process.env.INTERVAL, 파이썬으로 작성된 경우에는 os.environ['INTERVAL']을 사용하면 됨. 

 

 

Dockerfile

FROM ubuntu:latest

RUN apt-get update ; apt-get -y install fortune
ADD fortuneloop.sh /bin/fortuneloop.sh

ENTRYPOINT ["/bin/fortuneloop.sh"]

 

 

fortune-pod-env.yaml

https://github.com/luksa/kubernetes-in-action/blob/master/Chapter07/fortune-pod-env.yaml

 

kubernetes-in-action/Chapter07/fortune-pod-env.yaml at master · luksa/kubernetes-in-action

Code from the Kubernetes in Action book. Contribute to luksa/kubernetes-in-action development by creating an account on GitHub.

github.com

apiVersion: v1
kind: Pod
metadata:
  name: fortune-env
spec:
  containers:
  - image: luksa/fortune:env
    env:
    - name: INTERVAL
      value: "30"
    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
    ports:
    - containerPort: 80
      protocol: TCP
  volumes:
  - name: html
    emptyDir: {}

 

 

▶ 단점 

> 파드정의에 하드코딩된 값을 가져오는 것은 효율적

> but 프로덕션/개발에서 분리된 파드가 필요함 

 

 

반응형