Pod 수명주기

Pod 수명주기 (Pod Lifecycle)

이 페이지는 Pod의 수명주기를 설명해요. Pod는 정의된 수명주기를 따라, Pending 단계에서 시작해 주 컨테이너 중 하나가 정상적으로 시작되면 Running을 거치고, 컨테이너 중 하나가 실패로 종료됐는지에 따라 Succeeded 또는 Failed 단계로 진행돼요.

Pod가 실행되는 동안 kubelet이 컨테이너를 관리하고 Pod의 spec을 컨테이너 런타임으로 변환해요. kubelet은 애플리케이션의 상태를 추적하는 프로브(probe) 실행도 관리해요.

개별 애플리케이션 컨테이너처럼 Pod는 비교적 일시적(ephemeral)인 엔터티로 간주돼요. Pod는 생성되고 고유 ID(UID)를 할당받으며, 재시작 정책에 따라 종료되거나 삭제될 때까지 머무는 노드에 스케줄링되어 실행돼요. 노드가 죽으면 그 노드에서 실행 중(또는 실행 예정)인 Pod는 삭제 대상으로 표시돼요. 컨트롤 플레인은 시간 초과 후 Pod를 제거로 표시해요.

Pod 수명

Pod가 실행되는 동안 kubelet은 일부 결함을 처리하기 위해 컨테이너를 재시작할 수 있어요. Pod 안에서 Kubernetes는 다양한 컨테이너 상태를 추적하고 Pod를 다시 건강하게 만들기 위해 어떤 조치를 취할지 결정해요. 이는 원하는 상태(Pod spec)와 실행 중인 컨테이너의 실제 상태를 주기적으로 조정하는 폴링 루프로 수행돼요.

Kubernetes API에서 Pod는 spec과 실제 status를 모두 가져요. Pod 객체의 status는 일련의 Pod conditions로 구성돼요. 필요하다면 애플리케이션에 유용한 사용자 지정 readiness 정보를 condition 데이터에 주입할 수도 있어요.

Pod는 수명 동안 한 번만 스케줄링돼요. Pod를 특정 노드에 할당하는 것을 바인딩(binding), 어떤 노드를 쓸지 선택하는 과정을 스케줄링(scheduling)이라 불러요. 일단 스케줄링되어 노드에 바인딩되면 Kubernetes는 그 노드에서 Pod를 실행하려고 해요. Pod는 멈추거나 종료될 때까지 그 노드에서 실행돼요. 선택된 노드에서 Pod를 시작할 수 없으면(예: Pod 시작 전 노드 크래시) 그 Pod는 영원히 시작되지 않아요.

Pod Scheduling Readiness를 사용해 모든 스케줄링 게이트가 제거될 때까지 Pod 스케줄링을 지연할 수 있어요.

Pod와 결함 복구

Pod의 컨테이너 하나가 실패하면 Kubernetes가 그 특정 컨테이너를 재시작하려고 할 수 있어요. 하지만 Pod가 클러스터가 복구할 수 없는 방식으로 실패하면 Kubernetes는 Pod를 더 이상 치유하려 하지 않고, Pod를 삭제하고 다른 컴포넌트의 자동 치유에 의존해요. Pod가 노드에 스케줄링됐는데 그 노드가 실패하면 Pod는 비정상으로 간주되고 결국 삭제돼요. Pod는 리소스 부족이나 노드 압력 축출으로 인한 축출에서 살아남지 못해요.

Pod 단계 (Pod phase)

Pod의 status.phase는 Pod가 수명주기에서 어디에 있는지 요약한 것이에요. 가능한 값:

  • Pending: Pod가 Kubernetes에 의해 수용됐지만 아직 컨테이너가 실행되지 않음 (스케줄링 대기, 이미지 풀링 등 포함).
  • Running: Pod가 노드에 바인딩되었고 모든 컨테이너가 생성되었으며 최소 하나가 실행 중 (또는 시작 중/재시작 중).
  • Succeeded: Pod의 모든 컨테이너가 성공적으로 종료됨 (재시작하지 않음).
  • Failed: 모든 컨테이너가 종료됐고 하나 이상이 실패로 종료됨. 또는 시스템에 의해 종료됨.
  • Unknown: 보통 노드와 통신 오류로 Pod 상태를 얻을 수 없음.

컨테이너 상태

컨테이너 상태는 Waiting, Running, Terminated 중 하나일 수 있어요. kubectl describe pod를 실행하면 컨테이너가 그 상태들 사이를 전환하는 것을 볼 수 있어요.

  • Waiting: 컨테이너가 실행을 위해 필요한 작업(이미지 풀링, Secret 데이터 저장 등) 중인 상태.
  • Running: 컨테이너가 문제없이 실행 중. 시작 후에도 오류가 발생할 수 있음.
  • Terminated: 컨테이너가 실행을 완료했거나 어떤 이유로 실패했고 종료 코드와 signal이 설정됨.

컨테이너 프로브 (Probes)

kubelet은 실행 중인 컨테이너에 대해 프로브를 실행해 애플리케이션 상태를 추적해요. 프로브는 세 가지 종류가 있어요.

  • livenessProbe: 컨테이너가 살아 있는지 나타내요. 실패하면 kubelet이 컨테이너를 종료하고 restart policy에 따라 재시작해요.
  • readinessProbe: 컨테이너가 요청을 서비스할 준비가 됐는지 나타내요. 실패하면 EndpointSlice에서 Pod가 제거돼 Service 트래픽을 받지 않아요.
  • startupProbe: 컨테이너의 애플리케이션이 시작됐는지 나타내요. 성공할 때까지 실행되며, 완료 후 liveness/readiness 프로브가 인계받아요.

프로브 핸들러로는 exec(명령 실행), grpc, httpGet(HTTP GET), tcpSocket(TCP 소켓)이 있어요.

재시작 정책 (Restart policy)

Pod spec의 restartPolicy는 컨테이너가 종료될 때 kubelet이 어떻게 재시작할지 정의해요. 가능한 값:

  • Always (기본값)
  • OnFailure
  • Never

Pod 종료 (Pod termination)

Pod가 종료되면 kubelet이 TERM 신호를 보내고, terminationGracePeriodSeconds(기본 30초) 동안 대기한 뒤, 여전히 실행 중이면 강제 종료(KILL)해요. 파드의 컨테이너가 PreStop 훅을 정의했으면 이전에 실행될 수 있어요.

더 알아보기 (Learn more)