[쿠버네티스] Pod, namespace란
Pod란?
- 컨테이너를 표현하는 K8S API의 최소 단위
- Pod에는 하나 또는 여러 개의 컨테이너가 포함될 수 있음
- Pod 내의 컨테이너는 IP와 Port를 공유
❓ 왜 Pod에 여러 개의 컨테이너를 넣을까?
최근 애플리케이션들은 실행할 때 애플리케이션만 올라가는 것이 아니라 로그 수집기와 같은 다양한 솔루션이 함께 배포되는 경우가 많습니다.
특히 로그수집기 같은 경우에는 애플리케이션의 로그 파일을 읽어서 수집하기 때문에 애플리케이션과 로그 수집기를 다른 컨테이너로 배포하게 될 경우, 일반적으로는 컨테이너에 의해서 독립적인 환경으로 파일 시스템이 분리되기 때문에 로그 수집기가 애플리케이션에 배포된 컨테이너의 로그 파일을 읽는 것이 불가능하지만, 쿠버네티스의 경우 하나의 파드 안에서 컨테이너끼리 볼륨을 공유할 수 있기 때문에 다른 컨테이너의 파일을 읽어올 수 있습니다.
Pod 특징
- 파드 실행 방식
- 단일 컨테이너 실행 : 파드 당 하나의 컨테이너 모델은 가장 일반적인 경우 이며, 쿠버네티스 는 컨테이너 대신 이런 파드를 관리한다.
- 다중 컨테이너 실행 : 파드는 리소스를 공유하는 다중 컨테이너로 구성된 애플리케이션을 캡슐화할 수 있다. 캡슐화된 것은 하나의 서비스 단위를 형성한다.
- 파드의 확장
- 수평적 확장애플리케이션 성능을 높이기 위해 애플리케이션의 인스턴스를 여러 개 파드에서 실행하는 것. 쿠버네티스에서는 일반적으로 레플리케이션 이라 한다.
- 수직적 확장하나의 인스턴스가 사용하는 리소스를 증가시키는 방법으로 인스턴스 자체의 성능을 높이는 것
Pod 라이프사이클
상태 | 설명 |
Pending | 파드가 k8s 클러스터의 api 서버에 의해 승인되었지만 하나 이상의 컨테이너가 설정되지 않았거나 실행할 준비가 되지 않은 상태이다. |
Running | 파드가 노드에 바인딩되었고, 모든 컨테이너가 생성되어 적어도 하나 이상의 컨테이너가 실행 중인 상태 |
Succeeded | 파드에 있는 모든 컨테이너가 성공적으로 종료된 상태 |
Failed | 파드 내의 하나 이상의 컨테이너가 실패로 종료된 상태. 컨테이너가 0이 아닌 상태로 종료되거나 시스템에 의해서 종료된 상태 |
Unknown | 파드의 상태를 알 수 없는 경우이며, 주로 API 서버가 파드의 상태를 알 수 없을 때 발생. 일반적인 경우 통신 오류 |
Pod 조건 (Condition)
- Pod는 하나의 PodStatus를 가지며 이는 Pod의 상태와 이유를 나타내며, Pod LifeCycle과 달리 동시에 여러 조건을 가질 수 있습니다.
조건 | 설명 |
PodScheduled | 파드가 노드에 스케줄된 상태 |
PodHasNetworking | 샌드박스가 성공적으로 생성되고 네트워킹이 구성된 상태 |
ContainersReady | 파드의 모든 컨테이너가 준비된 상태 |
Initialized | 모든 초기화 컨테이너가 성공적으로 완료된 상태 |
Ready | 파드가 요청을 처리할 수 있고, 서비스 제공이 가능한 상태 |
컨테이너 상태
- 쿠버네티스는 Pod 전체의 단계뿐만 아니라 Pod 내부의 각 컨테이너 상태도 추적합니다.
상태 | 설명 |
Waiting | Running 또는 Terminated 상태가 아니면, Waiting 상태이고, Waiting 상태의 컨테이너는 시작을 완료하는 데 필요한 작업을 계속 실행하고 있는 중이다. kubectl 을 사용하면 Waiting 단계에 머물고 있는 이유를 Reason 필드를 통해 알 수 있음. - ImagePullBackOff - 컨테이너 이미지를 가져오는 데 실패하여 다시 시도하기 전까지 대기 중 - ErrImagePull - 이미지 풀링 중 오류가 발생 - CrashLoopBackOff - 컨테이너가 반복적으로 크래시가 발생하여 재시작 대기 중 - ContainerCreating - 컨테이너가 생성 중이며, 주로 초기화 작업이 진행되고 있는 상태 |
Running | 컨테이너가 정상적으로 실행 중인 상태이며, postStart 훅이 구성되어 있다면 이미 실행되고 완료되었다. |
Terminated | Terminating 상태의 컨테이너는 실행을 시작한 후 실행이 완료되거나 어떤 이유로 실패한 상태 입니다. 컨테이너에 preStop 후크가 구성되어 있는 경우 이 후크는 컨테이너가 종료됨 상태로 전환되기 전에 실행됩니다. |
Namespace란?
다음과 같이 용도와 목적이 다른 수많은 오브젝트들이 배포되면 어떻게 될까?
쿠버네티스는 pod, label, deploymennt 등 다양한 리소스가 있습니다.
그렇기 때문에 비슷한 이름의 오브젝틀들이 수없이 생길 것이고, 쿠버네티스 환경 운영자와 사용자는 관리와 사용 측면에서 어려움을 겪을 것 입니다.
그래서 쿠버네티스에서는 namespace를 제공합니다.
namespace란, 쿠버네티스 클러스터 내의 논리적인 분리 단위입니다.
위의 그림처럼 쿠버네티스 클러스터를 dev/stg/prd 세 개의 네임스페이스로 구분했습니다.
dev 목적의 사용자는 dev namespace에 접근해서 오브젝트를 배치, 운영하고,
stage 목적의 사용자는 stg namespace에 접근해서 운영할 수 있습니다.
여기서 namespace는 클러스터를 논리적으로 분리하는 것이지, 물리적으로 분리하지 않습니다.
참조: