KeiStory

Docker Pod 배포 시 Pod 중지되기 전 특정 작업 수행하기

 

Pod를 배포하거나 특정한 이유로 중지할 때, Pod가 중지되기 전에 반드시 수행해야 하는 작업이 있는 경우, 이를 처리하는 방법이 필요합니다.

저 같은 경우는 서버에서 비동기 작업을 수행 중일 때, Pod가 중지되기 전에 해당 비동기 작업을 멈추고, 현재 상태를 데이터베이스(DB)에 저장해 두었다가, Pod가 재시작될 때 중지되었던 작업을 이어서 수행하기 위해 사용했습니다.

이러한 작업을 처리하는 방법 중 하나는 Kubernetes의 "PreStop" 훅을 사용하는 것입니다. PreStop 훅을 사용하면 Pod가 중지되기 전에 특정 스크립트나 명령어를 실행할 수 있습니다.

cd.yaml 파일에 아래와 같이 lifecycle 을 설정합니다.

apiVersion: v1
kind: Pod
metadata:
  name: example-pod
spec:
  containers:
  - name: example-container
    image: nginx
    lifecycle:
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo 'Cleaning up...' && sleep 10"]

 

preStop 훅의 사용 예

1. 서비스 연결을 안전하게 종료하기 위해 필요할 수 있습니다.

2. 외부 서비스나 데이터베이스에 Pod의 종료 상태를 업데이트할 수 있습니다.

3. 종료 전에 필요한 데이터를 파일로 저장하거나 다른 저장소에 업로드할 수 있습니다.

 

Graceful Shutdown과 함께 사용

PreStop 훅은 Pod의 Graceful Shutdown과 함께 작동합니다. Pod가 중지 신호를 받으면, Kubernetes는 해당 Pod의 terminationGracePeriodSeconds에 설정된 시간 동안 종료를 기다리며, 이 동안 PreStop 훅을 실행합니다.

 

Pod 중지 시나리오에서 주의할 점

PreStop 훅이 실행되는 동안 컨테이너는 여전히 요청을 받을 수 있기 때문에, 서비스에서 더 이상 요청을 받지 않도록 설정하는 것이 필요할 수 있습니다.

PreStop 훅에서 실패하거나 너무 오래 걸리는 작업이 있다면, terminationGracePeriodSeconds 값을 조정하여 필요한 시간을 확보하는 것이 중요합니다. terminationGracePeriodSeconds 은 기본 30초 이면 이를 변경하기 위해서 아래처럼 설정합니다.

apiVersion: v1
kind: Pod
metadata:
  name: graceful-shutdown-pod
spec:
  terminationGracePeriodSeconds: 30
  containers:
  - name: example-container
    image: nginx
    lifecycle:
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo 'Cleaning up...' && sleep 10"]

 

아래는  preStop 에서 api 를 호출하는 예시입니다. 저는 아래의 방법으로 처리했습니다.

apiVersion: v1
kind: Pod
metadata:
  name: graceful-shutdown-pod
spec:
  terminationGracePeriodSeconds: 60
  containers:
  - name: example-container
    image: nginx
    lifecycle:
      postStart:
        httpGet:
          port: 80
          path: Api/Stop

 Pod 가 멈추기전에  Api/Stop api 를 호출하게 됩니다.

 

참고

https://wangwei1237.github.io/Kubernetes-in-Action-Second-Edition/docs/Executing_actions_at_container_startup_and_shutdown.html

 

6.3 Executing actions at container start-up and shutdown · Kubernetes实战(第二版)

TIP Because the state of a pod can change quickly, inspecting just its status may not tell you everything you need to know. Rather than inspecting the state at a particular moment in time, reviewing the pod’s events is usually a better way to get the ful

wangwei1237.github.io

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band