본문 바로가기
MLOps/Doker & Kubernetes

Udemy CKA 강의 정리 20: Recap - PODs

by 공부하는 무니 2023. 1. 3.
반응형

해당 내용은 Udemy의 Certified Kubernetes Administrator (CKA) with Practice Tests  강의를 공부한 내용입니다. 내용을 그대로 번역하기보다는, 제가 이해하기 쉬운 대로 수정한 부분들이 있습니다.

⚠️ 영어 독해가 많이 부족합니다. 틀린 내용이 있으면 알려주시면 감사하겠습니다.


이번 강의에서는 파드에 대해 살펴보겠습니다.

Assumptions

파드에 대해 이야기하기 전에, 가정을 몇가지 하겠습니다.

  • 애플리케이션이 이미 개발되어 도커 이미지로 빌트되어서 도커 허브와 같은 도커 레포지토리에서 사용가능합니다. 따라서 쿠버네티스는 이 도커 이미지를 pull down 할 수 있습니다.
  • 쿠버네티스 클러스터가 이미 셋업되어 있으며 작동 중입니다. 싱글 노드일 수도 있고 멀티 노드일 수도 있습니다. 상관 없습니다.
  • 모든 서비스는 실행 중인 상태여야 합니다.

POD

전에 언급한 것 과 같이, 쿠버네티스에서의 궁극적인 목표는 클러스터에서 워커 노드로 구성된 컨테이너 형태로 애플리케이션을 배포하는 것입니다. 그러나, 쿠버네티스는 컨테이너를 워커 노드에서 직접 배포하지 않습니다. 컨테이너들은 Pod라는 쿠버네티스 오브젝트로 캡슐화되어있습니다.

파드는 애플리케이션의 단일 인스턴스이며, 쿠버네티스에서 만들 수 있는 가장 작은 오브젝트입니다. 가장 간단한 케이스로 예를 들어 봅시다.

쿠버네티스 클러스터에 하나의 노드가 있고, 노드 안에서 애플리케이션 인스턴스 하나가 도커 컨테이너로 캡슐화된 파드에서 실행되고 있다고 합시다. 애플리케이션에 접속하는 유저 수가 증가해서, 애플리케이션을 확장해야 한다면 어떻게 해야 할까요? load를 분산하기 위해 애플리케이션의 인스턴스를 추가해야 하겠죠. 그렇다면 추가 인스턴스는 어디에다 추가할까요? 같은 파드 내에서 새 컨테이너 인스턴스를 불러와야 할까요? 아닙니다. 새 인스턴스와 함께 새로운 파드를 만듭니다. 이제 같은 노드 안에 있는 두 개의 별도 파드에서 실행되는 애플리케이션의 두 인스턴스가 있습니다. 유저 수가 더 많아져서 노드에 충분한 공간이 없으면 어떻게 할까요? 그렇다면 언제든지 새 노드를 만들어서 추가 파드를 배포할 수 있습니다. 클러스터의 물리적 용량을 확장하기 위해 새 노드를 추가합니다. 여기서 강조하고 싶은 내용은, 파드는 일반적으로 (애플리케이션을 실행하는) 컨테이너와 1:1 관계를 가진다는 것입니다.

확장하려면 새로운 파드를 만들면 되고, 축소하려면 기존 파드를 삭제하면 됩니다. 기존 파드에 컨테이너만 추가하는 것이 아니라는 사실을 기억해주세요. 이러한 모든 것을 구현하는 방법, 로드 밸런싱하는 방법 등을 나중에 다룰 예정입니다. 지금은 기본 개념을 이해하기 위해 노력만 하면 됩니다.

Multi-Container PODs

방금 우리는 파드가 일반적으로 컨테이너와 1:1 관계를 가진다고 했었는데요. 그렇다면 쿠버네티스가 한 파드에서는 하나의 컨테이너만 가질 수 있게 제한해둔 것일까요? 그것은 아닙니다. 한 파드는 같은 종류의 컨테이너가 아니라면, 여러 컨테이너를 가질 수 있습니다. 위에서 말씀드린 것과 같이, 우리의 의도가 애플리케이션을 확장하는 것이라면 같은 종류의 인스턴스(컨테이너)를 추가해야 하는 것이므로 추가 파드를 생성해야 합니다. 그러나 확장하는 것이 아닌 다른 시나리오가 있을 수 있습니다. 웹 애플리케이션의 경우, 유저 처리, 업로드된 파일 데이터 프로세싱 등 지원 작업을 수행하는 helper 컨테이너가 있을 수 있습니다. 이 경우 우리는 헬퍼 컨테이너가 애플리케이션 컨테이너와 함께 있길 원할 것입니다. 이런 케이스에는 한 파드 내에서 여러 컨테이너를 가질 수 있습니다.

이 경우, 두 컨테이너가 동일한 파드 안에 있기 때문에 새 어플리케이션 컨테이너가 생성되면 헬퍼도 생성되고, 기존 애플리케이션 컨테이너가 죽으면 헬퍼도 죽습니다. 두 컨테이너는 동일한 네트워크 space를 공유하기 때문에 서로를 localhost로 참조하여 직접 소통할 수 있습니다. 또한 동일한 저장 공간을 쉽게 공유할 수도 있습니다.

PODs Again! Docker Example (Docker Link)

