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 를 호출하게 됩니다.
참고
WSL2 에서 localhost 접근하는 방법 (0) | 2024.06.06 |
---|---|
Python requirements.txt 생성 및 설치 (0) | 2024.05.19 |
Grafana 에 json 템플릿 대시보드 import 하기 (0) | 2024.04.24 |
Grafana 대시보드에 Metric 표시하기 (0) | 2024.04.24 |
TypeScript 에서 API 호출하기 - fetch (0) | 2024.04.07 |