본문 바로가기

카테고리 없음

쿠버네티스 구성 단위 정의

포드 : 컨테이너를 다루는 기본 단위

쿠버네티스는 셀 수도 없을 만큼 많은 리소스 종류와 컴포넌트가 존재합니다. 그중에서도 컨테이너 애플리케이션을 구동하기 위해 반드시 알아야 할 몇 가지 오브젝트가 있습니다. 그중 바로  레플리카셋, 서비스, 디플로이먼트 입니다. 그중 가장 기초가 되는 포드에 대한 개념으로 시작을 해보겠습니다.

포드 사용하기

쿠버네티스에서는 컨테이너 애플리케이션의 기본 단위를 포드라고 부르며, 포드는 1개 이상의 컨테이너로 구성된 컨테이너의 집합입니다. 포드는 쿠버네티스에서 가장 기초적이며 중요한 개념이기 때문에 반드시 이해하고 넘어가야 됩니다. 도커 엔진에서는 기본 단위가 도커 컨테이너였고, 스웜 모드에서의 기본 단위는 여러 개의 컨테이너로 구성된 서비스였습니다. 이와 비슷한 맥락으로 쿠버네티스에서는 컨테이너 애플리케이션을 배포하기 위한 기본 단위로 포드라는 개념을 사용하고 있습니다. 1개의 포드에는 1개의 컨테이너가 존재할 수도 있고, 여러 개의 컨테이너가 존재할 수도 있습니다. 간단한 예시를 들어 보겠습니다. 웹 서비스를 쿠버네티스에서 생성하려면 컨테이너와 포드를 어떻게 사용할 수 있을까요? 만약 같은 컨테이너를 여러 개 생성하고 싶다면 1개의 컨테이너가 들어 있는 같은 포드를 여러 개 생성하면 됩니다. 이처럼 포드는 컨테이너 애플리케이션을 나타내기 위한 기본 구성 요소가 됩니다. 

YAML 파일 해석

YAML 파일의 의미는 아래와 같습니다. 쿠버네티스의 YAML 파일은 일반적으로 apiversion,kind,metadata,sepc 네 가지 항목으로 구성됩니다.

① apiVersion : YAML 파일에서 정의한 오브젝트의 API 버전을 나타냅니다. 지금 당장은 크게 중요하지 않으며, 오브젝트의 종류 및 개발 성숙도에 따라 apiVersion의 설정값이 달라질 수 있습니다.

② kind : 이 리소스의 종류를 나타냅니다. 위의 YAML 파일에서 생성하려고 하는 것이 포드기 때문에 Pod를 입력했습니다. kind 항목에서 사용할 수 있는 리소스 오브젝트 종류는 KIND 항목에서 확인할 수 있습니다.

③ metadata : 라벨, 주석, 이름 등과 같은 리소스의 부가 정보들을 입력합니다. 

④ spec : 리소스를 생성하기 위한 자세한 정보를 입력합니다. 

YAML 파일은 kubectl apply -f 명령어로 쿠버네티스에 생성할 수 있습니다. 아래 명령어를 사용해 새로운 포드를 생성합니다.

$ kubectl apply -f nginx-pod.yaml

kubectl get <오브젝트 이름>을 사용하면 특정 오브젝트의 목록을 확인할 수 있습니다. 예를 들어, kubectl get pods 명령어는 현재 쿠버네티스에 존재하는 포드의 목록을 출력합니다. 방금 생성한 포드 1개가 출력될 것입니다.

$ kubectl get pods

kubectl describe 명령어를 사용하면 생성된 리소스의 자세한 정보를 얻어 올 수 있습니다. 예를 들어, 포드의 자세한 정보를 출력하고 싶다면 kubectl describe pods <포드 이름>처럼 명령어를 사용합니다. 쿠버네티스 외부 또는 내부에서 포드에 접근하려면 서비스라고 하는 쿠버네티스 오브젝트를 따로 생성해야 됩니다. 쿠버네티스 오브젝트는 kubectl delete -f 명령어로 쉽게 삭제할 수 있습니다.

$ kubectl delete -f nginx.pod·yaml

포드 vs 도커 컨테이너

위의 기능들만 본다면 포드는 docker run으로 생성한 단일 nginx 컨테이너와 크게 다르지 않아보기이 합니다. 포드는 컨테이너 IP 주소를 가지고 있어 쿠버네티스 클러스터 내부에서 접근할 수 있고, kubectl exec 명령어로 포드 컨테이너 내부로 들어갈 수도 있으며, kubectl logs 명령어로 포드의 로그를 확인할 수도 있기 때문입니다. 그렇다면 왜 쿠버네티스는 도커 컨테이너가 아닌 굳이 포드라는 새로운 개념을 사용하는 걸까요? 쿠버네티스가 포드를 사용하는 이유는 컨테이너 런타임의 인터페이스 제공 등 여러 가지가 있지만 이유 중 하나는 여러 리눅스 네임스페이스를 공유하는 여러 컨테이너를 추상화된 집합으로 사용하기 위함입니다. 

레플리카셋 : 일정 개수의 포드를 유지하는 컨트롤러

레플리카셋을 사용하는 이유

쿠버네티스의 기본 단위인 포드는 여러 개의 컨테이너를 추상화해 하나의 애플리케이션으로 동작하도록 만드는 훌륭한 컨테이너 묶음입니다. 그러나 YAML에 포드만 정의해 생성하게 되면 이 포드의 생애 주기는 어떻게 될까요? 예를 들어 앞서 생성했던, 2개의 컨테이너가 담겨 있는 포드는 다음의 두 가지 방법으로 삭제할 수 있습니다. kubectl delete 명령어로 포드를 삭제하면 그 포드의 컨테이너 또한 삭제된 뒤 쿠버네티스에서 영원히 사라집니다. 이처럼 YAML 파일에 포드만 정의해 생성할 경우 해당 포드는 오직 쿠버네티스 사용자에 의해 관리됩니다. 단순히 포드의 기능을 테스트하는 등의 간단한 용도로는 이렇게 포드를 사용할 수 있을지 모릅니다. 그렇지만 실제로 외부 사용자의 요청을 처리해야 하는 마이크로 서비스 구조의 포드라면 이러한 방식을 사용하기 어렵습니다. 스웜 모드에서 다뤘던 것처럼 마이크로 서비스에서는 여러 개의 같은 컨테이너를 생성한 뒤 외부요청이 각 컨테이너에 적절히 분배될 수 있어야 합니다. 쿠버네티스에서는 기본 단위가 포드기 때문에 같은 여러 개의 포드를 생성해 외부 요청을 각 포드에 분배하는 방식을 사용할 것입니다. 그렇다면 같은 여러 개의 포드를 어떻게 생성할 수 있을까요? 가장 간단한 방법은 다른 이름을 가지는 여러 개의 포드를 직접 만드는 방식이지만, 매우 비효율적인 방법일 것입니다. 이처럼 YAML 파일에 정의해 사용하는 방식은 여러 가지 한계점이 발생했기 때문에 리플리카셋이라는 쿠버네티스 오브젝트를 함께 사용하게 되는 것입니다. 리플리카셋이 수행하는 역할은 정해진 수의 같은 포드가 항상 실행되도록 관리를 하며 노드 장애 등의 이유로 포드를 사용할 수 없다면 다른 노드에서 포드를 다시 생성하는 역할을 합니다. 따라서 같은 포드를 안정적으로 여러 개 실행할 수도 있고, 워커 노드에 장애가 생기더라도 정해진 개수의 포드를 유지 할 수도 있습니다.