Kubernetes Pod 정상상태 점검 - Probe 사용

서준석·2021년 3월 22일
0

더 많은 글은 여기에 : https://litiblue.com


프로세스는 떠 있음에도 불구하고 어플리케이션이 제대로 실행되지 않는 경우가 있다

무한 루프, 데드락, DB 접속 등 문제가 있는 경우가 그에 해당하고 probe 사용하여 k8s에서 관리하도록 한다

probe 종류

  • liveness probes
    • 언제 컨테이너를 재시작할 것인지 감지
    • 예를 들면 데드락에 걸렸을 경우 어플리케이션이 실행되고 있긴 하지만 더 이상 진행이 불가하다
    • 이 경우 컨테이너를 재시작하여 복구할 수 있다
  • readines probes
    • 언제 트래픽을 받을 준비가 되었는지 감지
    • 준비가 되지 않은 경우 서비스 로드밸런서에서 제거 됨
  • startup probes
    • 어플리케이션이 시작되었음을 감지
    • 느리게 시작되는 컨테이너의 liveness 체크

정상 상태 확인 방법

  • HTTP 점검 : 컨테이너 IP 주소에 HTTP GET 요청을 수행하며 200과 399 사이의 성공적인 HTTP 응답 코드를 기대
  • TCP 소켓 : 성공적인 TCP 연결을 가정
  • Exec 점검 : 컨테이너에서 임의의 명령을 실행하고 성공적인 종료 코드(0)를 기대

probe 옵션

  • periodSeconds : 지정한 시간 마다 probe 수행
  • initialDelaySeconds : 첫 번째 probe 수행 전 까지 기다림

doai-engine-karyo 에 startup probes 적용

  • doai-engine-karyo 는 Python 으로 개발된 AI 모델 서버로 최초 실행시 3개의 모델 파일을 다운로드 한다
A       detection/mask_rcnn/weight/model_final.pth
A       classification/weight/atonce/resnet_best.pth
A       data.tar.gz
3 files added and 3 files fetched

rabbitmq start
flask start!

* Running on http://0.0.0.0:8081/ (Press CTRL+C to quit)
* Restarting with stat

172.20.1.104 - - [22/Dec/2020 08:07:43] "GET /ready HTTP/1.1" 204 -
  • 위 실행 로그를 보면 모델 파일 다운로드가 끝난 후에 flask 를 실행하는 것을 확인할 수 있다
  • 버전 업데이트 시 새 버전의 pod 를 띄울 경우 즉시 준비 완료된 것으로 가정하여 k8s 가 이전 버전 pod 를 종료한다
  • 새 pod 의 프로세스가 떠 있기는 하지만 모델을 다운 받고 flask 를 구동하기 까지 시간이 걸리기 때문에 이 시간 동안에는 아무 것도 처리할 수 없어 서비스 중단이 발생한다
  • flask 가 준비 되었는지 확인하기 위한 /ready API 를 추가한 뒤 startupProbe 에서 사용하도록 했다

추가 된 코드

  • AI 모델 서버 doai-engine-karyo 에 다음 부분을 추가
@rest_api.route("/ready", methods=["GET"])
def ready():
    return "", 204
  • k8s 설정파일 deployment.yaml 에 다음 부분을 추가
startupProbe:
  httpGet:
    path: /ready
    port: 8081
  initialDelaySeconds: 60
  failureThreshold: 60
  periodSeconds: 60
  timeoutSeconds: 10

동작 과정

  • 최초 실행 후 60초를 기다린 다음 60초에 한 번 씩 probe 를 수행한다
  • 일단 한 번 성공 하면 더 이상 probe 를 수행하지 않는다
  • 실패하면 카운터가 하나씩 증가하고 그 값이 60을 넘어가면 실패로 간주하여 컨테이너를 재시작한다
  • 예를 들어 모델을 다운 받고 flask 가 실행되기 까지 30분이 걸린다고 했을 때
  • 30번 probe 가 실패하고 31번째 성공하여 준비완료 상태로 바뀐다

0개의 댓글