Pod Lifecycle
파드(Pod)의 라이프사이클은 파드가 생성되어 종료될 때까지의 모든 단계를 포함한다. 쿠버네티스에서는 파드가 여러 단계를 거쳐 실행되며, 각 단계마다 특정한 상태와 조건이 설정된다.
Kubernetes 공식문서: https://kubernetes.io/ko/docs/concepts/workloads/pods/pod-lifecycle/
파드 상태(Phase)
파드는 라이프사이클 동안 다음과 같은 상태(Phase)를 가질 수 있다.
- Pending: 파드가 승인되었지만, 모든 컨테이너가 실행 준비가 되지 않은 상태. 네트워크나 컨테이너 이미지 다운로드가 진행 중일 가능성이 높다.
- Running: 파드가 노드에 할당되었고, 적어도 하나의 컨테이너가 실행 중인 상태
- Succeeded: 파드의 모든 컨테이너가 성공적으로 종료된 상태
- Failed: 파드의 모든 컨테이너가 종료되었고, 하나 이상의 컨테이너가 실패한 상태
- Unknown: 파드 상태를 알 수 없는 상태. 일반적으로 노드와의 통신 오류로 발생한다.
파드 상태의 세부 단계
- Terminating: 파드가 삭제되고 종료되는 중인 상태 (상태 값은 아니며, kubectl 커맨드를 통해 볼 수 있음).
- Failed (노드가 죽거나 연결이 끊어짐): 노드가 실패하면 파드는 Failed 상태로 전환되며 삭제된다.
컨테이너 상태
파드 내의 각 컨테이너는 세 가지 상태 중 하나를 가진다.
- Waiting: 컨테이너가 실행되지 않거나 준비 중인 상태
- Running: 컨테이너가 정상적으로 실행 중인 상태
- Terminated: 컨테이너가 실행을 마쳤거나 오류로 인해 종료된 상태
컨테이너 재시작 정책 (restartPolicy)
파드의 컨테이너에 대해 설정할 수 있는 재시작 정책은 다음 세가지가 있다.
- Always: 컨테이너가 종료되면 항상 재시작된다. (기본값)
- OnFailure: 컨테이너가 실패한 경우에만 재시작된다.
- Never: 컨테이너가 종료되더라도 재시작되지 않는다.
파드 수명 주기 (Lifecycle Hooks)
컨테이너의 시작, 종료 시 특정 이벤트를 트리거할 수 있는 라이프사이클 훅이다.
- preStop: 컨테이너가 종료되기 전에 실행될 명령어를 지정
- postStart: 컨테이너가 시작된 후에 실행될 명령어를 지정
컨테이너 프로브(probe)
Kubernetes Probe 공식 문서 :https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/
프로브는 kubelet이 주기적으로 실행하여 컨테이너 상태를 진단하는 메커니즘이다. Kubernetes는 애플리케이션의 상태를 모니터링하고 필요에 따라 조치를 취할 수 있도록 여러 종류의 프로브를 제공한다. 주요 프로브는 liveness, readiness, start 프로브이다.
- Liveness Probe (활성 상태 검사)
컨테이너가 정상적으로 동작하고 있는지 확인한다. 만약 liveness probe가 실패하면, Kubernetes는 해당 컨테이너를 다시 시작하여 문제를 해결하려고 시도한다. 이는 교착 상태에 빠졌거나 응답하지 않는 애플리케이션을 자동으로 복구할 수 있게 해준다. - Readiness Probe (준비 상태 검사)
컨테이너가 외부에서 트래픽을 받을 준비가 되었는지 확인한다. 준비 상태가 되지 않으면 해당 Pod는 서비스 로드 밸런서에서 제외되어 트래픽을 받지 않게 된다. 이 프로브는 애플리케이션이 충분히 준비되지 않은 상태에서 트래픽을 처리하지 않는 역할을 한다. - Start Probe (시작 상태 검사)
컨테이너 애플리케이션이 시작되었는지 확인하는 프로브이다. 이 프로브가 활성화되면 컨테이너가 성공적으로 시작될 때까지 다른 프로브(활성, 준비)가 시작되지 않도록 한다. 이는 느리게 시작되는 애플리케이션에 유용하며, 컨테이너가 준비되기 전에 종료되지 않도록 방지한다.
프로브는 HTTP 요청, TCP 연결, 또는 명령 실행 등의 방식으로 수행될 수 있다.
프로브의 체크 메커니즘
- Exec Probe:
- 컨테이너 내부에서 명령 실행 후 반환 코드로 상태 확인
- 반환 값 0이면 성공, 그 외는 실패
- HTTP Probe:
- HTTP GET 요청의 응답 상태 코드가 200~399이면 성공
- 예외 상태 코드 반환 시 실패
- TCP Probe:
- 포트가 열려 있으면 성공, 닫혀 있으면 실패
- gRPC Probe:
- gRPC Health Check Protocol을 통해 컨테이너 상태 확인
- 응답 상태가 SERVING이면 성공
프로브와 관련된 주요 필드
- initialDelaySeconds : 컨테이너 시작 후 프로브 시작까지 대기 시간
- periodSeconds : 프로브 실행 주기
- timeoutSeconds : 프로브가 완료되지 않으면 실패로 간주되는 시간
- successThreshold : 프로브가 성공으로 간주되기 위한 연속 성공 횟수
- failureThreshold : 프로브가 실패로 간주되기 위한 연속 실패 횟수
- terminationGracePeriodSeconds : 실패한 컨테이너 종료 전 대기 시간
Liveness Probe
Exec Probe
- /tmp/healthy 파일이 있는지 확인하여 컨테이너의 활성 상태를 판단
apiVersion: v1
kind: Pod
metadata:
name: liveness-exec
spec:
containers:
- name: liveness
image: registry.k8s.io/busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5
HTTP Probe
- HTTP GET 요청으로 /healthz 경로 상태를 점검
apiVersion: v1
kind: Pod
metadata:
name: liveness-http
spec:
containers:
- name: liveness
image: registry.k8s.io/e2e-test-images/agnhost:2.40
args:
- liveness
livenessProbe:
httpGet:
path: /healthz
port: 8080
initialDelaySeconds: 3
periodSeconds: 3
TCP Probe
- TCP 소켓 연결로 포트 8080의 가용성을 점검
apiVersion: v1
kind: Pod
metadata:
name: liveness-tcp
spec:
containers:
- name: goproxy
image: registry.k8s.io/goproxy:0.1
ports:
- containerPort: 8080
livenessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 10
Readiness Probe
TCP Readiness Probe
apiVersion: v1
kind: Pod
metadata:
name: readiness-tcp
spec:
containers:
- name: goproxy
image: registry.k8s.io/goproxy:0.1
ports:
- containerPort: 8080
readinessProbe:
tcpSocket:
port: 8080
initialDelaySeconds: 15
periodSeconds: 10
Startup Probe
컨테이너 애플리케이션이 시작되었는지 확인하며, 성공할 때까지 다른 프로브(Liveness, Readiness)가 실행되지 않는다.
HTTP Startup Probe
apiVersion: v1
kind: Pod
metadata:
name: startup-http
spec:
containers:
- name: startup
image: registry.k8s.io/e2e-test-images/agnhost:2.40
startupProbe:
httpGet:
path: /healthz
port: 8080
failureThreshold: 30
periodSeconds: 10'kubernetes' 카테고리의 다른 글
| [Kubernetes] Volume(PV, PVC) (0) | 2024.12.04 |
|---|---|
| [kubernetes] Service & Ingress (0) | 2024.12.03 |
| [Kubernetes] Node Scheduling (nodeSelector, nodeName, Label/Taint/Toleration) (0) | 2024.12.03 |
| [Kubernetes] Label, Select & Annotation (0) | 2024.12.03 |
| [Kubernetes] Namespace (0) | 2024.11.29 |