DevOps/Kubernetes

[Kubernetes Study - 10] Pod - readinessProbe, livenessProbe

돌돌김 2021. 2. 22. 16:34

 

Pod의 기본적인 라이프 사이클

 

Pending → Running → Succeeded → Failed

  • Pending : 파드가 쿠버네티스 클러스터에서 승인되었지만 아직 컨테이너가 설정되지 않았음. 네트워크를 통한 컨테이너 이미지 다운로드 시간도 포함

 

Probe

  • Probe의 상태 : Success, Failure, Unknown

 

startupProbe : 어플리케이션이 시작 되었는지를 판단

 

startupProbe를 세팅한 경우, startupProbe가 OK신호를 보내줘야 readinessProbe 와 livenessProbe가 돌아간다.

 

 

readinessProbe : 컨테이너가 요청을 처리할 준비가 되었는지

 

Pod가 새로 배포되고 Running 상태여도 그 안에 있는 컨테이너에서 배포되는 어플리케이션도 재시작하고 구동하는데 걸리는 시간이 있기 때문에, 이 시간 동안은 어플리케이션에 접속을 하려고 하면 오류가 발생한다.

 

이를 막기 위해, ReadinessProbe가 어플리케이션이 구동되기 전까지는 서비스와 연결되지 않게 해준다. ReadinessProbe가 성공하기 전까지는 Pod가 Running 상태여도 ConainerReady, Ready가 false로 유지된다. 이렇게 false 상태로 유지되면 Service의 엔드포인트에서는 NotReadyAddr로 간주하여 Service에 연결하지 않는다.

 

successThreshold의 값에 맞는 성공 횟수를 반환하면 true가 되면서 Service에서 Endpoint의 연결이 정상적으로 동작한다.

  • 기본 상태는 Success이다. 실패 시, 엔드포인트 컨트롤러는 파드에 연관된 모든 서비스의 엔드포인트에서 파드의 IP주소를 제거한다.

주기적으로 호출되며 특정 파드가 클라이언트 요청을 수신할 수 있는지를 결정한다. 성공을 반환하면 컨테이너가 요청을 수락할 준비가 된 것이다. 

 

 

livenessProbe : 애플리케이션의 내부 상태를 체크(서버가 제대로 응답하는지, 컨테이너가 제대로 동작중인지)

 

Pod는 Running 상태이지만, 어플리케이션에 문제가 생겨서 접속이 안되는 경우를 감지한다.(ex, 메모리 오버플로 등) 문제를 감지하면 Pod를 재실행하게 만들어서 어플리케이션의 문제를 해결한다.

 

LivenessProbe는 비교적 자주 실행되야 하기 때문에 너무 많은 연산 리소스를 사용하면 안되고, 1초 내에 완료되야 한다.

  • 기본상태는 Success이다. 실패한다면 kubelet이 컨테이너를 죽이고 재시작하게 한다.
  • ReadinessProbe의 유형, 옵션은 동일하게 가져간다. HttpGet 기반으로 많이 쓰이는 듯 하다.

 

3가지 유형의 Handler
Readiness Probe (LivenessProbe에서도 동일) - 쿠버네티스(kubelet)에서 제공하는 기능

 

  • HTTP GET Probe : 지정한 포트 및 경로에서 컨테이너 IP 주소에 대한 HTTP GET요청 수행. 응답의 상태코드가 200이상 400미만이면 성공으로 간주.
    • 포트번호, Host, Path, http 헤더 등을 정의
  • TCP Socket Probe : 지정된 포트에서 컨테이너 IP주소에 대해 TCP 검사를 수행. 포트가 활성화 되어 있으면 성공으로 간주
  • Exec Probe : 특정 쉘 명령어를 날려서 확인. 명령어가 상태코드 0으로 종료되면 성공으로 간주

 

옵션 값

 

  • initialDelaySeconds : 최초 Probe를 만들기 전 딜레이 시간(default : 0초)
    • 이 값을 설정하지 않으면 컨테이너를 시작하자 마자 프로브를 시작한다. Pod가 만들어지고 어플리케이션이 구동하는데 어느정도 시간이 걸리므로 이 값은 꼭 설정해주는게 좋다.
  • periodSeconds : Probe를 체크하는 간격(default : 10초)
  • timeoutSeconds : 지정된 시간까지 결과가 와야함(default : 1초)
  • successThreshold : 몇번의 성공 결과를 받아야 성공한 것으로 할 것인지(default : 1회)
  • failurThreshold : 몇번의 실패 결과를 받아야 실패한 것으로 할 것인지(default : 3회)