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"]
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
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 push docker.io/sootoance/fortune:args
docker run -it docker.io/sootoance/fortune:args 15
보면 15초마다 가져오는 것을 알 수 있다.
- 쿠버네티스 파드에서 실행
https://github.com/luksa/kubernetes-in-action/blob/master/Chapter07/fortune-pod-args.yaml
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
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
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 프로덕션/개발에서 분리된 파드가 필요함
'모음 > [쿠버네티스 인 액션]' 카테고리의 다른 글
[쿠버네티스 인 액션] 8장. 애플리케이션 파드 메타데이터와 그 외의 리소스에 엑세스하기 (6) | 2024.10.09 |
---|---|
[쿠버네티스 인 액션] 7장. 컨피그맵과 시크릿 - 컨피그맵, 시크릿 + 참고영상 (0) | 2024.10.03 |
[쿠버네티스 인 액션] 6장.볼륨 - 퍼시스턴트볼륨과 퍼시스턴트볼륨클레임 +참고영상 (2) | 2024.09.29 |
[쿠버네티스 인 액션] 6장.볼륨 (2) | 2024.09.28 |
[쿠버네티스 인 액션] 5장.서비스 - 레디니스 프로브, 헤드리스 서비스, 서비스 해결 (0) | 2024.09.22 |