Pods
Kubernetes에서 생성가능하고 관리할수 있는 가장 작은 deployable units of computing
Pod은 컨테이너들을 실행하기 위한 명세, 네트워크 자원, 공유 저장공간을 가진 하나이상의 컨테이너 그룹
Pod의 컨텐츠들은 항상 같은 공간에 위치해 있고, 함께 스케줄되며 공유된 컨텍스트로 실행된다.
Pod이란?
도커 개념으로 설명하자면, Pod은 공유된 namespace와 filesystem 저장공간을 가진 도커 컨테이너 그룹
쿠버네티스에서 Pod은 주로 두가지 방법으로 사용된다.
- single container를 실행하는 pods. “Pod하나당 컨테이너 하나” 모델은 가장 흔한 쿠버네티스 use case이다. 이 경우에, pod은 하나의 컨테이너를 감싸는 wrapper라고 생각할수 있다. Kubernetes는 컨테이너들을 직접적으로 관리하기보다 pod들을 관리한다.
- 함께 동작할 필요가 있는 여러 컨테이너들을 실행하는 pods. pod은 자원을 공유할 필요가있는 tightly coupled 여러 컨테이너들로 구성되는 application을 캡슐화 할수도 있다. Pod은 이 컨테이너들, 저장리소스들 그리고 ephemeral network identity들을 하나의 단위로 감싼다.
각각의 pod은 주어진 어플리케이션의 하나의 인스턴스를 실행할수 있다. 만약 어플리케이션을 수평적으로 스케일 하고 싶으면, 여러 pod을 사용해야한다. 쿠버네티스에서는 이를 repliation이라 부른다. Replicated pod들은 workload resource, controller에 의해서 보통 하나의 그룹으로 생성되고 관리된다.
Pod들이 여러 컨테이너들을 관리하는 방식
Pod에 존재하는 여러 컨테이너들은 자동으로 같은 클러스터에서 같은 물리 또는 가상 머신에서 위치하게된다.
예를들어, 아래 그림을 보자.
위에서 Web server 컨테이너는 공유된 volume에 있는 파일을 제공해주고, sidecar containers는 원격 저장소로 부터 파일들을 받아서 업데이트 해준다.
Pods으로 작업하기
Pod이 생성이 될때(직접적으로 당신에 의해서 또는 간접적으로 컨트롤러에 의해서 ) 새로운 pod은 클러스터에있는 노드에서 실행되도록 스케줄된다. pod은 실행이 끝나거나, pod object가 삭제되거나 자원부족으로 evict될때까지 노드에 남아있다.
노트 : Pod에 있는 컨테이너를 재시작하는것은 pod을 재시작하는것과는 다르다. Pod은 프로세스가 아니라 컨네이너들이 실행되는 환경이다. Pod은 삭제될때까지 계속 유지된다.
Pods 과 Controller
pods을 관리하고 생성하기위한 workload resources를 사용가능하다. resource에 대한 컨트롤러는 Pod failure 경우에 automatic healing, rollout, replication을 처리할수 있다.
Pod templates
workload resources(쿠버네티스에서 실행중인 어플리케이션)에 대한 컨트롤러는 pod template으로 pod을 생성하여 관리할수 있다.
Pod template은 pod들을 생성하기위한 명세이고 deployments,jobs, 그리고 DaemonSet과 같은 workload resources에 포함이 된다.
컨트롤러는 pod template을 workload object내에서 실제 pod을 생성하기 위해서 사용한다.
다음 manifest는 하나의 컨테이너를 실행하기 위한 template을 말한다. pod에 있는 컨테이너는 메시지를 출력하고 일시정지한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
apiVersion: batch/v1
kind: Job
metadata:
name: hello
spec:
template:
# This is the pod template
spec:
containers:
- name: hello
image: busybox
command: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 3600']
restartPolicy: OnFailure
# The pod template ends here
Pod LifeCycle
pod은 Pending
단계, Running
(최소 하나의 primary container가 정상적으로 시작될 경우), Succeeded
또는 Failed
단계로 실행된다.
pod이 실행되는 동안 kubelet이 오류를 복구하기위해 컨테이너들을 재시작할수 있다. pod이 일단 노드에 할당되어 스케줄링되면, pod은 해당노드에서만 실행된다.
Pod lifetime
pod이 생성되면 unique ID(UID)를 할당받고 노드에 스케줄링된다. 만약 노드가 죽으면 해당 노드에 할당된 pod들은 timeout period가 지나면 결국 삭제된다. pod 스스로 회복을 할수는 없고 controller
라 불리는 higher-level abstraction을 사용한다. controller는 pod instance들을 관리하는 작업을 담당한다.
pod은 절대 다른 노드에 reschedule되지 않는다; 대신, pod은 새로운, near-identical pod으로 교체된다. 이때 새로운 UID를 할당받는다. 만약 pod이 삭제되면, 비록 동일한 replacement가 생성되었다 하더라도 관련된 자원(volume)들은 모두 삭제되고 새로 생성된다.
Pod phase
Value | Description |
---|---|
Pending | Pod이 쿠버네티스 클러스터에 의해서 수락되었고 하나이상의 컨네이너들이 준비되지 않았음을 의미한다. pod이 스케줄링 되는데 걸리는 시간뿐 아니라 컨테이너 이미지를 다운로드하는 시간까지 포함한다. |
Running | pod이 노드에 도착했고 모든 컨테이너들이 생성되었음. 컨테이너들이 실행중임을 의미한다. |
Successded | 모든 컨테이너들이 성공적으로 종료되었고 재시작 되지 않을 것임을 의미한다. |
Failed | pod에 있는 모든 컨테이너들이 종료되었고 최소 하나의 컨테이너가 실패하여 종료되었음을 의미한다. |
Unknown | pod의 상태정보를 받아올수 없음을 의미한다. pod이 실행되어야 하는 노드와 커뮤니케이션에서 에러때문에 주로 발생한다. |
Container States
전체적인 pod의 단계뿐 아니라, 쿠버네티스는 pod내에 있는 각각의 컨테이너들의 상태도 트래킹한다. 일단 노드에 pod이 할당되면, kubelet은 컨테이너들을 생성하기 시작한다. 컨테이너 상태에는 세가지 상태가 있다 : Wainting
,Running
, Termination
pod의 컨테이너 상태를 체크하려면, kubectl describe pod <name-of-pod>
을 사용할수 있다. 결과는 pod내에있는 각각의 컨테이너 상태를 보여준다.
각각의 상태는 다음과 같은 의미가 있다.
Waiting
컨테이너를 시작하기 위해서 필요한 작업들을 수행중
Running
컨테이너가 issue없이 실행중임을 의미한다.
Terminated
실행이 완료되었거나 실패했음을 의미한다.
Pod conditions
PodScheduled
: pod이 노드에 스케줄되었음.ContainerReady
: pod에 있는 모든 컨테이너들이 준비됨.Initialized
: 모든 init container들이 성공적으로 실행됨Ready
: pod이 요청을 수락할수 있으며 load balancing pool에 추가 되어야 함을 의미한다.
Pod yaml Sturcture
- Metadata : 이름, 네임스페이스, 레이블 및 파드에 관한 기타 정보
- Spec : 파트 컨테이너, 볼륨, 기타 데이터 등 파트 자체에 대한 실제 명세
- Status : 파트 상태, 각 컨테이너 설명과 상태, 파드 내부 IP, 기타 기본 정보 등 현재 실행중인 파드에 관한 현재 정보