포드

이 페이지에서는 Kubernetes의 포드 객체와 Google Kubernetes Engine에서 이를 사용하는 방법을 설명합니다.

포드란 무엇인가요?

포드는 Kubernetes에서 가장 작고 가장 기본적인 배포 가능한 객체입니다. 포드는 클러스터에서 실행되는 프로세스의 단일 인스턴스를 나타냅니다.

포드에는 Docker 컨테이너와 같은 하나 이상의 컨테이너가 포함됩니다. 포드가 여러 컨테이너를 실행할 때, 컨테이너는 단일 항목으로 관리되며, 포드의 리소스를 공유합니다. 일반적으로 단일 포드에서 여러 컨테이너를 실행하는 것은 고급 사용 사례입니다.

포드는 또한 해당 컨테이너에 대한 공유 네트워킹 및 저장소 리소스를 포함합니다.

  • 네트워크: 포드에는 고유 IP 주소가 자동으로 할당됩니다. 포드 컨테이너는 IP 주소 및 네트워크 포트를 포함하여 동일한 네트워크 네임스페이스를 공유합니다. 포드에 있는 컨테이너는 localhost의 포드 내부에서 서로 통신합니다.
  • 저장소: 포드는 컨테이너 간에 공유될 수 있는 공유 저장소 볼륨 집합을 지정할 수 있습니다.

포드는 포드가 제공하는 애플리케이션의 시스템 요구가 포함된 격리된 형태의 자체 포함된 '논리적 호스트'라고 볼 수 있습니다.

포드는 클러스터에서 애플리케이션의 단일 인스턴스를 실행하기 위해 사용됩니다. 하지만 개별 포드를 직접 만드는 것은 권장되지 않습니다. 대신 일반적으로 복제본이라고 부르는 동일한 포드 집합을 만들어서 애플리케이션을 실행합니다. 이러한 복제된 포드 집합은 Deployment와 같은 컨트롤러에 의해 생성되고 관리됩니다. 컨트롤러는 자신을 구성하는 포드의 수명 주기를 관리하며, 수평 확장을 수행하여 필요에 따라 포드 수를 변경할 수도 있습니다.

경우에 따라 디버그, 문제해결 또는 조사를 위해 포드와 직접 상호작용할 수도 있지만, 컨트롤러를 사용하여 포드를 관리하는 것이 가장 좋습니다.

포드는 클러스터의 노드에서 실행됩니다. 생성된 포드는 프로세스가 완료되거나, 포드가 삭제되거나, 리소스 부족으로 인해 노드에서 포드가 축출되거나, 노드가 실패할 때까지 해당 노드에 유지됩니다. 노드가 실패하면 해당 노드의 포드 삭제가 자동으로 예약됩니다.

포드 수명 주기

포드는 일시적입니다. 포드는 영구적으로 실행되도록 디자인되지 않았으며, 포드가 종료되면, 이를 되돌릴 수 없습니다. 일반적으로 포드는 사용자 또는 컨트롤러가 삭제하기 전까지는 사라지지 않습니다.

포드는 그 자체를 '치료' 또는 복구하지 않습니다. 예를 들어 포드가 노드에 예약되었는데, 나중에 노드가 실패하면, 포드가 삭제됩니다. 마찬가지로 포드가 특정 이유로 노드에서 축출되면, 포드가 자체적으로 대체되지 않습니다.

각 포드에는 포드의 status 필드로 표시되는 PodStatus API 객체가 포함됩니다. 포드는 자신의 위상status: phase 필드에 게시합니다. 포드 위상은 현재 상태의 포드에 대한 고급 요약 정보입니다.

클러스터에서 실행 중인 포드를 조사하기 위해 kubectl get pod를 실행할 때 포드는 다음 위상 중 하나일 수 있습니다.

  • 보류 중: 포드가 생성되고 클러스터에서 수락되었지만 하나 이상의 컨테이너가 아직 실행 중이 아닙니다. 이 위상에는 노드에서 예약을 수행하고 이미지를 다운로드하는 데 걸린 시간이 포함됩니다.
  • 실행 중: 포드가 노드에 결합되었고 모든 컨테이너가 생성되었습니다. 하나 이상의 컨테이너가 실행 중이거나, 시작 중이거나, 재시작되는 중입니다.
  • 성공함: 포드의 모든 컨테이너가 성공적으로 종료되었습니다. 종료된 포드는 재시작되지 않습니다.
  • 실패함: 포드의 모든 컨테이너가 종료되었고 하나 이상의 컨테이너가 오류 상태로 종료되었습니다. 0이 아닌 상태로 종료되면 컨테이너가 '실패'한 것입니다.
  • 알 수 없음: 포드 상태를 확인할 수 없습니다.

