0. Intro
Kubernetes에서는 Liveness, Readiness, and Startup Probes 라는 세 가지 타입의 probe를 제공하여, 애플리케이션의 상태를 체크하고, 이를 바탕으로 컨테이너를 관리한다. 각 프로브는 서로 다른 목적으로 사용되며, 동작 방식과 사용 시나리오에 있어서도 차이가 있다.
자세히 알아보자.
Kubernetes Docs: Configure Liveness, Readiness and Startup Probes
1. Liveness Probe
- 목적: 컨테이너가 실행 중인지 확인한다. 즉, 애플리케이션이 살아있는(live) 상태인지를 검사한다.
- 동작: livenessProbe가 실패하면, Kubernetes는 컨테이너가 더 이상 정상적으로 작동하지 않고 있음을 간주하고, 해당 컨테이너를 자동으로 재시작 한다. 이는 시스템이 자체적으로 문제를 해결할 수 있도록 하는 자동 복구 메커니즘이다.
- 사용 시나리오: 애플리케이션이 데드락(deadlock) 상태에 빠졌거나, 응답이 없는 상태로 멈춰있는 경우에 사용된다. Liveness Probe를 사용하면 이러한 상황에서 컨테이너를 자동으로 재시작하여 애플리케이션을 복구할 수 있다.
2. Readiness Probe
- 목적: 컨테이너가 요청 을 받아들일 준비가 되었는지를 확인한다. 즉, 애플리케이션이 준비된(ready) 상태인지를 검사한다.
- 동작: readinessProbe가 실패하면, Kubernetes는 해당 컨테이너가 아직 서비스 요청을 처리할 준비가 되지 않았다고 판단하고, 새로운 트래픽을 보내지 않는다. 하지만 컨테이너는 재시작되지 않는다.
- 사용 시나리오: 애플리케이션이 초기화 과정에서 외부의 데이터베이스에 연결하거나, 필요한 설정을 로드하는 등의 작업을 수행해야 할 때 사용된다. 이때, 초기화 작업이 완료될 때까지 컨테이너를 트래픽으로부터 분리시켜 주는 역할을 한다.
3. Startup Probe
- 목적: 애플리케이션이 시작하는 데 시간이 오래 걸릴 경우, 그 애플리케이션이 정상적으로 시작 되었는지를 확인한다.
- 동작: Startup Probe가 성공할 때까지, Kubernetes는 Liveness와 Readiness Probes를 무시한다. 이는 애플리케이션이 긴 초기화 과정을 필요로 할 때, 너무 일찍 재시작하거나 요청을 받아들이지 않는 것을 방지한다. Startup Probe가 실패하면, 컨테이너를 재시작 한다.
- 사용 시나리오: 애플리케이션이 시작 시 많은 데이터를 로드하거나, 복잡한 초기화 작업을 수행해야 할 때 사용된다. 이는 애플리케이션이 시작하는 데 필요한 충분한 시간을 제공하여, 준비가 완료될 때까지 Kubernetes가 기다리도록 한다.
4. Summary
- 목적:
- Liveness Probe는 애플리케이션이 실행 중인지 확인한다.
- Readiness Probe는 애플리케이션이 요청을 처리할 준비가 되었는지 확인한다.
- Startup Probe는 애플리케이션이 시작하는 데 필요한 시간을 고려하여, 정상적으로 시작되었는지를 확인한다.
- 재시작 여부:
- Liveness와 Startup Probes가 실패하면 컨테이너가 재시작된다.
- Readiness Probe는 재시작 없이 트래픽을 보내지 않는다.
- 사용 시나리오:
- Liveness Probe는 애플리케이션이 멈추거나 데드락에 빠진 경우 사용된다.
- Readiness Probe는 애플리케이션이 요청을 받을 준비가 되었는지 확인하기 위해 사용된다.
- Startup Probe는 애플리케이션이 시작하는 데 오랜 시간이 걸릴 경우에 사용된다.
5. Examples
5.1 Startup Probe
apiVersion: v1
kind: Pod
metadata:
name: postgres-startup
spec:
containers:
- name: postgres
image: postgres:latest
env:
- name: POSTGRES_USER
value: "postgres"
- name: POSTGRES_PASSWORD
value: "postgres"
- name: POSTGRES_DB
value: "postgres"
ports:
- name: postgres
containerPort: 5432
protocol: TCP
startupProbe:
exec:
command:
- sh
- -c
- >
PGPASSWORD=$POSTGRES_PASSWORD psql -U $POSTGRES_USER -d $POSTGRES_DB -c '\q'
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 10
5.2 Liveness & Readiness Probes
apiVersion: v1
kind: Pod
metadata:
name: minio
spec:
containers:
- name: minio
image: minio/minio:latest
env:
- name: MINIO_ROOT_USER
value: "minio"
- name: MINIO_ROOT_PASSWORD
value: "minio123"
ports:
- name: api
containerPort: 9000
protocol: TCP
- name: console
containerPort: 9001
protocol: TCP
command:
- server
- /data
- --console-address
- :9001
livenessProbe:
httpGet:
path: /minio/health/live
port: api
initialDelaySeconds: 5
periodSeconds: 10
readinessProbe:
httpGet:
path: /minio/health/ready
port: api
initialDelaySeconds: 5
periodSeconds: 10
6. Liveness Probe vs Startup Probe
6.1 목적
- Liveness Probe는 컨테이너가 정상적으로 실행 중인지 확인하여, 비정상 상태에 빠졌을 때 재시작하는 데 중점을 둔다.
- Startup Probe는 애플리케이션이 초기화되는 동안의 상태를 확인하여, 초기화 과정에서 문제가 발생하면 재시작하는 데 중점을 둔다.
6.2 활성화 시점
- Liveness Probe는 컨테이너가 시작된 후 지속적으로 작동한다.
- Startup Probe는 애플리케이션이 처음 시작될 때만 작동하며, 초기화가 완료되면 Liveness Probe와 Readiness Probe로 전환된다.
6.3 사용 시나리오
- Liveness Probe는 애플리케이션이 실행 중 발생할 수 있는 문제를 감지하고 처리하기 위해 사용된다.
- Startup Probe는 애플리케이션의 초기화 과정에서 발생할 수 있는 문제를 감지하고 처리하기 위해 사용된다.
7. Startup Probe vs Init Containers
7.1 Startup Probe
- 목적: 애플리케이션이 시작하는 데 시간이 오래 걸릴 경우, 그 애플리케이션이 정상적으로 시작되었는지를 확인한다. 그리고 애플리케이션이 완전히 시작되어 준비될 때까지 Kubernetes가 애플리케이션을 죽이지 않도록 막아준다.
- 동작:
- 애플리케이션이 시작하고 정상적으로 작동할 준비가 되었는지 확인한다.
- Startup Probe가 성공하면, Kubernetes는 Liveness와 Readiness Probes를 정상적으로 시작한다.
- 실패할 경우, Kubernetes는 애플리케이션을 재시작한다.
- 설정된 주기와 타임아웃에 따라 반복적으로 실행될 수 있다. 그러나 일단 성공하면 더 이상 실행되지 않는다.
7.2 Init Containers
- 목적: 일반 컨테이너가 시작되기 전에 실행되는 특별한 종류의 컨테이너이다. Pod 내의 다른 컨테이너들이 시작되기 전에 실행되어야 하는 초기화 작업이나 설정 작업을 수행 하는 데 사용된다.
- 동작:
- Pod 내의 메인 애플리케이션 컨테이너들이 시작되기 전에 먼저 실행된다.
- 모든 Init Container가 성공적으로 완료되어야만 메인 컨테이너들이 시작될 수 있다.
- Init Container가 실패하면, Kubernetes는 전체 Pod를 재시작한다.
- InitContainers는 정의된 순서대로 차례차례 실행되며, 하나의 InitContainer가 성공적으로 완료되어야 다음 InitContainer 또는 일반 컨테이너가 시작된다.
- InitContainers는 Pod 시작 시에 한 번만 실행된다.
7.3 Summary
- 실행 시기:
- Startup Probes는 애플리케이션 컨테이너가 시작된 후에 애플리케이션이 올바르게 실행될 준비가 되었는지를 검사한다.
- 반면, Init Containers는 메인 애플리케이션 컨테이너들이 시작되기 전에 필요한 모든 초기화 작업을 수행한다.
- 재시작 정책:
- Startup Probe 실패 시 애플리케이션 컨테이너가 재시작된다.
- Init Container 실패 시 전체 Pod가 재시작된다.
- 사용 목적:
- Startup Probes는 애플리케이션이 서비스 준비를 완료했는지 확인하는 데 초점을 맞춘다.
- Init Containers는 메인 애플리케이션 컨테이너 실행 전에 필요한 사전 작업을 수행하는 데 사용된다.