Prologue
본 포스트는 인프런 쿠버네티스 스터디 그룹에서 진행하는 스터디 자료의 일환으로 작성하였습니다. 기본적으론 [대세는 쿠버네티스] 강의를 보고 내용을 정리합니다. 그리고 제 경험이나 이해를 곁들여 포스트를 작성했습니다. 그동안 공식 문서나 블로그 포스트, CKA 강의 등 다양한 경로로 쿠버네티스를 익혀왔지만, 한국어로 잘 정리된 강좌를 한번 듣고 깔끔하게 다듬어보는 시간을 가지면 좋겠다는 생각이 들었습니다.
강의와는 조금 다를 수 있지만, 쿠버네티스 공식 문서를 보고 내용을 정리해보겠습니다.
이번 포스트에선 "Pod - Lifecycle" 강의를 듣고 정리한 포스트입니다.
Pod 라이프사이클
사람이 태어나서, 성장하고, 다시 자연으로 돌아가는 과정처럼, 파드에게도 정의된 라이프사이클이 있습니다. 파드는 Pending
단계에서 시작해서, Running
단계를 지나, 성공 또는 실패 여부에 따라 Succeeded
또는 Failed
단계로 이동합니다.
코드
각 이벤트의 이름을 정의해놓은 코드는 여기서 찾을 수 있습니다.
강의 내용
이번 강의의 내용은 다음의 그림 하나로 설명이 가능합니다. 아래 그림은 강사님께서 제공하신 이미지를 다시 그린 그림입니다.
파드의 단계
파드의 단계는 Pending
, Running
, Succeeded
, Failed
, Unknown
으로 구성됩니다. 자세한 내용은 공식 문서를 참조해주세요.
https://kubernetes.io/ko/docs/concepts/workloads/pods/pod-lifecycle/#파드의-단계
Pending
- 파드 내부에 하나 이상의 컨테이너가 아직 실행되지 않았습니다. 이 단계에는 파드가 스케줄되기 이전까지의 시간과 컨테이너 이미지를 준비하는 시간도 포함됩니다.
Initialized
- 정의된 초기화 컨테이너가 모두 수행 완료되었거나, 아예 설정하지 않았을 때
True
로 설정됩니다. 실패했을 경우엔False
로 설정됩니다.
- 정의된 초기화 컨테이너가 모두 수행 완료되었거나, 아예 설정하지 않았을 때
PodScheduled
- 파드가 어느 노드에 위치할지 스케줄 작업이 완료된 상태면
True
로 설정됩니다. - 이 과정에서 컨테이너의 이미지를 준비하게 되고, 아래 단락에서 설명 드릴 컨테이너의 상태는
ContainerCreating
입니다.
- 파드가 어느 노드에 위치할지 스케줄 작업이 완료된 상태면
Running
- 파드가 노드에 바인딩되었고, 모든 컨테이너가 생성된 단계입니다. 또는 적어도 하나의 컨테이너가 아직 실행 중입니다.ContainerReady & Ready
- 이 단계에서 파드 내부의 컨테이너가
CrashLoopBackOff
의 이유로 컨테이너의 상태가Waiting
으로 변경될 수 있습니다. 이 상태에 속하더라도 파드는Running
단계에 속합니다. 하지만ContainerReady
와Ready
는False
로 설정됩니다. 위 문제가 해결되면 두 값은True
로 바뀝니다.
- 이 단계에서 파드 내부의 컨테이너가
Succeeded
- 파드 내의 모든 컨테이너가 성공적으로 종료되었으며, 재시작되지 않는 단계입니다.- Job이나 CronJob으로 생성된 파드라면 파드 내의 컨테이너가 모두 정상 종료되었을 때 파드는 이 단계에 속합니다.
ContainerReady
와Ready
값은False
로 동일합니다.
- Job이나 CronJob으로 생성된 파드라면 파드 내의 컨테이너가 모두 정상 종료되었을 때 파드는 이 단계에 속합니다.
Failed
- 파드 내의 모든 컨테이너가 종료되었지만, 하나 이상의 컨테이너가 실패한 경우에 천이하는 단계입니다.- Job이나 CronJob으로 생성된 파드라면 파드 내의 컨테이너 중에 하나라도 정상 종료되지 않았을 때 파드는 이 단계에 속합니다.
ContainerReady
와Ready
값은False
로 동일합니다.
- Job이나 CronJob으로 생성된 파드라면 파드 내의 컨테이너 중에 하나라도 정상 종료되지 않았을 때 파드는 이 단계에 속합니다.
Unknown
- 어떤 이유로 인해 파드의 상태를 확인할 수 없을 때의 단계입니다. 일반적으로 파드가 실행되고 있는 노드와의 통신 오류로 인해 발생합니다.
파드의 조건
파드는 하나의 PodStatus를 갖습니다. 그리고 PosStatus는 파드가 현재 통과했거나 통과하지 못한 조건에 대해 다음처럼 표현합니다.
PodScheduled
- 파드가 노드에 스케줄되었습니다.ContainersReady
- 파드 내의 모든 컨테이너가 준비된 상태입니다.Initialized
- 파드 내의 모든 초기화 컨테이너(init container)가 성공적으로 시작되었습니다.Ready
- 해당 파드는 자신에게 오는 요청을 처리할 수 있으며, 서비스의 엔드포인트에 추가될 수 있습니다.
또한 파드가 현재 조건에서 true
상태로 머무는 이유를 두 가지 정도로 설명하는 필드가 있습니다.
ContainersNotReady
- 컨테이너가 현재 준비된 상태가 아니기 때문입니다.PodCompleted
- 파드의 작업이 완료되었기 때문입니다.
컨테이너의 상태
위 이미지에서도 볼 수 있듯이, 파드의 디스크립션에는 컨테이너의 상태 정보도 포함하고 있습니다. 컨테이너의 상태로 표시할 수 있는 상태는 다음과 같이 세 가지 입니다.
Waiting
-Waiting
상태의 컨테이너는 컨테이너를 시작하기까지에 필요한 작업을 수행하는 중임을 나타냅니다. 예를 들어, 컨테이너 이미지 레지스트리에서 컨테이너 이미지를 가져오는 단계가 이에 속합니다.Running
- 이 상태의 컨테이너는 해당 컨테이너가 문제없이 잘 실행되고 있음을 나타냅니다.Terminated
- 이 상태의 컨테이너는 실행을 시작한 후, 완료되었거나, 어떤 이유로 인해 실패했음을 나타냅니다.
파드의 조건과 마찬가지로, 컨테이너가 왜 해당 상태에 머물고 있는지 4가지 정도로 이유를 설명합니다.
ContainerCreating
- 컨테이너가 생성되는 중임을 나타냅니다.CrashLoopBackoff
- 이 경우는 쿠버네티스를 관리하다보면 가장 흔하게 볼 수 있습니다. 컨테이너 내부의 애플리케이션이 계속 충돌하거나, 배포 과정에서 오류가 발생했을 때, 또는 전달해주어야 하는 값에 문제가 있을 때 이 Reason에 머뭅니다.Error
- 컨테이너가 동작하던 중에 Error 상태에 빠졌기 때문입니다.Completed
- 컨테이너의 수행 작업이 완료되어 종료되었기 때문입니다.
참고
- https://kubernetes.io/ko/docs/concepts/workloads/pods/pod-lifecycle/
- https://sysdig.com/blog/debug-kubernetes-crashloopbackoff/
- https://stackoverflow.com/questions/51395435/list-of-all-possible-status-reasons-in-kubernetes
- https://stackoverflow.com/questions/57821723/list-of-all-reasons-for-container-states-in-kubernetes
마무리
여기까지 따라오시느라 고생이 많으셨습니다. 만약 이 글이 도움이 되셨다면 글 좌측 하단의 하트❤를 눌러주시면 감사하겠습니다.
오늘은 간단하게 파드의 라이프사이클과 파드 내부의 컨테이너의 상태에 대해 정리해보았습니다. 강사님께서 이미지로 설명해주신 부분이 오늘 강의 내용을 이해하는데에 큰 도움이 되었습니다.
혹시라도 글에 이상이 있거나, 이해가 가지 않으시는 부분, 또는 추가적으로 궁금하신 내용이 있다면 주저 마시고 댓글💬을 남겨주세요! 빠른 시간 안에 답변을 드리겠습니다 😊