또한 PodStatus에는 포드 매니페스트에서 conditions로 표시되는 PodConditions라는 배열이 포함됩니다. 여기에는 typestatus 필드가 있습니다. conditions는 현재 상태를 유발한 포드 내의 조건을 보다 구체적으로 나타냅니다.

type 필드에는 PodScheduled, Ready, Initialized, Unschedulable이 포함될 수 있습니다. status 필드는 type 필드에 해당하며 True, False, Unknown을 포함할 수 있습니다.

포드 만들기

포드는 일시적이기 때문에 포드를 직접 만들 필요가 없습니다. 마찬가지로, 포드는 자체적으로 복구 또는 대체할 수 없기 때문에 포드를 직접 만드는 것은 권장되지 않습니다.

대신 Deployment와 같은 컨트롤러를 사용해서 포드를 만들고 관리할 수 있습니다. 또한 컨트롤러는 전체 업데이트 프로세스를 관리하므로, 컨테이너에서 실행되는 애플리케이션의 버전 변경과 같이, 업데이트를 출시하는 데에도 유용합니다.

포드 템플릿

Deployment 및 StatefulSet와 같은 컨트롤러 객체에는 포드 템플릿 필드가 포함됩니다. 포드 템플릿에는 포드 내에서 실행할 컨테이너와 포드가 마운트해야 하는 볼륨을 포함하여 각 포드의 실행 방법을 결정하는 포드 사양이 포함됩니다.

컨트롤러 객체는 포드 템플릿을 사용해서 클러스터 내에서 포드를 만들고 '원하는 상태'를 관리합니다. 포드 템플릿이 변경되면 이후의 모든 포드에 새 템플릿이 반영되지만 기존 포드에는 영향을 주지 않습니다.

포드 템플릿의 작동 방법에 대한 자세한 내용은 Kubernetes 문서에서 Deployment 만들기를 참조하세요.

포드가 실행되는 노드 제어

기본적으로 포드는 클러스터의 기본 노드 풀에 있는 노드에서 실행됩니다. 포드가 명시적이거나 암시적으로 선택하는 노드 풀을 구성할 수 있습니다.

  • 포드 매니페스트에서 nodeSelector를 설정하여 특정 노드 풀에 배포하도록 명시적으로 포드를 강제할 수 있습니다. 이렇게 하면 포드는 해당 노드 풀의 노드에서만 실행되도록 강제됩니다.

  • 실행하는 컨테이너를 위한 리소스 요청을 지정할 수 있습니다. 포드는 리소스 요청을 충족하는 노드에서만 실행됩니다. 예를 들어 4개의 CPU가 필요한 컨테이너가 포드 정의에 포함된 경우, 서비스는 CPU가 2개인 노드에서 실행되는 포드는 선택하지 않습니다.

포드 사용 패턴

포드는 두 가지 기본 방식으로 사용할 수 있습니다.

  • 단일 컨테이너를 실행하는 포드. 가장 간단하고 가장 일반적인 포드 패턴은 포드당 단일 컨테이너를 사용하는 것입니다. 여기에서는 단일 컨테이너가 전체 애플리케이션을 나타냅니다. 이 경우에는 포드를 래퍼라고 볼 수 있습니다.
  • 함께 작동해야 하는 여러 컨테이너를 실행하는 포드. 여러 컨테이너가 포함된 포드는 주로 리소스 공유가 필요한 공동 배치, 공동 관리 프로그램을 지원하기 위해 사용됩니다. 이러한 공동 배치 컨테이너는 하나의 컨테이너가 공유 볼륨으로부터 파일을 제공하고, 다른 컨테이너는 이러한 파일을 새로고침하거나 업데이트하는 단일 서비스 응집 단위를 형성할 수 있습니다. 포드는 이러한 컨테이너 및 저장소 리소스를 관리 가능한 단일 항목으로 묶습니다.

각 포드는 특정 애플리케이션의 단일 인스턴스를 실행하기 위해 사용됩니다. 여러 인스턴스를 실행하려는 경우에는 애플리케이션의 각 인스턴스에 대해 하나의 포드를 사용해야 합니다. 이것을 일반적으로 복제라고 부릅니다. 복제된 포드는 Deployment와 같은 컨트롤러에 의해 하나의 그룹으로 생성되고 관리됩니다.

포드 종료

포드는 해당 프로세스가 완료되었을 때 정상적으로 종료됩니다. 기본적으로 모든 종료는 30초 이내에 정상적으로 수행됩니다.

kubectl delete 명령어를 사용하면 포드를 수동으로 삭제할 수 있습니다. 이 명령어에 --grace-period 플래그를 사용하면 기본 유예 기간을 재정의할 수 있습니다.

다음 단계

이 페이지가 도움이 되었나요? 평가를 부탁드립니다.

다음에 대한 의견 보내기...

Kubernetes Engine