하지만, pod definition file이 많다면 query files 내에 저장된 environment data 관리에 어려움이 있다. 그래서, 이 configuration들을 묶어 pod-definition 파일 밖에서 ConfigMap과 Secrets 파일을 만든다.
1. ConfigMap: 일반적인 plain text를 별도의 파일에 저장. pod가 생성될 때, ConfigMap이 pod 내부로 추가되고, 해당 파일에 있는 환경 변수들을 사용할 수 있다.
1) ConfigMap의 두 가지 phase
(1) Create ConfigMaps - imperative way (command로 생성. file 미작성)
컨테이너는 OS를 점유하지 않고 특정한 task나 process를(ex.webserver, app server, db) 실행하기 때문에, task가 완료되면 컨테이너는 exit 된다.
즉, 컨테이너는 프로세스가 동작중일 때만 살아있는다. 예를 들어, 컨테이너 내부의 web server가 중지되거나 crash되면, 컨테이너도 종료된다. (위 그림을 보면, ubuntu를 run했으나 곧내 Exit 된걸 볼 수 있다)
그럼, 컨테이너 내에서 어떤 프로세스가 구동될지는 누가 정의할까?
docker file을 보면(여기서는 nginx), 'CMD'(=command)라는 instruction을 볼 수 있다. 즉, 해당 프로그램이 컨테이너가 시작되면, 컨테이너 내에서 구동될 것이라는 것을 의미한다. mysql에는 mysqld가 있다.
Ubuntu 파일의 docker file도 보면, 'bash' 라는 default cmd가 있다. 그런데, bash는 webserver와 db와 같은 프로세스가 아니라 쉘이다. * shell: 터미널로부터 input을 listen. 없으면 종료.
우리가 우분투 컨테이너를 생성할 때,
docker는 우분투 img로부터 container를 생성하고, bash program을 구동한다. 그런데, 기본적으로 docker는 터미널이 포함되어 있지 않기 때문에,
bash program은 터미널을 찾을 수 없고, 이내 프로세스는 시작되자마자 종료될 것이다.
1. 'docker run' command
: 컨테이너가 생성되자마자 종료되지 않기 위해서는 어떻게 해야할까?
sleep 5초를 줘보자. # docker run ubuntu sleep 5 // ubuntu 컨테이너를 시작할 때, sleep program을 함께 구동, 5초간 기다렸다가 exit
* 그런데 이것은 일시적인데... 어떻게 영구적으로 적용할까? 새 커멘드를 만들면 된다.
docker build -t ubuntu-sleeper docker run ubuntu-sleeper
단, CMD에는 항상 키와 값을 따로따로 써줘야 한다.
ex. ["sleep", "5"] // ["sleep 5"]하면 안됨
그럼 value(값)를 바꾸고 싶다면? ENTRYPOINT로 명령어를 수행하고, CMD를 통해 매개변수 값을 입력한다.
런타임에 ENTRYPOINT를 sleep2.0으로 수정하고 싶다면? entry point option을 사용해서 override할 수 있음. # docker run --entrypoint sleep2.0 ubuntu-sleeper 10
그럼 위의 설정은 YAML에 어떻게 입력 할까? args:가 CMD에 있는 매개변수 값으로, args에 value를 입력해준다. 그리고 ENTRYPOINT가 command: 이다. (Entrypoint를 수정하고 싶다면, YAML에 위와 같이 "sleep2.0"으로 바꿔도 된다)
출처: Udemy 사이트의 Certified Kubernetes Administrator (CKA) with Practice Tests 강의
이때까지 배운 내용을 한 번에 모아 실습하는 내용이다. 투표시스템(voting app)을 만드는데, 총 5개의 POD를 생성한다. 먼저 첫 번째 목표는 1. Deploy Containers, 2. Enable Connectivity, 3. External Access.
1. Deploy Containers 1) voting-app: user가 투표하는 앱 2) redis: user가 투표한 내역을 저장하는 db 3) worker: redis에 저장된 투표내역 + db 업데이트를 위해 전달하는 앱 4) PostGresSQL db: persistant DB, 최종 결과가 업데이트되는 db 5) result-app: 결과를 띄워주는 앱 Demo 영상에서 각 pod들의 yaml 파일을 작성하는데, 영상은 화면캡쳐가 막혀있어서 제외한다.
2. Enable Connectivity 각 pod는 다른 Node에 있을 수도 있는데, 서로간 통신을 어떻게 할까? 이전에 배웠던 Service를 통해 진행한다! 그럼, Pod뿐만 아니라, Service를 위한 YAML도 별도로 만들어야 한다. 여기서 사용하는 Service Type은, 내부 통신이므로 Cluster IP 타입이다.
3. External Access 그럼 외부에서 접근하기 위해서는? 외부에서 접근이 필요한 app은 두 가지. voting-app과 result-app. 따라서, 이 두 가지 pod를 위해 NodePort type의 Service를 생성한다.
즉, 여기까지 정리하자면 pod는 총 5개, Service는 4개가 생성된다. * Service는 Cluster IP 타입이 2개(redis, PostGresSQL), NodePort 타입이 2개(voting-app, result-app)이다.
그런데, 위와 같이 생성하면 pod가 각 1개였기 때문에, 하나라도 죽는 경우 통신이 불가한 문제가 있다. 따라서, Deployment를 통해 여러 개의 pod를 띄워준다.
아래는 실습 중에 진행했던 pod, service, deploy YAML인데, 각 pod당 비슷한 내용들이므로 voting-app에 대해 필요한 yaml만 1개씩 작성해보았다.
* voting-app의 pod, deployments, service YAML 파일 1. voting-app-pod.yaml