Kubernetes는 복제본 세트 카운트다운에서 TERM 신호를 사용합니다.
이것은 내 응용 프로그램에 매우 위험합니다.
저는 애플리케이션 서버를 종료하기 위해 자체 종료 메커니즘이 있는 Tomcat 애플리케이션 서버를 사용합니다.
운영 체제(Linux) 신호(9,15,...)를 jvm에 보내면 JVM은 jvm 내부의 스레드로 무엇을 해야할지 모르기 때문에 스레드가 성공적으로 완료되기 전에 종료됩니다.
Request -----> BackEnd API -----> [Process] -----> Response
^
Send TERM (Signal) while thread doing Process
Kubernetes 컨테이너 종료 메커니즘을 변경할 수 있는 방법이 있나요?
나는 쿠버네티스가 다음을 사용하길 원한다:
catalina.sh stop
답변1
이를 달성하는 한 가지 방법은 dumb-init를 사용하는 것입니다.
dumb-init는 좀비와 같은 문제를 처리하기 위해 컨테이너를 구축할 때 종종 좋은 방법입니다. 귀하의 경우에는 신호를 다시 매핑할 수도 있습니다.
Dockerfile에는 다음과 같은 내용이 있습니다.
CMD ["dumb-init", "--rewrite", "15:28", "/app/start.sh"]
확인 후 kill -l
해당 SIGINT
번호 여야 합니다 15
.
그런 다음 시작 스크립트에서 신호를 캡처 SIGWINCH
( )할 수 있습니다.28
#!/bin/sh
trap "cd /app ; catalina.sh stop" SIGWINCH
[your startup script]
exec $JAVA_HOME/bin/java ...
편집하다 보면 또 다른 대답이 받아들여지는 것을 볼 수 있습니다. 물론, 컨테이너 수명 주기 후크가 훌륭할 것 같습니다.
우선, 이 기능은 약 1년 동안 제공되었습니다. 클러스터 버전에 따라 사용하지 못할 수도 있습니다.
그런 다음 문제가 될 수 있는 API 기반 종료에서만 실행된다는 것을 알게 됩니다.
답변2
Kubernetes 수명 주기는 이러한 유형의 문제에 대한 좋은 솔루션입니다.
컨테이너 수명주기 후크