pod 상황가정 1(Assumptions)
- 애플리케이션이 이미 개발되어 도커 이미지에 빌드되어있음
- 도커 허브와 같은 도커 리포지토리에서 K8s가 docker image 받아올 수 있음
- K8s 클러스터가 이미 설정되어 작동 중 - 단일 노드 설정 또는 다중 노드
가정 기반 pod
- 목적: 클러스터의 워커 노드로 구성된 머신 세트에 컨테이너 형태로 애플리케이션 배포
- K8s는 워커 노드에 컨테이너를 직접 배포하지 않음
- 컨테이너 -> pod(K8s 오브젝트로 캡슐화)
- pod는 애플리케이션의 단일 인스턴스, K8s에서 생성할 수 있는 가장 작은 오브젝트
단일 노드 클러스터: 간단한 경우
- 애플리케이션의 단일 인스턴스가 파드에 캡슐화된 단일 docker 컨테이너에서 실행
- 애플리케이션에 엑세스하는 사용자 수가 증가하여 애플리케이션을 확장해야하는 경우
- 부하를 공유하려면 웹 애플리케이션의 인스턴스를 추가해야함
- 추가 인스턴스를 어디에 스핀업?
- 동일한 포드내에서 새 컨테이너 인스턴스 불러오기? NO
- 동일한 애플리케이션의 새 인스턴스와 함께 새 파드 생성
- 애플리케이션의 두 인스턴스가 동일한 K8s 시스템 또는 노드에서 두 개의 별도 경로에서 실행
- 사용자 수가 더더 증가하여 현재 노드에 충분한 용량이 없다면?
- 언제든지 클러스터의 새 노드에 추가 파드를 배포
- 클러스터의 물리적 용량을 확장하기 위해 클러스터에 새 노드 추가
- 애플리케이션을 실행하는 컨테이너와 파드가 1대1 관계
- 정리
- 스케일업 -> 새 파드 생성
- 스케일 다운 -> 기존 파드 삭제
- 즉, 애플리케이션을 확장하기 위해 기존 파드에 컨테이너를 추가하지 않음
구현 방법과 컨테이너 간 로드 밸런싱 추후 강의에서 설명
멀티 컨테이너 pods
- pod는 일반적으로 컨테이너와 1:1 관계
- 하나의 포드에는 여러 개의 컨테이너가 있을 수 있음, 보통 다른 종류의 컨테이너로 이루어짐
- helper 컨테이너와 어플리케이션 컨테이너가 존재할 때 helper 컨테이너가 죽으면 같은 파드에 속한 컨테이너도 죽음(일심동체)
- 두 컨테이너는 동일한 네트워크 공간을 공유하기 때문에 서로를 로컬호스트라고 지칭(직접 통신 가능), 동일한 저장공간 공유 가능
pod 상황가정 2(Assumptions)
Dodcker host에 application을 배포하기 위한 프로세스 또는 스크립트를 개발 중이라 가정하자
! application 첫 배포
docker run python-app
## docker로 간단하게 python app 명령을 사용하여 application 배포
## application <- access -> user
! 부하 발생
docker run python-app
docker run python-app
docker run python-app
docker run python-app
docker run python-app
## 부하 발생 시 명령어를 여러번 입력하여 부하 분산
! application 진화하면?
docker run python-app
docker run python-app
docker run python-app
docker run python-app
docker run python-app
docker run helper -link app1
docker run helper -link app2
docker run helper -link app3
docker run helper -link app4
docker run helper -link app5
- helper 컨테이너는 application 컨테이너와 1:1 관계를 유지하므로 갯수 맞춰줘야함
- 링크와 사용자 지정 네트워크를 사용하여 직접 네트워크 연결 설정 필요
- 공유 가능한 볼륨 생성, 컨테이너 간 공유 필요
- app 컨테이너 필요 없어지면 helper 컨테이너도 필요 없으므로 종료해야함
- 이러한 작업은 K8s가 자동으로 수행함
Pod 배포 방법
kubectl run nginx
## 파드 생성, docker 컨테이너 배포 명령어
## K8s는 자동으로 파드 생성 -> nginx 도커 이미지 인스턴스 배포
- 이미지는 어디서 가져오나요?
- : 이미지 매개변수를 사용하여 이미지 이름 지정 필요
kubectl run nginx --image nginx
- 위 경우는 docker hub 리포지토리에서 다운로드
- 퍼블릭 docker hub 또는 조직내의 프라이빗 리포지토리에서 이미지를 가져오도록 K8s 구성 가능
Pod 목록 확인
kubectl get pods
- 클러스터의 파드 목록 확인하는데에 도움
- 생성 상태, 실행 상태 등 확인 가능
- 추후 네트워킹과 서비스에 대해 배우면 해당 서비스에 액세스할 수 있도록 설정 가능