본문 바로가기

About/Kubernetes

[k8s] Liveness Probe - HTTP Request를 이용한 Health Check(HTTPGetAction)

웹 애플리케이션의 경우 특정 URL에 HTTP 리퀘스트를 보내, 그 반환값을 체크함으로써 애플리케이션이 정상적으로 움직이고 있는지를 판단할 수 있습니다.

HTTP를 이용한 Health check


매니페스트 파일 작성

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

# Pod Spec
spec:

  # Container spec
  containers:
  - name: liveness
    image: k8s.gcr.io/liveness
    args:
    - /server
    livenessProbe:
      httpGet: # Http 리퀘스트 반환 값에 따라 체크함
        path: /healthz
        port: 8080
        httpHeaders:
        - name: X-Custom-Header
          value: Awesome
        initialDelaySeconds: 10 # 처음 감시할 때 까지의 Delay
        periodSeconds: 5 # Liveness Probe 실행 간격
        

위의 매니페스트 파일은 livenessProbe를 실행하기 위해 kubelet이 컨테이너의 8080:/healthz에 HTTP GET 요청을 송신합니다. 이 리퀘스트의 HTTP Status Code가 200이상 400미만인 경우는 성공으로 간주됩니다. 그 외의 스테이터스 코드가 반환된 경우(404, 500 등) 오류로 간주하여 kubelet이 컨테이너를 재시작합니다. 

또한 initialDelaySeconds 필드는 파드가 시작된 이후 처음으로 감시를 실행할 때 까지의 시간을 나타내며, 위의 파일에서는 10초로 설정되어 있습니다. 또한 periodSeconds 필드는 Liveness Probe의 실행 간격 으로 위의 파일에서는 5초로 설정되어 있습니다.

위의 k8s.gcr.io/liveness 이미지는 서버가 실행되고 10초 이후 500코드를 반환하도록 되어 있습니다. 매니페스트 파일을 실행해보겠습니다.

$ kubectl apply -f liveness-http.yaml
pod "liveness-http" created

그리고 kubectl describe를 이용하여 로그를 살펴보면 다음과 같습니다.

컨테이너가 실행 후 10초뒤에 500코드를 받아 Liveness probe가  'failed'되고, kubelet이 컨테이너를 재시작 시키는 것을 확인할 수 있습니다.
위의 결과에서 Age가 정확히 10초가 아닌데 이는 Pod가 Pending하는 시간이 포함되어 있기 때문입니다.(이미지 다운로드 등..)


Liveness Porbe를 이용하여 HTTP 요청에 의한 Healthcheck를 다루어 보았습니다.

참고