Kubernetes/Kubernetes Best Practices

[Scenario Playbook Ep.9] 🚀 Deployment 편 #4 | Liveness & Readiness Probe 설정

ygtoken 2025. 3. 16. 13:46
728x90

 

쿠버네티스에서 애플리케이션의 상태를 감지하고 장애 발생 시 자동 복구하는 방법은 필수적입니다.

이번 글에서는 Liveness Probe와 Readiness Probe를 활용하여 Pod의 상태를 감지하고, 장애 발생 시 대응하는 방법을 다룹니다.

 


📌 글에서 다루는 상황들

 

1️⃣ Liveness Probe를 이용한 Pod 자동 복구

2️⃣ Readiness Probe를 활용한 트래픽 제어

 

각 문제를 실무에서 바로 활용할 수 있도록 Manifest 템플릿과 예상 결과 값을 제공합니다.

 


1️⃣ Liveness Probe를 이용한 Pod 자동 복구

 

❓ 문제 상황

 

운영 중인 애플리케이션이 특정 상황에서 응답이 멈추거나, 장애가 발생하면 자동으로 복구되어야 합니다.

쿠버네티스에서 Liveness Probe를 설정하면, Pod이 정상적으로 동작하는지 감지하고 비정상적인 경우 자동으로 재시작할 수 있습니다.

Deployment의 이름은 web-liveness이어야 합니다.

Liveness Probe를 적용하여 Pod이 장애 상태일 경우 자동 재시작해야 합니다.

/healthz 엔드포인트를 이용하여 애플리케이션이 정상 작동하는지 감지해야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. Liveness Probe를 설정하여 애플리케이션의 상태를 감지해야 합니다.

HTTP 요청을 특정 엔드포인트(/healthz)로 보냄

일정 시간 동안 응답이 없으면 Pod을 자동으로 재시작

2. 초기 시작 후 일정 시간이 지나야 Probe가 동작하도록 설정해야 합니다.

initialDelaySeconds를 설정하여 애플리케이션이 완전히 기동될 시간을 확보

 


✅ 정답 Manifest (Liveness Probe 적용된 Deployment)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-liveness  # Deployment의 이름
spec:
  replicas: 2  # 기본 실행 Pod 개수
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:latest  # 웹 애플리케이션 컨테이너
        ports:
        - containerPort: 80
        livenessProbe:
          httpGet:
            path: /healthz  # /healthz 엔드포인트로 상태 확인
            port: 80
          initialDelaySeconds: 5  # 시작 후 5초 후부터 체크
          periodSeconds: 10  # 10초마다 체크

 

 


📌 적용 후 예상 결과 값

 

1. Deployment 생성 확인

kubectl get deployments

 

💡 예상 출력 값

NAME              READY   UP-TO-DATE   AVAILABLE   AGE
web-liveness      2/2     2            2          5s

 

2. Liveness Probe 실패 시 Pod 자동 재시작 확인

kubectl describe pod web-liveness-xxxxx | grep -A 5 "Liveness probe failed"

 

💡 예상 출력 값

Liveness probe failed:
Pod will be restarted...

 

 


2️⃣ Readiness Probe를 활용한 트래픽 제어

 

❓ 문제 상황

 

운영팀에서 애플리케이션이 특정 상태에서만 트래픽을 받을 수 있도록 설정하고 싶어 합니다.

애플리케이션이 완전히 기동되지 않았거나, 외부 서비스와의 연결이 실패한 경우, 트래픽을 받지 않도록 설정해야 합니다.

Deployment의 이름은 web-readiness이어야 합니다.

Readiness Probe를 적용하여 애플리케이션이 준비되지 않으면 트래픽을 받지 않도록 설정해야 합니다.

/ready 엔드포인트를 이용하여 애플리케이션의 준비 상태를 감지해야 합니다.

 

✅ 어떻게 해결할 수 있을까요?

 


🛠️ 해결 방법

 

1. Readiness Probe를 설정하여 애플리케이션이 정상적으로 준비되었을 때만 트래픽을 받을 수 있도록 설정해야 합니다.

HTTP 요청을 특정 엔드포인트(/ready)로 보냄

응답이 없으면 트래픽을 받지 않음

2. Liveness Probe와 Readiness Probe를 동시에 사용할 수 있습니다.

Liveness Probe는 애플리케이션이 정상적으로 동작하는지 감지하고, 이상 발생 시 재시작

Readiness Probe는 애플리케이션이 준비되지 않으면 트래픽을 받지 않도록 설정

 


✅ 정답 Manifest (Readiness Probe 적용된 Deployment)

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-readiness  # Deployment의 이름
spec:
  replicas: 2  # 기본 실행 Pod 개수
  selector:
    matchLabels:
      app: web
  template:
    metadata:
      labels:
        app: web
    spec:
      containers:
      - name: nginx
        image: nginx:latest  # 웹 애플리케이션 컨테이너
        ports:
        - containerPort: 80
        readinessProbe:
          httpGet:
            path: /ready  # /ready 엔드포인트로 서비스 준비 상태 확인
            port: 80
          initialDelaySeconds: 5  # 시작 후 5초 후부터 체크
          periodSeconds: 5  # 5초마다 체크

 

 


📌 적용 후 예상 결과 값

 

1. Deployment 생성 확인

kubectl get deployments

 

💡 예상 출력 값

NAME               READY   UP-TO-DATE   AVAILABLE   AGE
web-readiness      2/2     2            2          5s

 

2. Readiness Probe로 인해 준비되지 않은 Pod이 트래픽을 받지 않는지 확인

kubectl get pods -o wide

 

💡 예상 출력 값

NAME                   READY   STATUS    RESTARTS   AGE
web-readiness-1234     0/1     Running   0          5s  # 아직 준비되지 않음
web-readiness-5678     1/1     Running   0          10s

 

728x90