더 많은 글은 여기에 : 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번째 성공하여 준비완료 상태로 바뀐다