전공영역 공부 기록

kubernetes graceful shtudown이 중요한 이유

악분 2024. 6. 16. 20:51
반응형

이 글은 pod의 우아한 종료(graceful shutdown)의 중요성을 설명합니다.
 

 
 

1. 우아한 종료(graceful shtudown)

pod가 갑자기 종료되면 pod가 실행하고 있는 작업은 어떻게 될까요? pod가 없어졌으니 당연히 작업이 사라집니다. 따라서 작업은 실패합니다.
 
pod가 종료되어서, pod가 실행중인 작업이 중지되어 작업이 실패하는 상황을 안전하지 않는 종료라고 합니다. 우아한 종료는 pod가 실행중인 작업을 안전하게 종료한 후, pod를 종료시키는 것을 의미합니다.
 

2. 우아하지 않는 종료 예

우아하지 않는 종료 대표적인 예가 웹 애플리케이션 pod입니다. 웹 애플리케이션 pod가 종료되면 현재 연결되어 있는 세션이 끊겨, ingress 또는 (쿠버네티스)service는 연결이 끊깁니다. 따라서 클라이언트는 502에러가 발생합니다.

예제 쿠버네티스는 AWS EKS이고 ingress는 AWS ALB를 사용

 
예제는 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"]
반응형