Software Workshop

K8s의 pod란?

K8s의 pod는 container가 여러 개 포함된 논리적 개념이라고 정의되어 있다.

파드(Pod) 는 쿠버네티스에서 생성하고 관리할 수 있는 배포 가능한 가장 작은 컴퓨팅 단위이다.
파드 (고래 떼(pod of whales)나 콩꼬투리(pea pod)와 마찬가지로)는 하나 이상의 컨테이너의 그룹이다. 이 그룹은 스토리지 및 네트워크를 공유하고, 해당 컨테이너를 구동하는 방식에 대한 명세를 갖는다. 파드의 콘텐츠는 항상 함께 배치되고, 함께 스케줄되며, 공유 콘텍스트에서 실행된다. 파드는 애플리케이션 별 "논리 호스트"를 모델링한다. 여기에는 상대적으로 밀접하게 결합된 하나 이상의 애플리케이션 컨테이너가 포함된다. 클라우드가 아닌 콘텍스트에서, 동일한 물리 또는 가상 머신에서 실행되는 애플리케이션은 동일한 논리 호스트에서 실행되는 클라우드 애플리케이션과 비슷하다.

유사점

이건 docker-compose.yml 파일 하나로 정의된 애플리케이션(서비스 집합)과 동일하다. 다음 yaml 파일을 살펴보자. 두 개의 서비스가 정의되어 있고 볼륨을 공유한다.

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의 형태로 존재할 때, 다음과 같은 구조를 가질 것이다.

node K8s_node {
	package pod1 {
  	agent container_web 
    agent container_admin 
  }
  database volume_html    
}
container_web --> volume_html: write
container_admin <-- volume_html: read

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 상에 존재하는 개념이기 때믄에 확장 가능하며 좀 더 요구사항에 적합한 자원 타입을 선택해서 사용할 수 있다.