본문 바로가기
Programming/Kubernetes

[Kubernetes] Kubernetes in action - Pod

by guru_k 2021. 12. 1.
728x90
반응형

Pod은 Component들을 구성하는 가장 최소 단위로 하나의 Pod 안에 여러 Container들을 구성할 수 있다.

하나의 Pod안에 구성된 Container들은 같은 노드에 구성되며 두개의 노드에 분산되어 배포될 수 없다.

하나의 컨테이너에 여러 Process를 넣는거보다 멀티 컨테이너를 운용하자.

하나의 컨테이너에 여러 Process로 구성할 경우 Process간에는 IPC를 통해 통신하거나 로컬환경에 파일을 저장하여 통신할 수 있다. 이럴 경우 각 Process들은 같은 컨테이너에 구성되어야 하며 각각 격리된 머신에 구성되게 된다.

컨테이너의 기본적인 디자인은 하나의 프로세스는 하나의 컨테이너에 구동된다는 컨셉을 가지고 있다. 이 경우에 장점은 크래시가 발생할 경우 각각의 프로세스를 자동적으로 재시작할 수 있는 점이다. 그리고 만약에 많은 프로세스가 하나의 컨테이너의 구동될 경우 같은 standard output으로 인해 프로세스에서 문제 해결을 위한 로그를 찾는것이 매우 힘들 것이다.

따라서 하나의 컨테이너에 하나의 프로세스를 구동하는 것이 좋으며 이것이 docker 와  kubernetes가 사용되는 방법이다.

컨테이너들의 ip 와 Port 공유

하나의 Pod 안에서 여러 컨테이너들은 같은 ip를 가지게 되며 Port를 공유하므로 여러 프로세스가 같은 Port를 바인딩할 수 없습니다. 그러나 이경우는 같은 Pod에 구성된 여러 컨테이너들에 해당하며 각각 다른 Pod의 구성된 컨테이너들은 절대 Port 충돌이 일어나지 않는다.

 

Pod들에 컨테이너를 적절하게 구성하기

Multi-tier app들을 여러 Pod들로 쪼개기

Frontend Server와 Database 두개의 컨테이너들을 하나의 Pod에 사용하고 있다면 이것은 매우 잘못된 사용의 예이다. 같은 Pod의 구성된 컨테이너들은 항상 같은 노드에 구동되게 된다. 만약에 현재 두개의 노드를 가진 클러스터를 가지고 있다고 했을 때 하나로 구성된 Pod를 구동하면 이 Pod은 하나의 노드에 구동되게 되고 다른 노드의 자원은 유휴 자원이 되며 효율적인 관리가 불가능하다. 그래서 각 App을 쪼개서 두개의 Pod으로 구동하면 각각의 노드에 분배되어 구동이 되고 인프라 자원을 효율적으로 관리할 수 있게 된다.

Scaling을 위한 여러 Pod들로 쪼개기

우리가 여러개의 Pod들로 쪼개야 하는 다른 이유는 스케일링이다. 일반적으로 Frontend Server과 Database 는 다른 스케일링 조건을 가지고 있다. 전반적으로 Frontend Server의 스케일링이 더 잦을 것이고 Database의 스케일링은 일반 Webserver 보다 훨씬 어려운 작업이다. 이처럼 하나의 Pod에 Frontend Server와 Database가 모두 존재하는 경우는 각각 개별적으로 스케일링이 불가능하기 때문에 각각을 별도의 Pod으로 구성해놓고 스케일링 작업을 진행하여 유연한 서버 환경을 구성할 수 있다.

여러 컨테이너를 하나의 Pod에 구성하는 경우

여러 컨테이너를 하나의 Pod에 구성하는 경우가 있다. 사이트카 컨테이너와 같이 메인 컨테이너에 영향이 없는 컨테이너를 구성하여 Pod의 상태를 좀더 유연하게 만드는 방법이다. 예로는 사이드카로 logstash나 fluentd 와 같은 log agent를 사이드카 컨테이너로 구성하여 로그를 외부로 보낼 수 있다.

여러 컨테이너를 하나의 Pod으로 구성할 때 고려해야할 것들

여러 컨테이너를 하나의 Pod으로 구성하려고 할때 아래와 같은 것들을 고려해볼 수 있다.

  • 여러 컨테이너들이 하나의 호스트에 구동이 되어야 하는가? 아니면 여러 호스트에 구동이 될 수 있는가?
  • 하나의 독립체로 표현될 수 있는가? 아니면 각각의 독립적인 컴포넌트로 표현되는가?
  • 각각 별도의 스케일링이 필요한가? 아니면 다같이 스케일링이 가능한가?

 

 

 

728x90
반응형

댓글