이 글은 pod의 우아한 종료(graceful shutdown)의 중요성을 설명합니다.
1. 우아한 종료(graceful shtudown)
pod가 갑자기 종료되면 pod가 실행하고 있는 작업은 어떻게 될까요? pod가 없어졌으니 당연히 작업이 사라집니다. 따라서 작업은 실패합니다.
pod가 종료되어서, pod가 실행중인 작업이 중지되어 작업이 실패하는 상황을 안전하지 않는 종료라고 합니다. 우아한 종료는 pod가 실행중인 작업을 안전하게 종료한 후, pod를 종료시키는 것을 의미합니다.
2. 우아하지 않는 종료 예
우아하지 않는 종료 대표적인 예가 웹 애플리케이션 pod입니다. 웹 애플리케이션 pod가 종료되면 현재 연결되어 있는 세션이 끊겨, ingress 또는 (쿠버네티스)service는 연결이 끊깁니다. 따라서 클라이언트는 502에러가 발생합니다.
예제는 nginx deployment와 ingress를 사용했습니다. curl을 사용해서 0.1초마다 ingress host를 호출하여 테스트를 진행했습니다.
deployment를 rollout을 하면 약 1~2초 동안 curl응답에서 502에러가 보입니다. 502에러는 pod가 종료되어 세션이 끊길 때 발생합니다. 504는 pod 개수가 0개일 때 발생하는데 예제에서 replica가 0개였습니다.
while true; do http_code=$(curl -s -o /dev/null -w "%{http_code}" https://xxxxxxx); echo "HTTP Code: $http_code"; sleep 0.1; done
3. 우아한 종료 설정
컨테이너의 prestop hook을 사용하면 pod를 안전하게 종료하게 할 수 있습니다. prestop은 SIGTERM이벤트가 발생하면 실행하는 작업입니다. 보통 컨테이너 작업이 끝날 때까지 기다리는 sleep함수를 사용하고 웹 소켓 등 세션 종료 처리하는 작업이 있습니다.
주의사항은 prestop 작업시간은 terminationGracePeriodSeconds보다 작아야 합니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
terminationGracePeriodSeconds: 60
containers:
- name: nginx
image: nginx
resources:
limits:
memory: "64Mi"
cpu: "0.1"
ports:
- containerPort: 80
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 30"]
'전공영역 공부 기록' 카테고리의 다른 글
EKS upgrade in-place방식에서 가장 걱정했던 것 (3) | 2024.07.01 |
---|---|
karpenter on-demand:ratio 분배 설정 (3) | 2024.06.22 |
curl 명령어 생성은 chatgpt 4.o로! (0) | 2024.06.16 |
pycharm에서 Tab 크기를 2로 설정하는 방법 (0) | 2024.06.09 |
pycharm에서 Django 실행하는 방법 (0) | 2024.06.09 |