셋업 가정
- 앱이 이미 개발되어 docker image 안에 빌드 되어 있음
- image가 docker hub 같은 docker registry에 저장되어 있어서 k8s가 다운로드 받을 수 있음
- k8s cluster 가 이미 설치되어 실행됨
- 단일 node, 다수의 node 환경이든 상관 없음
Pod
- k8s로 앱을 배포하는 것이 주 목적임
- cluster안의 worker node로 구성된 머신에 컨테이너 형태
- k8s는 worker node에 직접 container를 배포하지 않음
pod
라는 감싸진 형태로 k8s 안에 있게 됨
ex) k8s cluster 내부 상태
- 1개 node
- 1개 docker container
- 1개 앱
- 1개 Pod
-
이런 상태에서 사용자가 많아져 scale up 해야한다면?
-
어디에 앱을 추가해야 할까?
- Pod 1개를 새로 만들자
- node 1개 안에 분리된 Pod가 2개 생성됨
-
사용자가 더 늘어나서 현재 node에 pod를 더 추가할 수 없다면?
- 새 node를 만들어서 거기에 pod를 배포!
- cluster의 물리적인 용량이 충분하다면 cluster 안에 새 node를 만들 수 있음
- pod 안에 앱을 추가하는 게 아님
multi-container Pod
- pod 안에 무조건 앱 하나만 들어가야 하는 건 아님
- 서로 다른 기능을 하는 앱이라면 여러개의 container가 만들어질 수 있음
- ex) 어떤 앱을 도와주는 helper container가 필요할 수 있음
- 사용자가 입력한 데이터 처리, 사용자가 업로드 한 파일 처리 등
- 이런 경우 pod 안에 container를 더 생성할 수 있음
- 앱이 실행되면 helper도 실행되고 앱이 죽으면 helper도 죽음
- 두 container는
localhost
처럼 같은 network namespace를 공유해서 서로 통신함.
- 저장 공간도 공유 가능함
pod의 장점
- docker run으로 일일이 앱을 배포하고 나중에 helper 앱까지 배포하게 되는 경우
- 앱 - helper앱의 1대1 매칭을 기록하는 곳이 있어야 함
- 앱 간 네트워크, 스토리지 공유를 일일이 설정해야 함
- 만약 앱이 죽으면 helper를 수동으로 다운시켜야 함
- pod는 이런 일들을 알아서 해준다~
kubectl
명령어로 pod를 배포하는 방법을 알아보자
kubectl run nginx --image nginx
- 사실 이 명령어는 pod를 만들고 거기에 container를 배포하는 것임
- 앱의 이미지는 어디서 가져옴?
- 이미지 이름을
--image
옵션을 통해 이름을 적어야 함
- 그래서 dockerhub registry에서 nginx 이미지를 다운로드함
- pod가 만들어졌는데 pod의 목록은 어떻게 봄?
kubectl get pods
- pod의 이름과 상태를 확인
- status : ContainerCreating -> Running 으로 변경되어야 pod가 실행된 것
- 위의 명령어로 nginx를 만들었다면 node 밖의 사용자는 nginx에 접근할 수 없음(port 안뚫렸음)