Status와 Conditions
쿠버네티스에서 Pod Status와 Conditions 은 파드의 상태를 확인하는 가장 기본적인 방법이다.
 
Pod Status
kubectl get pods
- 상태 예시
- Pending - 스케줄러가 파드를 스케줄링할 노드를 찾지 못 하면
- ContainerCreating - 스케줄링되면, 이미지를 받아 컨테이너를 실행하는 상태
- Running - 실행 중
 
Pod Condition
kubectl describe pods
- Pod Status 에 비해 더 세부적인 현상태를 조회할 수 있음.
- 4가지 상태 카테고리를 True/False 로 나타냄.
- PodScheduled - 파드가 노드에 스케줄 됨.
- Initialized - 초기화 컨테이너가 성공적으로 실행완료 됨.
- ContainersReady - 파드 내 모든 컨테이너가 준비 됨.
- Ready
- 컨테이너 내 애플리케이션이 실행 중.
- Pod Status를 조회할 때 함께 표기됨.
 
Note : Ready Condition 에 대한 주의사항
실제 애플리케이션 상태와 Ready Condition의 괴리
- 애플리케이션에 따라 실제로 사용할 수 있기까지 수초 이상의 시간이 더 걸릴 수 있음.
- 그러나 쿠버네티스는 Pod condition을 Ready 로 표기하는 경우가 있음.
- 이 경우, 쿠버네티스는 파드 배포를 완료하여 유저 트래픽을 허용하고 요청을 받지만, 유저는 애플리케이션에 접근할 수 없는 상황이 발생함.
Probes
개발자는 실제로 파드가 Ready 상태인지 확인할 수 있도록 Probe를 띄울 수 있음. Readiness Probe, Liveness Probe가 존재함.
Readiness Probe
Pod 정의 과정에서 readinessProbe
를 설정하면, 개발자는 Probe를 통해 의도한 결과를 얻기 전까지는 쿠버네티스는 Pod condition을 Ready로 표시하지 않음
예시)
- 웹 애플리케이션일 경우 HTTP test를 수행
- 데이터베이스일 경우 TCP소켓이 반응하는지 테스트
- 테스트 스크립트가 성공적으로 실행 및 종료 되는지 테스트
# ex) pod-definition.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-webapp
labels:
name: my-webapp
spec:
containers:
- name: my-webapp
image: my-webapp
ports:
-containerPort: 8080
readinessProbe:
# HTTP 테스트
httpGet:
path: /api/ready
port: 80
# 초기 실행되는 시간이 있음을 인지하고 있는 경우, 다음과 같이 설정 가능
initialDelaySeconds: 10
# 반복 수행 주기 설정
periodSeconds: 5
# 반복 수행 횟수 상한 설정 (설정하지 않는 경우 디폴트 3회)
failureThreshold: 10
# TCP 테스트
tcpSocket:
port: 3306
# 스크립트 실행 커맨드
exec:
command:
- cat
- /app/is_ready.sh
Liveness Probe
애플리케이션 내부 코드의 버그 또는 그 외 예상치 못 한 문제로 인해 컨테이너 자체는 실행 중이지만 애플리케이션이 준비가 되지 못 한 경우가 발생할 수 있음. 무한대로 로딩되는 경우도 마찬가지.
이러한 경우 컨테이너는 재시작이 되거나 배포를 중지하고 내려야 하는 상황이 생김. Readiness Probe와 마찬가지로 테스트를 수행하여, 애플리케이션이 제대로 실행 중인지 테스트할 수 있음.
예시)
- 웹애플리케이션일 경우 HTTP health check을 날려봄
- 데이터베이스일 경우 TCP소켓이 반응하는지 테스트
- 테스트 스크립트가 성공적으로 실행 및 종료 되는지 테스트
# ex) pod-definition.yaml
apiVersion: v1
kind: Pod
metadata:
name: my-webapp
labels:
name: my-webapp
spec:
containers:
- name: my-webapp
image: my-webapp
ports:
-containerPort: 8080
livenessProbe:
# http test
httpGet:
path: /api/health
port: 8080
# 초기 실행되는 시간이 있음을 인지하고 있는 경우, 다음과 같이 설정 가능
initialDelaySeconds: 10
# 반복 수행 주기 설정
periodSeconds: 5
# 반복 수행 횟수 상한 설정 (설정하지 않는 경우 디폴트 3회)
failureThreshold: 10
# TCP Test
tcpSocket:
port: 3306
# Execution command
exec:
command:
- cat
- /app/is_healthy.sh