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를 조회할 때 함께 표기됨.
&nbsp

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

Reference