[pod는 무엇인가?]
pod는 쿠버네티스에서 배포할 수 있는 가장 작은 단위의 객체입니다. 한 개 이상의 컨테이너와 볼륨(스토리지), 네트워크 속성을 가집니다. 파드로 인해 쿠버네티스는 다른 컨테이너 오케스트레이션 툴과 다른 점을 갖게 됩니다. 파드가 있기 때문에 쿠버네티스는 컨테이너를 직접 실행하지 않습니다.
대신에 하나 이상의 컨테이너를 그룹으로 묶어서 구조화한 pod로 관리합니다. 하나의 pod로 같은 그룹에 포함된 컨테이너들은 네트워크, IPC, 볼륨을 공유합니다. 이렇게 pod에 속한 컨테이너는 스토리지와 네트워크를 공유하고 서로 같은 로컬호스트(localhost)로 접근이 가능합니다. (pod 별로 로컬호스트는 다르게 구분되어 있습니다.) 컨테이너를 하나만 사용하는 경우라도 반드시 pod로 감싸서 관리합니다. 간단히 pod를 생성하기 위한 yaml 파일은 아래와 같습니다.
$ vi pod-mock.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-mock
labels:
app: nginx
spec:
containers:
- name: ubuntu
image: ubuntu
command: ["echo"]
args: ["This is mock test"]
kubectl create -f pod-mock.yaml
[pod를 멀티컨테이너로 구성해도 되는가?]
pod는 하나 이상의 컨테이너로 구성이 가능합니다. 다만 멀티 컨테이너로 구성하는 것은 주의가 필요합니다. pod를 복제하면 개별의 컨테이너의 요구 사항과 관계없이 확장이 필요하며, 이는 자원 낭비로 이어질 수 있기 때문입니다.
pod는 가능한 한 작게 유지해야 합니다. 주 프로세스와 단단히 연결된 헬퍼 컨테이너(helper container)를 운영하는 것이 권장되는 방법입니다. 헬퍼 컨테이너는 "사이드카 패턴"으로도 불립니다.
pod는 모든 컨테이너가 healthy 하지 않으면 구동 준비가 되지 않은 상태라고 판단합니다. 따라서 하나의 pod 안에 unhealthy 한 컨테이너와 healthy 한 컨테이너는 동시에 존재할 수 없습니다. 만일 구동 중인 pod 내에서 하나의 컨테이너라도 unhealthy 상태가 되면 pod 배포는 실패하게 됩니다.
[pod 구성 패턴 - 사이드카 패턴과 앰버서더 패턴]
(1) 사이드카 패턴: 메인이 되는 컨테이너 옆에 보조 역할을 하는 컨테이너를 배치하는 구성입니다. 즉, 기존에 사용하려 했던 메인 컨테이너의 기능을 확장하거나 강화하는 용도의 컨테이너를 추가하는 패턴입니다.
가령 메인 처리를 수행하는 컨테이너가 남긴 로그를 다른 컨테이너에서 로그 수집 서버로 토스하여 전송할 수 있습니다. 이렇듯 메인 처리하는 애플리케이션 안에 보조 기능을 구현하면 애플리케이션은 복잡해집니다. 이때 사이드카 패턴을 사용하여 복잡도를 낮춰 메인 처리를 단순화하여 구현할 수 있습니다.
또한, 보조 기능을 다른 컨테이너로 분리하면 사이드카 부분의 재사용이 쉬워진다는 장점도 있습니다.
(2) 앰버서더 패턴 : pod와 외부 통신 구조 사이에 proxy 컨테이너를 배치하여 통신에 보조 역할을 구성합니다.
메인 처리를 실행하는 컨테이너가 외부 시스템에 접속하게 되는 경우, 또는 다른 컨테이너가 프록시 되어 목적지를 할당하거나 요청이 제대로 처리되지 않을 때 재시도를 수행합니다.
이런 방식으로 pod의 트래픽을 보다 세밀하게 제어할 수 있습니다. 트래픽을 세밀하기 제어하기 위한 오픈소스인 istio를 보면 pod마다 프록시를 추가해서 트래픽 처리하도록 구성되어있는 것을 알 수 있습니다.
[참고링크]
댓글