반응형
SMALL
[Issue] Graceful하지 못한 애플리케이션 운영
아래 동영상과 같이 Graceful Shutdown을 적용하지 않으면 애플리케이션이 재시작 또는 삭제되는 과정에서 진행중인 요청이 중단되어 사용자에게 오류가 발생하게된다.
[Configuration] Graceful Shutdown 설정 (Kubernetes)
※ 우선 실습을 위한 애플리케이션은 Spring boot로 작성하였으며, /long-running URI로 접근 시 10초 동안 대기 후 응답을 반환하는 간단한 spring boot 웹 애플리케이션을 작성 후 진행하였다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: graceful-deploy
namespace: graceful
spec:
replicas: 2
selector:
matchLabels:
app: graceful
template:
metadata:
labels:
app: graceful
version: v1
spec:
containers:
- name: graceful
image: 000000000000.dkr.ecr.us-east-2.amazonaws.com/graceful:v1
ports:
- containerPort: 8080
lifecycle:
preStop:
exec:
command: ["/bin/sh","-c","sleep 20"]
terminationGracePeriodSeconds: 30
애플리케이션 단에서 처리가 힘들 경우 Deployment 에 lifecycle과 terminationGracePeriodSeconds 옵션을 통해 Kubernetes 환경에서 간단히 해결할 수 있다.
lifecycle:
preStop:
exec:
command: ["/bin/sh","-c","sleep 20"]
terminationGracePeriodSeconds: 30
현재 샘플에서는 sleep을 사용하여 20초 정도 Delay 시켰으나, 다른 방식으로 컨테이너에 호출을해서 대기 시킬 수 있는 API 또는 명령어가 있을 경우 해당 방식으로 사용해도 무방한다.
추가로, 더 안전하게 Graceful Shutdown을 사용하려면 재시작이나 삭제가될 때 더 이상 트래픽이 들어오지 않도록 제한시키는 방법도 있다. (조만간 관련하여 글 올리겠습니다..)
lifecycle.preStop란? :컨테이너가 종료되기 직전에 실행되는 Hook이다. (exec 명령 실행, HTTP GET 요청 전송 지원)
동작과정: preStop Hook 실행 -> SIGTERM 시그널 발생 -> 컨테이너 종료
주의사항: terminationGracePeriodSeconds 시간 내에 완료되어야한다.
terminationgracePeriodSeconds란? Kubernetes에서 Pod를 안전하게 종료하기 위해 사용하는 설정이다.
동작과정: SIGTERM 신호 전송 후 지정된 시간 동안 대기한다. 만약 시간 내에 종료되지 않으면 SIGKILL 신호를 강제로 전송한다.
반응형
LIST
'Containers > Kubernetes' 카테고리의 다른 글
[Kubernetes] istio Service-Mesh 환경에서 Circuit Breaker 활용기 #1 (0) | 2024.10.30 |
---|
댓글