K8s의 pod는 container가 여러 개 포함된 논리적 개념이라고 정의되어 있다.
파드(Pod) 는 쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위이다.
파드 (고래 떼(pod of whales)나 콩꼬투리(pea pod)와 마찬가지로)는 하나 이상의 컨테이너의 그룹이다. 이 그룹은 스토리지 및 네트워크를 공유하고, 해당 컨테이너를 구동하는 방식에 대한 명세를 갖는다. 파드의 콘텐츠는 항상 함께 배치되고, 함께 스케줄되며, 공유 콘텍스트에서 실행된다. 파드는 애플리케이션 별 "논리 호스트"를 모델링한다. 여기에는 상대적으로 밀접하게 결합된 하나 이상의 애플리케이션 컨테이너가 포함된다. 클라우드가 아닌 콘텍스트에서, 동일한 물리 또는 가상 머신에서 실행되는 애플리케이션은 동일한 논리 호스트에서 실행되는 클라우드 애플리케이션과 비슷하다.
K8s의 pod는 여러 컨테이너로 구성될 수 있으며 하나의 주요 자원을 공유하고 같은 노드에 함께 배치되는 논리적 단위이다. 그러므로 docker-compose로 정의된 애플리케이션과 매우 유사하며 같은 수준에 놓고 볼 수 있다.
다음 docker-compose 정의를 살펴보자. 두 개의 서비스가 정의되어 있고 볼륨을 공유한다.
version: "3"
services:
web:
image: terzeron/mywebservice:latest
ports:
- "8081:3001"
volumes:
- data:data
admin:
image: terzeron/myadminservice:latest
ports:
- "8082:3002"
volumes:
- html:html
volumes:
html:
K8s에 pod의 형태로 존재할 때, 다음과 같은 구조를 가질 것이다.
pod를 정의하는 deployment.yaml를 작성한다면 다음과 비슷할 것이다.
spec:
template:
metadata:
labels:
app: myservice
spec:
containers:
- name: web
image: terzeron/mywebservice:latest
volumeMounts:
- mountPath: /html
name: htmlfiles
- name: admin
image: terzeron/myadminservice:latest
volumeMounts:
- mountPath: /html
name: htmlfiles
그럼, K8s의 pod와 docker-compose로 정의된 애플리케이션은 동일한 것인가? 그렇지 않다. docker-compose 애플리케이션은 단일 노드로만 구성 가능하며, 확장성이 없다. 컨테이너 단위의 서비스를 의존성으로 정의하기는 쉽지만 docker-swarm이나 K8s처럼 확장하기가 어렵다. 반면에, K8s의 pod는 docker-compose 애플리케이션과 동일한 개체들을 모두 수용하지만 K8s 상에 존재하는 개념이기 때문에 확장 가능하며 좀 더 요구사항에 적합한 자원 타입을 선택해서 사용할 수 있다.