Liveness, Readiness and Startup Probes

Dongmin Lee·2024년 2월 10일
0

Kubernetes

목록 보기
8/10
post-thumbnail

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는 메인 애플리케이션 컨테이너 실행 전에 필요한 사전 작업을 수행하는 데 사용된다.

0개의 댓글