카카오 DKOS 운영진이 전하는 Kubernetes 무중단 배포 핵심: Graceful Shutdown과 옵션 설정
·2018.12.24 00:00
핵심 내용
카카오 DKOS 운영 경험을 바탕으로 Kubernetes 배포 시 트래픽 유실(502 에러)을 방지하기 위한 Graceful Shutdown 구현과 maxSurge, readinessProbe, preStop Hook 등 핵심 옵션 설정법을 소개한다.
1 / 8
자세히 보기
Kubernetes는 컨테이너 오케스트레이션 표준으로, 배포 중 트래픽 유실 없이 서비스를 지속하기 위해선 클러스터 레벨의 옵션 설정과 컨테이너 내부의 Graceful Shutdown 구현이 모두 중요하다.
-
Graceful Shutdown: Kubernetes는 Pod 종료 시 kubelet을 통해 SIGTERM 시그널을 보낸다. 컨테이너 내 애플리케이션은 이 신호를 수신해 진행 중인 요청을 마무리하고 종료해야 한다. 이를 구현하지 않고 즉시 종료될 경우, 원문에 따르면 약 **17.44%**의 요청에서 502 에러가 발생할 수 있다. 기본 대기 시간은
terminationGracePeriodSeconds(기본 30초)로 설정되며, 초과 시 SIGKILL로 강제 종료된다. -
Kubernetes 배포 옵션:
- maxSurge & maxUnavailable: 롤링 업데이트 중 추가 가능한 Pod 수(maxSurge)와 허용 불가용 Pod 수(maxUnavailable)를 조절하여 항상 일정 개수 이상의 Pod가 트래픽을 처리하도록 보장한다. 두 값을 모두 0으로 설정할 수는 없다.
- readinessProbe: Pod가 실제 서비스 준비가 되었는지 확인하는 헬스체크다. Java 등 초기화 시간이 긴 애플리케이션은 livenessProbe만으로는 부족하며, readinessProbe가 OK 상태가 되어야 Service에 IP가 등록되어 트래픽을 받을 수 있다. 설정이 어려운 경우
.spec.minReadySeconds를 사용해 최소 대기 시간을 확보할 수 있으나, readinessProbe가 완료되면 해당 시간은 무시된다. - preStop Hook: 애플리케이션 수정이 어려운 레거시 시스템의 경우, SIGTERM 전송 직전에 실행되는 preStop Hook을 사용하여 대기 시간을 확보하고 Graceful Shutdown 효과를 모방할 수 있다. 단,
terminationGracePeriodSeconds를 초과하지 않도록 주의해야 한다.
이 한국어 요약은 AI가 자동으로 만들었습니다. 원문의 주장과 맥락은 원문에서 확인해 주세요. 저작권은 원저작자에게 있습니다.