파드에 대해 아직 이해가 안간다면, 다른 관점에서 파드를 살펴보겠습니다. 잠시 동안만 쿠버네티스를 제외하고 심플한 도커 컨테이너에 대해 이야기해봅시다. 우리는 현재 우리의 애플리케이션을 도커 호스트에 배포하기 위한 프로세스나 스크립트를 개발 중이라고 가정해봅니다. 그런다음 docker run python-app 커맨드로 간단하게 애플리케이션을 배포할 수 있으며, 애플리케이션이 제대로 실행되면 유저도 접근할 수 있게 됩니다. 부하가 증가하면, docker run python-app 커맨드를 여러 번 실행함으로써 애플리케이션의 더 많은 인스턴스를 배포합니다. 이렇게 간단하게 동작하게 되며 우리는 행복합니다. :) 시간이 흘러 우리의 애플리케이션은 더 개발되고, 아키텍처의 변화를 겪고, 성장하고 복잡해지고 있습니다. 이제 우리는 애플리케이션을 도와주는 새로운 헬퍼 컨테이너가 생겼습니다. 이 헬퍼 컨테이너는 다른 곳에서부터 데이터를 가져오거나 데이터를 처리해줍니다. 이러한 헬퍼 컨테이너는 애플리케이션 컨테이너와 일대일 관계를 유지합니다. 또한, 헬퍼 컨테이너는 애플리케이션 컨테이너와의 직접 소통과 데이터 접근이 필요합니다. 이를 위해 우리는 어떤 앱이 어떤 헬퍼 컨테이너와 연결되어 있는지를 매칭하는 맵을 관리하고 있어야 합니다. 즉 이러한 컨테이너들 사이에서 네트워크 연결을 설정해야 합니다. 이 네트워크 설정은 docker run helper -link app1 과 같은 커맨드를 사용하면 됩니다. 또한 데이터 접근을 위해 공유가능한 볼륨을 생성하고 컨테이너들에게 공유해야 합니다. 이러한 것들도 맵으로 관리해야 할 것입니다. 그리고 가장 중요한 것은 애플리케이션 상태를 모니터링해야 한다는 것입니다. 애플리케이션 컨테이너가 죽으면, 헬퍼 컨테이너도 더 이상 필요하지 않기 때문에 수동으로 죽입니다. 새로운 애플리케이션 컨테이너가 배포되면, 새로운 헬퍼 컨테이너도 배포해야 합니다.

파드를 사용하면 쿠버네티스가 이 모든 작업을 자동으로 수행해줍니다. 파드가 어떤 컨테이너로 구성되는지 정의하기만 하면 됩니다. 기본적으로 파드의 컨테이너는 동일한 스토리지, 동일한 네트워크 네임스페이스에 액세스 권한을 갖습니다. 또한 파드의 컨테이너들은 함께 생성되고 함께 파괴됩니다. 만약 우리의 애플리케이션이 복잡하지 않아서 컨테이너 하나만 있어도 된다 하더라도, 파드는 생성해야 합니다. 이렇게 파드를 생성하는 것이 애플리케이션의 아키텍처가 변경되거나 확장될 때를 대비하여 장기적으로 좋습니다. 멀티 컨테이너 파드가 굉장히 드문 사례이기 때문에 앞으로는 파드당 컨테이너가 한 개가 있다고 가정하고 설명하도록 하겠습니다.

How to deploy pods?

이제 파드를 배포하는 방법을 살펴보겠습니다. 앞에서 kubectl run 커맨드를 배웠습니다. 이 커맨드가 실제로 수행하는 작업은 파드를 생성하여 Docker 컨테이너를 배포하는 것입니다. 단계별로 더 자세히 살펴보겠습니다. kubectl run nginx 라는 커맨드를 입력하면, 먼저 파드를 자동으로 생성하고, nginx Docker 이미지의 인스턴스를 배포합니다. 이때 nginx라는 이미지를 가져와야 합니다. 이를 위해 kubectl run nginx --image nginx와 같이, 이미지 이름을 --image 파라미터로 지정해주어야 합니다. 이렇게 하면 도커 허브 레포지토리에서 nginx이미지를 다운로드하게 됩니다. 전에 말씀드린 것과 같이 도커 허브는 다양한 애플리케이션들의 최신 도커 이미지들이 모여 있는 공용 저장소입니다. 우리는 도커 허브나 조직의 프라이빗 저장소에서 이미지를 가져올 수 있도록 쿠버네티스를 구성할 수 있습니다. 이제 파드가 생성되었으므로, 사용 가능한 파드 목록을 보는 방법을 알아보도록 하겠습니다. kubectl get pods커맨드를 사용하면 클러스터의 파드 목록을 볼 수 있습니다.

이 경우, 상태가 ContainerCreating인 파드를 볼 수 있습니다. 이 파드는 곧 running상태로 바뀌며 실제로 실행이 됩니다. 우리는 아직 사용자가 어떻게 nginx웹 서버에 접근할 수 있는지에 대해 다루지 않았다는 것을 기억해주세요. 현재 상태에서는 외부 사용자가 웹 서버에 접근할 수 있도록 만들지 않았습니다. 노드 내부에서만 접근할 수 있습니다. 이 내용은 여기서 다루지는 않겠습니다. 지금은 파드를 배포하는 방법을 살펴보고, 이후 강의에서 네트워킹과 서비스를 배우게 되면 우리는 엔드 유저가 서비스를 접근 가능하게 만드는 방법을 알게 될 것입니다

반응형

댓글