Nginx의 Docker 컨테이너가 기본적으로 graceful shutdown이되어 조금 행복합니다.

3311 단어 nginx도커kubernetes
이 기사는 Nginx 공식 Docker Image이 컨테이너 종료시 기본적으로 graceful shutdown이 된 것이 기뻤다는 내용입니다. (1.19.5 이상)

전제 조건



아래와 같은 분들에게 조금이라도 기쁨이 전해지면 다행입니다.
  • docker stop, docker-compose 및 kubernetes로 컨테이너를 조작하고 운영하는 사람들
  • 컨테이너 종료시 502 오류가 허용되지 않는 서비스를 개발하는 사람들

  • graceful shutdown이란?



    위키 에 의하면 「프로그램이 중대한 에러를 검출해, 어떠한 제어에 의해 정상적으로 종료시키는 것」이라고 써 있습니다. 웹 서비스를 컨테이너로 제공하는 경우에 한정하면 다음과 같은 요구 사항이 될 것입니다.
  • 컨테이너가 종료되면 이미 존재하는 연결 및 요청 처리를 완료합니다.
  • 컨테이너가 종료 될 때 새로운 연결을 수락하지 않도록합니다

  • 지금까지 Nginx 컨테이너의 동작



    지금까지 (v1.19.4 이하) Nginx 컨테이너를 종료하면 SIGTERM シグナル가 전송되었습니다. (Nginx의 오류 로그 수준을 notice 이하로 볼 수 있습니다. 다음 로그는 v1.19.3의 경우)

    이것은, docker 나 Kubernetes 의 디폴트 동작으로 컨테이너 종료시에 SIGTERM シグナル 를 송신하기 (위해)때문에입니다.
    참조: docker stop , docker-compose , Kubernetes

    문제는 Nginx가 SIGTERM シグナル를 받으면 즉시 종료 동작으로 이동한다는 것입니다. ( Nginx 공식 부터)
    그 때문에, 디폴트 설정인 채로 운용하면 경우에 따라서는 502 에러가 나오는 경우도 있었습니다.

    지금까지의 해결 방법



    이 문제를 피하려면 Nginx 컨테이너에 SIGQUIT シグナル를 보내면 됩니다. ( Nginx 공식 부터)
    대표적인 방법은 다음과 같습니다.
  • Dockerfile에서 STOPSIGNAL 정의 덮어 쓰기
  • Kubernetes 매니페스트의 preStop 필드에서 SIGQUIT 신호 보내기

  • 약간의 일입니다만, 어느쪽이나 「그런 것 몰랐다!」라든가 「가공의 한 번거로움이 번거롭다・・・」라고 하는 것을 느끼고 있었습니다.

    앞으로의 해결 방법



    아무것도 하지 않아도 됩니다.
    Nginx 1.19.5 이상의 이미지는 상기의 STIOPSIGNAL 의 정의를 덧쓰기되어 디폴트로 SIGQUIT シグナル 가 송신됩니다. (이하 v1.19.5의 경우)

    이렇게하면 graceful shutdown을 위해 Dockerfile을 괴롭히거나 preStop을 정의 할 필요가 없습니다.
    조금 기쁘다.

    요약



    graceful shutdown이 요구 사항 서비스에서 Nginx 컨테이너를 사용하는 경우 v1.19.5 이상을 사용하면 조금 더 쉬울 수 있습니다.
    그러나 구성이나 도구에 따라 Nginx 단위의 graceful shutdown이 요구 사항을 충족하지 못할 수 있습니다.

    좋은 웹페이지 즐겨찾기