포드 상태
1. Pending
포드가 처음 생성된 상태다.
포드 배치 여부를 파악하며, 쿠버네티스가 포드를 배치할 노드를 찾지 못하면 Pending 상태를 유지한다.
아래 명령으로 Pending 상태가 유지되는 원인을 확인할 수 있다.
kubectl describe pod <POD_NAME>
2. ContainerCreating
포드가 스케쥴링되어서 이미지를 pull하고, 컨테이너를 시작하는 상태다.
3. Running
포드 내 모든 컨테이너를 시작하여 포드가 실행 중인 상태다.
프로그램이 완료되거나 종료될 때까지 상태를 유지한다.
Pod 상태는 아래와 같이 get pods 명령으로 확인할 수 있다.
kubectl get pods
Pod Conditions
TRUE/FALSE 값으로 포드의 상태를 알려주는 배열
Type | Status | 설명 |
PodScheduled | True/False | Pod가 노드에 스케쥴되었다. |
Initialized | True/False | 모든 초기화 컨테이너가 성공적으로 시작되었다. |
ContainersReady | True/False | 파드의 모든 컨테이너가 준비되었다. |
Ready | True/False | 파드는 요청을 처리할 수 있는 상태다. |
Conditions는 describe pod 명령 결과 중 Conditions 부분에서 확인할 수 있다. 포드가 Ready 상태인지는 get pods 명령으로도 확인할 수 있다.
기본적으로 Ready 상태는 포드 내의 애플리케이션이 실행 중이며 사용자 트래픽을 수용할 준비가 되었음을 나타내지만, 정말로 애플리케이션이 준비된 상태임을 나타내는 것은 아니다. 엄밀히 따지자면 Pod의 상태를 나타내는 것이지, 포드 내의 애플리케이션의 상태를 나타내는 것은 아니기 때문이다.
포드의 컨테이너 내의 애플리케이션이 동작하기까지 시간이 걸리는 경우, 포드가 처음 실행하고 애플리케이션 접속을 시도하면 애플리케이션이 동작하고 있는 않은 상황을 만날 수 있다. 기본적으로 쿠버네티스 서비스는 포드가 실행 중이면 애플리케이션의 상태와 관계없이 트래픽을 전송하기 때문이다.
따라서 애플리케이션이 준비가 되었을 때 Ready 상태가 True로 변경되게끔, 애플리케이션 상태를 확인하는 readinessProbe를 사용할 필요가 있다.
readinessProbe
Probe란 컨테이너에서 kubelet에 의해 주기적으로 수행되는 진단(diagnostic)이다. 프로브는 3가지 종류(livenessProbe, readinessProbe, startupProbe)가 존재하며, 그 중 readinessProbe는 컨테이너가 요청을 처리할 준비가 되었는지 여부를 나타낸다.
프로브가 진단 수행 시 호출하는 핸들러는 아래와 같다.
- httpGet
지정한 포트 및 경로에서 컨테이너의 IP주소에 대한 HTTP Get 요청 수행
응답 상태 코드가 200 이상 400 이하이면 진단을 성공한 것으로 판단한다. - tcpSocket
지정된 포트에서 컨테이너의 IP주소에 대해 TCP 검사 수행
포트 활성화 시 진단을 성공한 것으로 판단한다. - exec
컨테이너 내에서 지정된 명령어 실행
응답 코드가 0이면 진단을 성공한 것으로 판단한다.
readinessProbe는 아래와 같이 포드 정의 파일에서 readinessProbe 항목을 추가하여 설정할 수 있다. 진단에 필요한 경로, 포트 번호, 명령어 등을 지정한다.
apiVersion: v1
kind: Pod
metadata:
name: simple-webapp
labels:
name: simple-webapp
spec:
containers:
- name: simple-webapp
image: simple-webapp
ports:
- containerPort: 8080
readinessProbe:
httpGet:
path: /api/ready
port: 8080
initialDelaySeconds: 10 # 프로그램 준비 시간을 알고 있다면 사용 가능
periodSeconds: 5 # 확인 시도 빈도 설정
failureTheshold : 8 # 확인 시도 횟수 설정. 기본값 3
이때, periodSeconds 항목을 진단 시도 빈도를 설정하며, failureThreshold는 진단 시도 횟수를 설정한다.
예시) TcpSocket
readinessProbe:
tcpSocket:
port: 3306
예시) Exec
readinessProbe:
exec:
command:
- cat
- /app/is_ready
readinessProbe를 설정하면 쿠버네티스는 진단이 성공한 것을 확인한 뒤에 Pod Ready Condition을 True로 설정한다. 즉, readinessProbe를 통해 쿠버네티스는 포드 내 애플리케이션이 아직 준비되지 않은 것을 확인할 수 있으며, 트래픽 또한 전달하지 않을 수 있게 된다.
애플리케이션이 준비에 시간이 걸리는 경우, readinessProbe 사용하지 않으면 새 replica를 배포할 때 일부 사용자는 서비스 중단을 경험할 수 있다. 하지만 readinessProbe 사용하면 포드와 포드 내 애플리케이션이 준비될 때까지 기존 포드에만 트래픽을 전달하다가, 포드와 애플리케이션 준비가 끝나면 새 포드에 라우팅되므로 사용자는 서비스 중단을 경험하지 않을 수 있다.