on
쿠버네티스 기본 오브젝트 - Pod
시작하기에 앞서
이 글은 쿠버네티스의 기본 오브젝트를 정리한 글입니다. 도커에 대한 선수지식이 있다는 가정 하에 진행됩니다.
Pod
파드(Pod)1는 쿠버네티스 오브젝트 중 하나로, 하나 이상의 컨테이너 그룹으로 구성되어 있는 쿠버네티스 애플리케이션의 가장 작은 컴퓨팅 단위이다. 파드 안 컨테이너들은 그룹 단위로 스케쥴되어 함께 실행되고 중지되어야 하고, 동일한 물리 머신에서 실행되어야 한다.
대부분 고급 애플리케이션은 하나의 파드에 여러 개의 컨테이너가 들어있지만, 단일 컨테이너로 이루어진 파드도 있다. 이러한 파드를 만드는 이유는 리소스를 보다 효율적으로 사용하기 위해서이다.
Pod는 다음과 같은 특징들을 가진다.
- 1개 이상의 컨테이너 실행
- Pod는 하나 이상의 컨테이너를 가질 수 있는데, 보통은 하나의 파드에 한 개의 컨테이너를 실행한다. 상황에 따라서 2개, 많게는 3개까지 컨테이너를 실행하는데 이론 상으로 3개 이상도 가능하지만 실질적으로 3개 이상 넘어가는 경우는 거의 없다.
- 동일 노드에 할당
- 파드 내에 실행되는 컨테이너들은 반드시 동일한 노드에 할당되며 동일한 생명 주기를 가진다. 파드가 삭제 될 때, 파드 내의 모든 컨테이너가 함께 삭제된다.
- 고유 IP
- 파드 리소스는 노드 IP와 별개로 클러스터 내에서 접근 가능한 고유 IP를 할당받는다. 도커 컨테이너의 경우 다른 노드에 위치한 컨테이너 간의 통신을 위해 포트 포워딩을 이용하여 노드 IP와 포워드 포트를 이용하여 접근한다. 쿠버네티스에서는 다른 노드에 위치한 파드에 접근할 때 고유한 IP를 이용하여 접근할 수 있다.
- IP 공유
- 파드 내에 있는 컨테이너끼리는 서로 IP를 공유한다. 같은 IP를 공유하기 때문에 localhost를 통해 접근이 가능하고 포트넘버를 이용하여 구분한다.
- Volume 공유
- 파드 안의 컨테이너들은 동일한 볼륨과 연결이 가능하다. 파일 시스템을 기반으로 서로 파일을 주고받을 수 있다.
Container
컨테이너에 대해서 조금 알아보자. 쿠버네티스는 컨테이너화된 워크로드와 서비스를 관리하기 위한 오픈소스 플랫폼으로, 최소 단위인 파드가 컨테이너의 그룹이다. 그렇다면 이 컨테이너란 무엇일까?
컨테이너란 호스트 OS 상에 논리적인 구획(컨테이너)를 만들고, 애플리케이션을 작동시키기 위해 필요한 라이브러리나 애플리케이션 등을 하나로 모아, 마치 별도의 서버인 것처럼 사용할 수 있게 만든 것이다.
보통 물리 서버 상에 설치한 호스트 OS의 경우 하나의 OS 상에서 움직이는 여러 애플리케이션이 똑같은 시스템 리소스를 사용한다. 같은 리소스를 공유하기 때문에 각 애플리케이션이 사용하는 미들웨어나 라이브러리가 서로에게 영향을 주지 않도록 주의해야 한다.
반면에 컨테이너 기술을 사용하면 각각의 애플리케이션이 시스템 자원을 해당 애플리케이션이 점유하고 있는 것처럼 보이게 할 수 있다.
Linux Container(LXC)
리눅스 컨테이너는 운영체제 수준의 가상화 기술로 리눅스 커널을 공유하면서 프로세스를 격리된 환경에서 실행하는 기술이다. 이게 무슨말이냐고? 쉽게 말해 리눅스 상에서 사용하는 컨테이너 환경을 LXC라고 한다. LXC는 리눅스 커널의 컨테이너 기능을 이용하기 위한 툴이나 API를 제공한다.
컨테이너는 namespace와 cgroups라는 리소스 관리 장치를 사용하여 분리된 환경을 만든다. 데이터 영역에서는 chroot를 사용하여 분리환경을 만든다.
이러한 분리 기술 덕분에 호스트 머신에서는 프로세스로 인식이 되지만, 컨테이너 관점에서는 마치 독립적인 환경을 가진 가상머신처럼 보일 수 있는 것이다.
리눅스 컨테이너의 특징은 다음과 같다.
- 운영체제 수준의 가상화
- 별도의 하드웨어 에뮬레이션 없이 리눅스 커널을 공유하여 컨테이너를 실행하며, 게스트 OS 관리가 필요하지 않다.
- 빠른 속도와 효율성
- 하드웨어 에뮬레이션이 없기 때문에 빠르게 실행된다. 프로세스 분리를 위해 약간의 오버헤드가 있지만, 일반 프로세스와 실행 속도 차이가 거의 없다. 또한 하나의 머신에서 프로세스만큼 많이 실행할 수 있다.
- 높은 이식성
- 모든 컨테이너는 독자적인 실행 환경을 가지고 있고, 이 환경은 파일들로 구성되어 이미지 형식으로 공유된다. 리눅스 커널을 사용하고 같은 컨테이너 런타임을 사용한다면 이미지를 사용하여 컨테이너의 실행환경을 공유하고 쉽게 재현할 수 있다.
- 상태를 가지지 않음
- 컨테이너 실행 환경은 독립적이기 때문에 다른 컨테이너에게 영향을 주지 않는다. 도커와 같은 이미지 기반으로 컨테이너를 실행하는 경우 특정 실행 환경을 쉽게 재사용할 수 있다.
Label
레이블 시스템은 쿠버네티스에서 중요한 메커니즘 중 하나이다. label(레이블)은 파드와 같은 오브젝트에 첨부된 키와 값의 쌍으로 오브젝트의 특성을 식별하는데 사용되어 사용자에게는 중요하지만 코어 시스템에 직접적인 의미는 없다. 그렇다면 왜 중요할까?
레이블로 오브젝트의 하위 집합을 선택하고, 구성하는데 사용하기 때문이다. 레이블을 이용하면 사용자가 느슨하게 결합한 방식으로 조직 구조와 시스템 오브젝트를 매핑할 수 잇으며, 클라이언트에 매핑 정보를 저장할 필요가 없다. 레이블은 오브젝트를 생성할 때 붙이거나 생성한 후 붙이거나 언제든지 수정이 가능하다.
파드에 레이블을 부여하는 방법은 크게 2가지 인데, 하나는 label 명령을 이용하는 방법이고 다른 하나는 선언형 명령을 이용, YAML 정의서를 작성할 때 직접 레이블을 추가하는 방법이다.
Node Schedule
기본적으로 사용자가 별도의 선택 없이 파드를 생성하면 쿠버네티스 마스터가 어떤 노드 위에서 실행할지 판단하여 스케줄링한다. 쿠버네티스는 클러스터링 시스템이기 때문에, 사용자가 매번 노드를 선택할 필요 없이 쿠버네티스가 파드 스케줄링을 관리한다.
간혹, 특정 노드(혹은 노드 그룹)를 명시적으로 선택해서 실행시켜야 할 수도 있다. 이런 경우 nodeSelector라는 property를 이용하여 노드를 선택할 수 있다.
Reference
1 : 파드는 고래의 무리를 의미한다고 한다.
Comments
KUBERNETES 의 다른 글
-
쿠버네티스 기본 오브젝트 - Volume 12 Aug 2021
-
쿠버네티스 기본 오브젝트 - Service 07 Aug 2021
-
쿠버네티스 기본 오브젝트 - Pod 06 Aug 2021