본문 바로가기

Cloud/Docker, Kubernetes

[쿠버네티스] HealthCheck 실패로 인해 컨테이너 재기동 되는 현상

#. 참고 글

https://bcho.tistory.com/m/1264

 


 

쿠버네티스 환경에서 JBoss를 운영 중인 고객사가 있다.

로그에 아무런 에러가 없는데, 갑자기 쿠버네티스 측에서 shutdown 스크립트를 실행시키는 일이 있었다.

원인은 다음과 같았다.

 

01.

JBoss Thead Pool Max 값이 32로 꽤나 낮게 설정 되어있었다.

여러 개의 컨테이너를 올려서 운영하므로 개별 컨테이너의 Max값은 낮게 책정한 것.

 

02.

서비스 부하로 인해 Thread Pool Max에 도달한 상태에서

쿠버네티스 측에서 HTTP GET 방식으로 health check를 실행하였다.

쿠버네티스가 보낸 요청은 처리되지 못하고 우선 queue에 쌓이게 된다.

 

03.

쿠버네티스가 URL을 통해 HTTP GET 메소드를 호출하며,

response 받기 까지 10초 대기하도록 되어있었다.

실패하면 5초 뒤 재시도 하며, 총 3번 실패 시 shutdown 스크립트가 실행된다.

 

04.

앞서 들어온 요청을 순차대로 처리하느라

쿠버네티스가 보낸 HTTP GET 요청은 10초가 지나도록 처리되지 못하고 실패 처리되었다.

이 현상이 3번 반복된 후 JBoss 컨테이너가 비정상 상태로 간주되어 재기동 처리되었다.

 


 

<Health Check 방법>

 

#01. HTTP GET 메소드 호출

HTTP 응답 코드가 200~300 사이라면 컨테이너를 정상 상태인 것으로 판별한다.

 


 

#02. TCP Socket 호출

서비스 포트가 Listen 상태인지만 체크하는 방식.

TCP Port로 연결을 시도하고, 연결이 성공하면 컨테이너를 정상 상태로 판별한다.

HTTP GET 호출 방식과 비교했을 시에는 컨테이너 상태가 정상인지 판별하는 것이 보다 부정확할 수 있을 것으로 보인다.

Port는 Listen 상태이지만 실제 WAS 컨테이너 내부에서는 OutOfMemoryError 등이 발생하여

실제로는 정상 상태가 아닐 수 있기 때문.

 


 

고객사 업무 환경을 고려하여

둘 중에 적절한 옵션을 사용하도록 하자