Pod & Container lifecycle

김현수·2024년 3월 14일
0

Kubernetes

목록 보기
6/14

Kubernetes in Action, Second Edition MEAP V15 정리중

container의 lifecycle

container가 생성된 이후부터 작업을 마치고 종료될 때까지의 state의 순서이다.

적당히 그림보고 알아듣자.

contiainer의 lifecycle은 다음과 같이 알아낸다.

$ kubectl describe po kiada
...
Containers:
 kiada:
 Container ID: docker://c64944a684d57faacfced0be1af44686...
 Image: luksa/kiada:0.1
 Image ID: docker-pullable://luksa/kiada@sha256:3f28...
 Port: 8080/TCP
 Host Port: 0/TCP
 State: Running 
 Started: Sun, 02 Feb 2020 12:43:03 +0100 
 Ready: True 
 Restart Count: 0 
 Environment: <none>
...

Container auto-restart policy

container는 기본적으로 종료되었을때 성공/실패 여부에 관계없이 자동재시작된다. 해당 사항은 pod의 spec의 restartPolicy에 적혀 있다. 기본은 Always이다.

Container가 재시작될 시 처음은 바로 시작하지만, 그 이후엔 시간간격을 10s, 20s, 40s, ..., 300s (max)식으로 시간간격을 늘려서 시작한다.

재시작된 이유를 보려면 다음과 같이 하면 된다.

$ kubectl get po kiada-ssl -o json | jq .status.containerStatuses
...
"state": {
 "waiting": {
 "message": "back-off 40s restarting failed container=envoy ...",
 "reason": "CrashLoopBackOff"

liveness probe

container가 살아있는지 확인은 어떻게 할까? 정상적으로 종료되거나 에러를 방출하면 알아낼 수 있지만, 무한루프나 과부하됐을 때는 알아낼 방법이 없다.

이를 해결하기 위해 Kubernetes는 container에 지속적으로 query를 날려 응답을 체크한다. 이것을 liveness probe라고 한다.

liveness probe에는 HTTP GET, TCP 연결, exec 실행의 3가지의 request 요청 방식이 있다. 세부적인 작동방식은 다음과 같다.

우선 container 실행되고 InitialDelatSeconds만큼 기다림
-> periodSeconds 주기로 request 보냄
-> timeoutSeconds만큼 응답 없을 시 failure로 취급
-> failureThreshold만큼 실패하면 container 종료

startup probe

liveness probe가 실행되기 전에 container가 제대로 시작했는지 알아보는 것으로, 실패하면 container를 종료시키고 성공하면 liveness probe단계로 넘어간다.

Post-start & Pre-stop hook

container가 시작된 직후나 종료되기 직전 따로 작업을 실행시킬 수 있는데, 이를 각각 post-start hook, pre-stop hook 이라고 한다.

이것을 이용해서 각각 시작하기 전 파일들 받아오기, container 정상종료를 수행할 수 있다.

pod의 lifecycle

pod도 container와 마찬가지로 lifecycle를 가진다.

  1. Pending: pod이 처음 만들어 진 직후의 상태
  2. Running: node에서 image를 받고 pod를 할당할 때 running state로 넘어간다.
  3. Succeeded: pod가 모든 작업을 수행하고 성공적으로 종료되었을 때
  4. Failed: pod안의 어떤 container가 에러를 띄웠을 때
  5. Unknown: kubelet이 알수없는 이유로 API서버에 리포트를 보내고 있지 않을 때

 
pod의 phase는 다음 명령어로 볼 수 있다.

$ kubectl get po kiada -o yaml | grep phase
phase: Running

pod의 conditions

Pod이 어떤 condition들을 만족했는지 보여주는 지표이다.

PodScheduled: pod이 node에 할당되었는지 여부
Initialized: pod의 Initial container가 성공적으로 작동했는지
ContainersReady: pod 안의 모든 container가 ready 상태인지
Ready: pod이 모든 실행준비를 끝냈는지

 
pop의 condition은 다음 명령어로 볼 수 있다.

$ kubectl describe po kiada
...
Conditions:
 Type Status
 Initialized True 
 Ready True 
 ContainersReady True 
 PodScheduled True 
...

pod의 stage

pod에는 3가지의 stage가 있다.

initialization stage

init container image를 node에 받아오고 pod의 init container들이 실행시키는 단계이다.

image를 받아오면 첫번째 init node부터 차례로 실행시킨다. 중간에 실패할 경우 재시작하지 않으면 pod은 error 상태가 된다.

run stage

마찬가지로 container별로 image를 node에 받아오고 container들을 실행한다.

container가 종료될 때 container에서는 종료 로직을 실행하고 TERM 시그널을 보낸다. 일정시간이 지나도 종료되지 않으면 강제로 종료한다.

termination stage

pod을 제거할때 발생하는 단계로, 안에 있는 모든 노드에 delete signal를 보낸다. 마찬가지로 container의 종료를 기다리고, 종료되지 않으면 강제로 종료한다.

Summary

앞에서 알아본 container와 pod의 lifecycle를 요약하면 다음과 같다.


profile
개발자 스터디 블로그

0개의 댓글