본문 바로가기

About/Kubernetes

[k8s] Liveness Probe - ExecAction을 이용한 Pod Health Check

kubernetes에서는 HTTP Request나 TCP Socket와 같은 리퀘스트의 결과가 아니라 컨테이너 안에서 임의의 명령을 실행하여 그 결과로 파드의 가동 여부를 판단할 수 있습니다.

명령을 이용한 Health check


매니페스트 파일 작성

# pod-liveness-exec.yaml

# 1. 기본 항목
apiVersion: v1
kind: Pod
metadata:
  labels:
    test: liveness
  name: liveness-exec

# 2. Pod Spec
spec:
  # 3. Container 사양
  containers:
  - name: liveness
    image: busybox # busybox
    args:
    - /bin/sh
    - -c
    - touch /tmp/healthy; sleep 30; rm -rf /tmp/healthy; sleep 600 # /tmp/healthy 파일 생성 후 30초 뒤 삭제

    # 4. liveness Probe
    livenessProbe:
      exec: # 명령의 실행 결과에 의한 체크
        command:
        - cat
        - /tmp/healthy
      initialDelaySeconds: 10 # 실행되기 까지 대기 시간
      periodSeconds: 5 # 진단 주기

위의 매니페스트 파일을 그림으로 나타내면 다음과 같습니다.

위의 매니페스트 파일은 컨테이너 이미지를 busybox로 생성합니다. 그리고  /tmp/healthy 파일을 생성하고 30초 뒤에 삭제하도록 args를 구성합니다.

liveness Probe 부분을 자세히 살펴보면 다음과 같습니다.

livenessProbe:
  exec: # 명령의 실행 결과에 의한 체크
    command:
    - cat
    - /tmp/healthy
  initialDelaySeconds: 10 # 실행되기 까지 대기 시간
  periodSeconds: 5 # 진단 주기

컨테이너가 가동 중인지 아닌지를 확인하기 위해 우선 컨테이너 안에서 cat /tmp/healthy 명령어를 실행합니다. 명령이 성공하면 0을 반환합니다. 만일 0 이외의 값이 반환되면 '애플리케이션이 가동되고 있지 않다'고 간주하여 kubelet이 컨테이너를 재시작합니다. 

따라서 처음 30초에는 /tmp/healthy 파일이 존재하기 때문에 liveness Probe는 진단에 성공하지만 30초 후에는 이 파일이 삭제되기 때문에 진단에 실패하게 될 것입니다.

위의 매니페스트 파일을 이용하여 파드를  생성하면 다음과 같습니다.

$ kubectl apply -f pod-liveness-exec.yaml
pod/liveness-exec created

실제 내부에서 어떤일이 벌어지고 있는지 확인하기 위해 kubectl describe 명령어를 입력합니다.

$ kubectl describe pod liveness-exec

파드가 정상 실행 되고 30초 뒤에 위 명령어를 입력하고 실행 결과의 Events 필드를 확인하면 다음과 같습니다.

/tmp/healthy 파일이 삭제되었기 때문에  liveness probe가 진단에 실패했고, 잠시 후 busybox 이미지를 다시 다운로드 받아 파드가 재시작되는 것을 알 수 있습니다. 0 이외의 반환 값이 반환되었기 때문에 애플리케이션이 정상적으로 가동되고 있지 않다고 kubelet이 판단하여 컨테이너를 다시 생성한 것입니다.

 


liveness Probe의 ExecAction을 이용하여 파드를 진단하는 방법에 대하여 다루어보았습니다. 

파드가 정상적으로 움직이고 있는지를 체크하는 것은 너무 중요하기 때문에 liveness Probe를 잘 활용한다면 좋을 것 같습니다.

참고