프로덕션 체크리스트

이 문서는 새롭게 작성한 서비스를 배포하기에 앞서 확인해야 할 사항들을 기술하고 있다. 쿠버네티스 환경에 신규 서비스를 배포하기에 앞서 작성한 서비스가 아래 사항들을 준수하는지 확인하는 것을 권장한다.

도커 이미지

프로덕션 환경에 배포되는 도커 이미지는 단순히 docker-compose up으로 개발환경을 구동할 수 있는 상태를 만드는 것 이상의 준비가 필요하다. 도커 문서를 참고하여 프로덕션 환경에 적합한 경량하고 안전한 도커 파일을 작성한다.

로그

모든 로그는 STDOUT 또는 STDERR으로 출력한다. 컨테이너화된 서비스는 서버나 메인 커맨드를 구동하는 단일 관심사에만 신경을 쓰고, 로그 파일이나 디렉토리에 대한 관리, logrotate 등의 사항은 컨테이너 오케스트레이션(쿠버네티스)으로 위임한다. 메트릭을 외부 스토리지로 전송하는 등의 요구사항이 있는 경우에도 fluentd 등을 사이드카 패턴으로 배포할 수 있지만 파드의 lifecycle 복잡도를 높이므로 반드시 필요한 경우를 제외하고는 권장하지 않는다. 향후 STDOUT으로 출력한 메트릭 로그를 S3에 아카이빙 한 이후 Airflow에서 메트릭을 따로 필터링해서 프로세싱하는 작업을 추가하는 방향을 고려할 수 있다.

환경변수

외부 서비스 인증 정보나 데이터베이스 접속 정보와 같은 애플리케이션의 중요한 설정은 환경변수로 컨트롤 할 수 있어야 한다. 이는 12 요소 앱에서 설명하는 설정에 해당하는 것으로, 쿠버네티스와 같은 컨테이너 오케스트레이션 환경에서는 빌드 아티팩트(컨테이너 이미지)와 설정을 분리하는 것이 쉬워지고, 시간이 지남에 따라 추가되는 배포환경(CI나 e2e 테스트 환경)을 코드 변경 없이 설정할 수 있다.

디펜던시

시스템 패키지나 언어별 의존성 패키지는 버전을 명시해서 고정시키는 것이 좋다. 버전이 모호하게 지정되어 있을 경우(예를 들어 메이져 버전까지만 명시된 경우), 시간이 지나 동일한 소스코드로 컨테이너 이미지를 빌드한 경우 이전에 빌드된 것과 다른 의존성 그래프를 가진 채로 빌드된다. package-lock.json과 같은 락파일을 버전 컨트롤 시스템을 이용해 관리하는 것이 좋다.

관리가 소홀해진 프로젝트는 의존성 패키지 버전이 뒤쳐지기 쉽다. dependabot같은 도구 이용해 지속적으로 패키지 버전을 리뷰하고 업데이트 할 수 있도록 한다.

README 작성

프로젝트의 README 파일에는 해당 애플리케이션에 대한 기본적인 사용법을 기술하여야 한다. 구동에 필요한 요구사항, 서버 시작, 마이그레이션 방법 등이 있다.

정상적인 종료(Graceful shutdown)

롤링 업데이트나 노드 드레인 등의 이벤트가 발생할 시 기존 파드는 종료(Terminating) 상태에 돌입한다. 운영 중인 파드가 종료되는 것은 쿠버네티스 환경에서는 일상적이고 흔하게 발생하는 일이다. 다만 개별 애플리케이션은 파드 종료를 정상적으로 핸들링할 의무를 지니게 된다.

애플리케이션은 SIGTERM 시그널을 받게 되면 더 이상 추가적인 요청을 받지 않고 기존에 처리 중인 요청을 마저 처리하고 프로세스를 종료하도록 하는 루틴을 작성해야 한다.

파드의 수명주기와 관련된 구체적인 내용은 구글 클라우드의 블로그의 Kubernetes best practices: terminating with grace를 참고.

Readiness Probe, Liveness Probe

각 애플리케이션은 정상 상태를 확인할 수 있는 방법을 제공해야 한다. 쿠버네티스는 정상 상태 확인에 대한 두 가지 방식을 제공한다.

  • readiness: applicaiton이 요청을 처리할 준비가 됐는지 체크한다. readiness probe가 성공적으로 응답하면 요청을 처리할 수 있다는 의미이다.
  • liveness: 애플리케이션이 문제가 있어서 재시작이 필요한 상태를 의미한다. liveness probe가 실패 응답을 내보내고 지정된 임계점을 넘으면 오케스트레이터는 파드를 재시작한다.

정상 상태 확인은 http 엔드포인트 뿐 아니라 커맨드 실행으로도 할 수 있다. grpc 서버의 경우 grpc-health-probe 프로토콜을 구현하여 grpc-health-probe 커맨드를 실행하는 방식으로 정상 상태 확인을 할 수 있다.

모니터링

이 외에도 에러 트래킹, APM(Applicaiton Performance Management) 등에 대한 설정이 필요하다.

TBD