쿠버네티스 파드(Pod)는 오픈소스 컨테이너 스케줄링·오케스트레이션 환경인 쿠버네티스(Kubernetes)에서 배포 가능한 가장 작은 컴퓨팅 단위입니다.
파드의 기본 개념
파드는 함께 동작하는 하나 이상의 컨테이너 묶음입니다. 파드는 노드(Node) 위에 상주하며, 하나의 노드에 여러 파드가 함께 존재할 수 있습니다. 각 파드 내부의 컨테이너들은 해당 호스트 노드가 제공하는 네트워크와 스토리지 리소스를 공유하고, 컨테이너가 실행되는 방식을 정의하는 사양 역시 공유합니다.
'파드'라는 이름은 완두콩 꼬투리처럼 자연 속의 꼬투리와 유사하게 기능하도록 설계되었음을 표현한 비유적 명칭입니다. 하나의 파드에 여러 컨테이너를 담을 수 있지만, 실제로는 각 파드에 컨테이너 하나, 혹은 긴밀하게 통합된 소수의 컨테이너만 배치하는 것이 일반적입니다.
파드의 스케줄링과 격리
파드의 구성 요소들은 함께 스케줄링되고 함께 배치되며, 애플리케이션 전용의 논리적 호스트를 모델링합니다. 따라서 쿠버네티스 사용자는 긴밀하게 통합된 애플리케이션 컨테이너들을 하나의 파드에 함께 배치해야 합니다. 컨테이너 기술이 없었다면 이러한 애플리케이션이나 서비스들은 동일한 가상 머신 또는 물리 머신 위에서 실행되어야 했을 것입니다.
파드의 공유 컨텍스트는 리눅스 네임스페이스(Linux Namespaces)나 cgroups와 같은 격리 기술을 통해 설정됩니다. 개별 파드 내부에서는 단일 애플리케이션을 더 세분화하여 격리할 수도 있습니다.
환경 변수를 통한 정보 노출
운영자는 환경 변수를 활용해 파드, 노드, 컨테이너에 관한 정보를 노출할 수 있습니다. 파드 환경 변수는 파드 컨테이너 안의 애플리케이션에게 필요한 리소스의 위치나 컴포넌트 구성 방법을 알려주며, 이 정보는 런타임에 컨테이너로 주입됩니다. 노드에도 환경 변수가 존재하지만 이는 컨테이너에 노출되지 않으며, 쿠버네티스 환경 변수는 정적으로 정의되거나 사용자가 직접 작성합니다.
쿠버네티스 파드 관리
쿠버네티스는 도커(Docker) 컨테이너 런타임은 물론, Open Container Initiative 규격을 준수하는 런타임을 사용하는 CoreOS rkt와 CRI-O(Kubelet 컨테이너 런타임 인터페이스)도 지원합니다.
사용자가 직접 파드를 생성할 수도 있지만, 일반적으로는 고가용성 확보나 수평 확장(Horizontal Scaling)을 위해 쿠버네티스 컨트롤러가 파드와 그 복제본을 생성합니다. 예를 들어 사용자가 새 파드 인스턴스 세 개를 요청하면, 쿠버네티스는 세 개의 파드를 API 수준의 리소스로 생성합니다. 이후 스케줄러가 사용자의 정책에 따라 각 파드에 적합한 노드를 찾아 해당 위치에 파드를 배치합니다.
파드 내 컨테이너 간 통신
파드 내부의 컨테이너들은 공통 IP 주소와 포트 공간을 공유하므로, localhost를 통해 서로를 손쉽게 발견할 수 있습니다. 또한 같은 파드에 할당된 애플리케이션들은 파드에 연결된 공유 볼륨에 접근할 수 있습니다.
파드는 POSIX 공유 메모리나 SystemV 세마포어 같은 표준 통신 방식을 통한 컨테이너 간 통신도 지원합니다. 반면 서로 다른 파드에 속한 컨테이너는 IP 주소가 다르며 IPC 프로토콜을 사용할 수 없습니다. 하지만 쿠버네티스에서는 서비스(Service)를 통해 파드 간 통신이 매우 간편하게 이루어집니다. 예를 들어 애플리케이션의 프런트엔드가 한 노드의 파드에서 실행 중이라면, 백엔드는 같은 노드, 다른 노드, 혹은 여러 노드에 분산된 10개의 인스턴스 어디에나 존재할 수 있으며, 프런트엔드 파드는 단순히 백엔드 파드(들)을 대표하는 서비스에 연결하기만 하면 됩니다.
