[k8s] Pod의 생애주기와 ReadinessProbe, LivenessProbe

🔥Log·2024년 12월 11일
0

k8s

목록 보기
8/15

🧙‍♂️ Lifecycle 개요


1) Pod

Pod의 생애주기는 Status로 표현되는데, StatusPhaseCondition으로 구분이 된다.

Phase는 Pod가 현재 어떤 단계에 있는지를 나타내는 것이고, Condition은 그 단계에서 어떤 상태인지를 나타내는 것이다.

Phase 1: Pending

Pending 단계는 Pod와 Container가 생성되는 단계에 해당하고, 아래와 같은 Condition들이 있다.

  • PodSchesulded: Pod가 올라갈 노드가 정해지는 과정에 해당하고, 성공적으로 완료되면 true가 된다.
  • Initialized: initContainer에 명시된 컨테이너 초기화 스크립트가 성공적으로 끝났는지에 대한 값이고, 성공적으로 끝나면 true가 된다.

Phase 2: Running

Running 단계는 Pod와 Container가 실행되는 단계에 해당하고, 아래와 같은 Condition들이 있다.

  • ContainerReady (true or false)
  • Ready (true or false)

위 Condition들이 모두 true가 되어야 잘 실행된 것이다.

Phase 3: Succeeded

CronJob을 위한 Pod의 경우 작업이 모두 성공적으로 완료되면, Succeeded단계가 되는데, 이 때 ContainerReadyReady Condition은 모두 false가 된다.

Phase 4: Failed

CronJob을 위한 Pod에서 작업이 실행되다가 내부의 컨테이너가 하나라도 작업에 실패한 경우, Failed단계가 되는데, 이 때 ContainerReadyReady Condition은 모두 false가 된다.

Phase 5: Unkown

뭔지 모를 이유로 통신 장애가 발생하면, Pod는 Unkown 상태가 되고 통신 장애가 지속되면, Failed가 된다.


2) Container

컨테이너의 생애주기는 containerStatus로 표현되는데, 아래와 같다.

ContainerStatus

  • Waiting: 생성중
  • Running: 실행중
  • Terminated: 종료


🐳 Pod - ReadinessProbe, LivenessProbe


서비스를 운영하다 보면, 당연히 장애 상황이 발생할 수 있고, k8s에서는 이에 따라서 Auto healing 기능이 동작하게 된다.

새로운 Pod가 생성되는 동안에는 장애가 발생하지 않은 Pod에서 들어오고 있는 트래픽들을 받아줘야하고, 새롭게 생성되는 Pod에서는 애플리케이션이 정상적으로 구동된 것을 확인하고 트래픽을 받아야한다.

이러한 처리를 하기 위해서 ReadinessProbe, LivenessProbe라는 옵션들이 존재한다.

1) ReadinessProbe

새롭게 생성되는 Pod의 컨테이너에서 구동하는 애플리케이션이 정상적으로 실행된 것이 확인되어야 트래픽을 받도록 하는 옵션이다.

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  labels:
    app: readiness
spec:
  containers:
    - name: container-1
      image: kai1114/hello
      ports:
        - containerPort: 8000
      readinessProbe:
        exec:
          command: [ "cat", "/readiness/ready.txt" ]
        initialDelaySeconds: 5
        periodSeconds: 10
        successThreshold: 3
  terminationGracePeriodSeconds: 0

ReadinessProbe 옵션을 사용하는 Pod는 위와 같이 생성할 수 있다.

2) LivenessProbe

이 옵션은 구동중인 애플리케이션에서 장애가 발생한 경우, Pod를 재실행하도록 만드는 옵션이다.

apiVersion: v1
kind: Pod
metadata:
  name: pod-1
  labels:
    app: liveness
spec:
  containers:
    - name: container-1
      image: kai1114/hello
      ports:
        - containerPort: 8000
      livenessProbe:
        httpGet:
          path: /health
          port: 8000
        initialDelaySeconds: 5
        periodSeconds: 10
        failureThreshold: 3
  terminationGracePeriodSeconds: 0

LivenessProbe 옵션을 사용하는 Pod는 위와 같이 생성할 수 있다.



⚓ Probe에 대한 옵션


Probe와 관련해서 설정할 수 있는 옵션들은 아래와 같은 것들이 있다.

initialDelaySeconds

컨테이너 구동 후, 첫번째 Probe 체크를 하는 시간에 대한 설정 값이다.
서버 애플리케이션이 뜨는 시간을 고려하여 약간 여유롭게 설정하는 게 바람직하다.

periodSeconds

k8s에서는 주기적으로 Probe 체크를 하는데, Probe 체크를 하는 '주기'에 대한 설정 값이다.

timeoutSeconds

Probe 체크를 했을 때, 얼만큼의 시간동안 응답이 없을 때 '실패'로 처리할 것인지에 대한 설정 값이다.

successThreshold, failureThreshold

Probe 체크가 몇 번 연속으로 성공 또는 실패해야 최종적으로 컨테이너 상태를 정상 또는 비정상으로 결정할 지에 대한 설정 값이다.

terminationGracePeriodSeconds

컨테이너를 종료해야할 때, 얼만큼 기다렸다가 종료할 것인지에 대한 설정 값이다.



☕ 참고


0개의 댓글