본문 바로가기

Kubenetes/Kubernetes Pods

Pod 1 - (Pod 개요)

1. Pod의 필요성

 

- 여러 프로세스를 실행할 때 한개의 컨테이너보다 다수의 컨테이너가 더 적합

  ㅁ 컨테이너는 프로세스 자체가 하위 프로세스를 생성하지 않는 한 컨테이너당 하나의 프로세스만 실행하도록 설계

  ㅁ 다양한 프로세스들이 상호 관리를 통해 지원하는 환경을 구성할 경우(Web Process, Log 저장용 프로세스, Scheduling 프로세스 등) 하나의 컨테이너에서 수행이 어려울 수 있다.

 

2. Pod

 

 - 여러 개의 프로세스를 하나의 컨테이너로 묶으면 안 되기 때문에 컨테이너를 단일 단위로 관리할 수 있는 상위 레벨 구조가 필요

 

[동일한 포드의 컨테이너 사이의 부분 격리]

 

 - 쿠버네티스는 도커를 구성하여 각 컨테이너가 자체 세트를 가지고 있는 대신 모든 Pod Container가 동일한 Linux Namespace 세트를 공유하도록 함으로써 격리 시킴

 - Pod의 모든 컨테이너는 동일한 네트워크 및 UTS Namespace에서 실행되기 때문에 모두 같은 호스트 이름 및 네트워크 인터페이스를 공유함.

 - Pod의 모든 컨테이너는 동일한 IPC Namespace 아래에서 실행되며 IPC를 통해 통신할 수 있다.(최신 K8S 및 도커 버전에서는 동일한 PID Namespace를 공유할 수 있지만 이 기능은 기본적으로 활성화 되어 있지 않다.)

 - 컨테이너 파일 시스템의 대부분은 컨테이너 이미지에서 나왔기 때문에 기본적으로 각 컨테이너의 파일 시스템은 다른 컨테이너와 완전히 분리되어 있지만 볼륨이라는 쿠버네티스 개념을 사용해 파일 디렉터리를 공유하도록 할 수 있다.

 

[컨테이너가 동일한 IP 및 포트 공간을 공유하는 방법]

 

- Pod의 컨테이너가 동일한 네트워크에서 실행되므로 Namespace의 경우 같은 IP 주소와 Port 공간을 공유한다는 것

- 즉, 동일한 Pod의 컨테이너에서 실행중인 프로세스는 동일한 Port 번호에 바인딩 되지 않도록 주의 해야 함. (포트 충돌 가능)

- 이 현상은 동일한 Pod의 컨테이너에게만 해당, 각 포드에는 별도의 Port 공간이 있으므로 다른 Pod의 컨테이너는 Port충돌을 일으킬 수 없다.

- Pod 내부의 모든 컨테이너에 역시 동일한 loopback Network Interface를 가지므로 컨테이너는 localhost를 통해 동일한 Pod에서 다른 컨테이너와 통신할 수 있다.

 

[플랫 Inter Pod Network 소개]

 

 쿠버네티스 클러스터의 모든 Pod는 한개의 플랫과 공유 공간, 네트워크 주소 공간에 위치하며 이는 모든 Pod가 다른 포드의 IP 주소에 있는 다른 모든 Pod에 액세스 할 수 있음을 의미한다.

플랫 네트워크

3. 컨테이너를 Pod 전체에 적절하게 구성하기

 

Pod를 각각 별도의 머신으로 생각할 수 있지만 개별의 Pod는 특정 애플리케이션만 호스팅한다.

Pod가 상대적으로 가볍기 때문에 오버헤드가 거의 없이 만든 포드를 사용할 수 있기 때문에 Pod 하나에 모든 것을 채워 넣는 대신 여러 개의 Pod를 하나의 Pod로 구성해야 함

 

[다수의 Pod로 멀티티어 애플리케이션 분할하기]

 

- 두개의 컨테이너가 있는 단일 Pod에서 프론트엔드 서버와 데이터베이스가 모두 실행 되는 것을 막을 수는 없지만, 좋은 방법은 아니다. 

- 프론트엔드와 백엔드가 모두 동일한 포드에 있으면 둘 다 항상 동일한 시스템에서 실행된다.

- 따라서 Pod를 두개로 분할하면 쿠버네티스가 하나의 노드에서 프론트엔드와 다른 노드의 백엔드를 스케줄링할 수 있으므로 인프라의 활용도가 향상된다.

 

[각각 스케일링이 가능한 Pod로 분할]

 

하나의 Pod드에 두가지를 넣지 말아야 하는 또 다른 이유는 스케일링이다.

- Pod는 스케일링의 기본 단위

- 쿠버네티스는 개별 컨테이너를 수평으로 확장할 수 없기 때문에 전체 Pod의 크기를 조정

- Pod가 프론트앤드와 백엔드 컨테이너로 구성된 경우, Pod인스턴스의 수를 두개로 늘리게 되면 결국 두개의 프론트엔드 컨테이너와 두 개의 백언드 컨테이너로 구성된다.

 

[하나의 Pod에서 다수의 컨테이너의 사용 시점]

 

- Pod의 기본 컨테이너는 특정 파일 디렉터리의 파일을 제공하는 웹 서버일 수 있으며, 추가 컨테이너(사이드카 컨테이너)는 주기적으로 외부 소스의 컨텐츠를 다운로드해 웹 서버의 디렉터리에 저장

- 사이드카 컨테이너의 종류로는 로그 로테이션 및 수집 장치, 데이터 프로세서, 통신 어댑터 등이 있음.

 

[Pod에서 다수의 컨테이너를 사용할 때 결정할 사항]

 

컨테이너를 Pod로 그룹화할. 때 아래와 같은 기준으로 단일 Pod 또는 두 개의 분리된 Pod 중 어디에 넣을지 결정

 ㅁ 컨테이너가 같이 실행돼야 할 필요가 있거나 혹은 다른 호스트에서 실행할 수 있는가?

 ㅁ 컨테이너가 단일화된 전체를 표현하거나 혹은 컴포넌트가 독립적인가?

 ㅁ 함께 혹은 개별적으로 컨테이너의 크기가 조정돼야 하는가?

 

기본적으로 특별한 이유가 있어서 동일한 Pod에서 컨테이널르 실행하는 상황이 아니라면, 항상 별도의 Pod에서 컨테이너가 실행되게 해야 함.

컨테이너에서 여러 프로세스를 실행하면 안됨, 즉 한개의 Pod에는 동일한 시스템에서 실행하지 않아도 되는 여러 컨테이너가 포함되면 안됨.