파드 조건
파드 조건 (Pod Conditions)
Kubernetes에서 많은 객체에는 조건(conditions) 이 있어요. 조건은 객체가 나타내는 대상의 실제 상태의 어떤 측면에 대한 표시자예요. 파드에도 조건이 있고, Kubernetes 파드 조건은 컨트롤러(및 문제 해결을 하는 사람)가 파드의 건강 상태를 이해하는 중요한 측면이에요.
파드의 phase는 파드가 수명주기의 어디에 있는지에 대한 높은 수준의 요약을 제공하지만, 단일 값이 전체 그림을 포착할 수는 없어요. 예를 들어 파드가 Running phase일 수 있지만 아직 트래픽을 제공할 준비가 되지 않았을 수 있어요. 파드 조건은 스케줄링되었는지, 컨테이너가 준비되었는지, 크기 조정(resize)이 진행 중인지, 테인트 때문에 파드가 곧 중단될 예정인지 같은 파드 상태의 여러 측면을 독립적으로 추적해 phase를 보완해요.
출처: 문서
본문
파드 조건의 구조
파드의 status는 파드가 특정 체크포인트를 통과했는지 나타내는 PodConditions 배열을 포함해요.
PodCondition 배열의 각 요소는 다음 필드를 가져요.
| 필드 이름 | 설명 |
|---|---|
type |
이 파드 조건의 이름 |
status |
그 조건이 적용되는지 여부, 가능한 값은 "True", "False", "Unknown" |
lastProbeTime |
파드 조건이 마지막으로 프로브된 시각 |
lastTransitionTime |
파드가 마지막으로 한 상태에서 다른 상태로 전환된 시각 |
reason |
조건의 마지막 전환 이유를 나타내는 기계 판독 가능한 UpperCamelCase 텍스트 |
message |
마지막 상태 전환에 대한 세부 사항을 나타내는 인간 판독 가능한 메시지 |
observedGeneration |
조건이 기록된 시점의 파드 .metadata.generation. 파드 세대 참고 |
내장 파드 조건 (Built-in Pod conditions)
Kubernetes는 다음 파드 조건을 관리해요.
수명주기 조건(Lifecycle conditions): 파드가 수명주기를 진행하면서 거의 이 순서로 설정돼요: PodScheduled, PodReadyToStartContainers, Initialized, ContainersReady, Ready.
기타 조건(Other conditions): 특정 작업이나 이벤트에 응답해 설정돼요: DisruptionTarget, PodResizePending, PodResizeInProgress.
위 내장 조건 외에도 Pod 준비 게이트(readiness gates)를 사용해 커스텀 조건을 정의할 수 있어요.
수명주기 파드 조건 (Lifecycle Pod conditions)
파드가 수명주기를 진행하면서 kubelet은 거의 이 순서로 다음 조건을 설정해요.
PodScheduled: 파드가 노드에 스케줄링되었음.PodReadyToStartContainers: 파드 샌드박스가 성공적으로 생성되고 네트워킹이 구성되었음. 샌드박스와 네트워크는 컨테이너 런타임과 CNI 플러그인이 설정해요.Initialized: 모든 init 컨테이너가 성공적으로 완료되었음. init 컨테이너가 없는 파드의 경우, 샌드박스 생성 전에True로 설정됨.ContainersReady: 파드의 모든 컨테이너가 준비되었음. 컨테이너의 준비 상태는 구성되어 있다면 준비 프로브(readiness probe)에 의해 결정됨.Ready: 파드가 요청을 제공할 수 있고 일치하는 모든 서비스의 로드밸런싱 풀에 추가되어야 함.Ready가 아닌 파드는 Service 엔드포인트에서 제거됨.
kubectl로 파드의 조건을 조사할 수 있어요.
kubectl get pod <pod-name> -o yaml
다음은 실행 중인 파드의 status.conditions 모습을 보여줘요.
status:
conditions:
- type: PodScheduled
status: "True"
lastProbeTime: null
lastTransitionTime: "2026-03-29T08:52:21Z"
observedGeneration: 1
- type: PodReadyToStartContainers
status: "True"
lastProbeTime: null
lastTransitionTime: "2026-04-11T06:02:16Z"
observedGeneration: 1
- type: Initialized
status: "True"
lastProbeTime: null
lastTransitionTime: "2026-03-29T08:52:21Z"
observedGeneration: 1
- type: ContainersReady
status: "True"
lastProbeTime: null
lastTransitionTime: "2026-04-11T06:02:45Z"
observedGeneration: 1
- type: Ready
status: "True"
lastProbeTime: null
lastTransitionTime: "2026-04-11T06:02:45Z"
observedGeneration: 1
PodReadyToStartContainers
파드가 노드에 스케줄링된 후에는 kubelet이 파드를 허용(admit)하고 필요한 스토리지 볼륨을 마운트해야 해요. 이 단계들이 완료되면 kubelet은 Container Runtime Interface(CRI)를 사용하는 컨테이너 런타임과 협력해 런타임 샌드박스를 설정하고 파드의 네트워킹을 구성해요. PodReadyToStartContainers 조건이 파드의 status.conditions 필드에 추가돼요.
kubelet은 파드에 네트워킹이 구성된 런타임 샌드박스가 없다는 것을 감지하면 이 조건을 False로 설정해요. 이는 다음 시나리오에서 발생해요.
- 파드 수명주기 초기에, kubelet이 컨테이너 런타임을 사용해 파드에 대한 샌드박스 설정을 아직 시작하지 않았을 때
- 파드 수명주기 후반에, 파드 샌드박스가 파괴되었을 때 — 격리에 가상 머신을 사용하는 컨테이너 런타임의 경우 노드가 재부팅되면서 파드가 축출되지 않았거나, 파드 샌드박스 가상 머신이 재부팅되어 새 샌드박스와 새 컨테이너 네트워크 구성이 필요하게 됨
kubelet은 런타임 플러그인이 파드에 대한 샌드박스 생성과 네트워크 구성을 성공적으로 완료한 후 PodReadyToStartContainers 조건을 True로 설정해요. kubelet은 PodReadyToStartContainers 조건이 True로 설정된 후 컨테이너 이미지를 당기고 컨테이너를 만들기 시작할 수 있어요.
init 컨테이너가 있는 파드의 경우 kubelet은 init 컨테이너가 성공적으로 완료된 후(런타임 플러그인의 성공적인 샌드박스 생성과 네트워크 구성 이후에 발생) Initialized 조건을 True로 설정해요. init 컨테이너가 없는 파드의 경우 kubelet은 샌드박스 생성과 네트워크 구성이 시작되기 전에 Initialized 조건을 True로 설정해요.
기타 파드 조건 (Other Pod conditions)
다음 조건들은 정상적인 파드 수명주기 진행의 일부가 아니에요. 특정 작업이나 이벤트에 응답해 설정돼요.
DisruptionTarget
파드가 중단(disruption) 때문에 곧 삭제될 예정임을 나타내기 위해 전용 DisruptionTarget 조건이 추가돼요. 조건의 reason 필드는 파드 종료에 대한 다음 이유 중 하나를 추가로 나타내요.
PreemptionByScheduler— 파드가 더 높은 우선순위의 새 파드를 수용하기 위해 스케줄러에 의해 선점될 예정. 자세한 내용은 파드 우선순위 선점 참고.DeletionByTaintManager— 파드가 용납하지 않는 NoExecute 테인트 때문에 Taint Manager(kube-controller-manager의 노드 수명주기 컨트롤러의 일부)가 파드를 삭제할 예정. 테인트 기반 축출 참고.EvictionByEvictionAPI— 파드가 Kubernetes API를 사용해 축출 대상으로 표시됨.DeletionByPodGC— 더 이상 존재하지 않는 노드에 바인딩된 파드가 파드 가비지 컬렉션에 의해 삭제될 예정.TerminationByKubelet— 파드가 노드 압력 축출, 정상 노드 종료, 또는 시스템 중요 파드 선점 중 하나 때문에 kubelet에 의해 종료됨.
파드 컨테이너 한도 초과로 인한 축출 같은 다른 모든 중단 시나리오에서는 파드가 DisruptionTarget 조건을 받지 않아요. 중단이 아마도 파드 자체에 의해 발생했고 재시도하면 재발할 것이기 때문이에요.
파드 정리와 함께, 파드 가비지 컬렉터(PodGC)는 파드가 비종결(non-terminal) phase에 있으면 그것들을 실패한 것으로 표시하기도 해요 (파드 가비지 컬렉션 참고).
Job(또는 CronJob)을 사용할 때, 이 파드 중단 조건을 Job의 Pod 실패 정책의 일부로 사용하고 싶을 수 있어요.
자세한 내용은 중단 (Disruptions)을 참고해요.
PodResizePending과 PodResizeInProgress
kubelet은 크기 조정(resize) 요청의 상태를 나타내도록 파드의 status 조건을 업데이트해요.
type: PodResizePending— kubelet이 요청을 즉시 승인할 수 없음.message필드가 그 이유를 설명해요.reason: Infeasible: 요청된 크기 조정이 현재 노드에서 불가능함(예: 노드가 가진 것보다 더 많은 리소스 요청).reason: Deferred: 요청된 크기 조정이 현재 가능하지 않지만 나중에는 가능해질 수 있음(예: 다른 파드가 제거된 경우). kubelet이 크기 조정을 재시도함.type: PodResizeInProgress— kubelet이 크기 조정을 수락하고 리소스를 할당했지만, 변경 사항이 아직 적용 중임. 보통 짧지만 리소스 유형과 런타임 동작에 따라 더 오래 걸릴 수 있음. 실행 도중 발생한 오류는message필드에 보고됨(reason: Error와 함께).
요청된 크기 조정이 Deferred이면 kubelet은 주기적으로 크기 조정을 재시도하는데, 예를 들어 다른 파드가 제거되거나 축소될 때 그렇지요.
파드 크기 조정에 대한 자세한 내용은 컨테이너에 할당된 CPU·메모리 리소스 크기 조정을 참고해요.
향상된 파드 준비 (Enhanced Pod readiness)
애플리케이션은 파드의 .status에 추가 피드백이나 신호를 주입할 수 있어요. 이것을 향상된 파드 준비(enhanced Pod readiness) 라고 해요. 이를 사용하려면 파드의 spec에서 readinessGates를 설정해 kubelet이 파드 준비에 대해 평가하는 추가 조건 목록을 지정해요. 그런 다음 이 커스텀 조건을 관리하는 컨트롤러를 구현하거나 설치하고, kubelet은 그것을 파드가 준비되었는지 결정하는 추가 입력으로 사용해요.
준비 게이트는 파드의 status.condition 필드의 현재 상태로 결정돼요. Kubernetes가 파드의 status.conditions 필드에서 그런 조건을 찾을 수 없으면, 그 조건의 상태는 "False"로 기본 설정돼요.
kind: Pod
...
spec:
readinessGates:
- conditionType: "www.example.com/feature-1"
status:
conditions:
- type: Ready # a built-in PodCondition
status: "False"
lastProbeTime: null
lastTransitionTime: 2018-01-01T00:00:00Z
- type: "www.example.com/feature-1" # an extra PodCondition
status: "False"
lastProbeTime: null
lastTransitionTime: 2018-01-01T00:00:00Z
containerStatuses:
- containerID: docker://abcd...
ready: true
...
추가하는 파드 조건의 이름은 Kubernetes 라벨 키 형식을 충족해야 해요.
파드 준비의 상태
파드에 대한 이 status.conditions를 설정하려면 애플리케이션과 오퍼레이터가 파드의 status 하위 리소스에 PATCH 동작을 사용해야 해요. kubectl patch를 --subresource=status와 함께 사용하거나, Kubernetes 클라이언트 라이브러리를 사용해 파드 준비를 위한 커스텀 파드 조건을 설정하는 코드를 작성할 수 있어요.
커스텀 조건을 사용하는 파드의 경우, 다음 두 문장이 모두 적용될 때만 그 파드가 준비된 것으로 평가돼요.
- 파드의 모든 컨테이너가 준비됨
readinessGates에 지정된 모든 조건이True임
파드의 컨테이너가 준비되었지만 커스텀 조건이 하나라도 없거나 False이면, kubelet은 파드의 Ready 조건을 status: "False", reason: ReadinessGatesNotReady로 설정해요.
다음 단계
- 파드 라이프사이클 배우기
- 중단 (Disruptions) 배우기
- 컨테이너 프로브와 그것이 파드 준비에 미치는 영향 배우기
- 파드 리소스 제자리 크기 조정 배우기