본문 바로가기
경험 일지

Kubernetes의 Liveness 그리고 Readiness probes

by Marco Backman 2024. 1. 22.

최근 회사 서비스의 Health check endpoint에 문제가 생겨서 알아보게된 용어들이다. Kubernetes 설정을 비 정상적인 서비스 상태가 3번 이상 감지되면 강제적으로 서비스를 중단하고 다시 복구하는 프로세스를 거치는데, 큰 문제가 없었는데도 지속적으로 HTTP 요청이 느려지고 결국 timeout으로 걸려 실패로 판정되다가 세번연속으로 걸려 서비스가 재부팅 되는 문제점을 발견했었다. 여기서 선임개발자가 Liveness에 문제가 있다라고 언급을 해서 글을 작성한다. 아쉽게도 문제를 분석/최적화를 한 일지는 나중에 적어보도록 하겠다. 모든 일화를 한 글에 적기에는 시간이 너무 부족하다.

 

Readiness 와 Liveness 는 Kubernetes와 같은 서비스가 돌아가는 서버환경에서 많이 사용된다. Kubernetes의 경우 각 Kubelet의 YMAL파일에다 노드 정책 설정들을 넣을 수 있다. LivenessProbe의 정책은 Kubernetes가 소프트웨어가 정상작동 되고 있는지에 대한 유무를 조건부에 맞게 파악해주게 하고 만약 이상이 감지된다면 서비스를 다시 시작 할 수 있게 된다. 

 

LivenessProbe는 Batch 커맨드, HTTP 요청, TCP연결, gRPC, port, 확인 등이 있는데 우리는 HTTP probe를 사용한다. 참고로, TCP의 경우, 실제로 서비스가 내부적으로 비정상적인데 연결이 되기만하면 정상으로 알리는 오판 가능성 때문에 우리는 TCP probe를 피한다.

 

spec:
  containers:
  - name: liveness
    image: registry.k8s.io/liveness
    args:
    - /server
    livenessProbe:
      httpGet:
        path: /healthz
        port: 8080
        httpHeaders:
        - name: Custom-Header
          value: Awesome
      initialDelaySeconds: 3
      periodSeconds: 3

LivenessProbe-HTTP 정책 설정 예시

 

 

Liveness: Kubernetes에 돌아가고 있는 서비스 Docker가 정상적으로 작동되고 있는지 판별을 하고, 정상적이지가 않다고 판단되면 정책에 따른 작업을 실행한다. 특히, Liveness는 외부에서 쉽게 알 수 없는 오류를 판별하기가 쉽다. 예를 들어, Deadlock, Starvation, Whitelock, 예상치 못한 Database service 연결 오류, Resource exhaution ,필수적으로 필요한 외부 서비스의 연결 오류 등, 내부적으로 문제가 되는 행동이 발견되면 컨테이너를 종료 후 pod 재배포를 실시하게 한다. 이 설정은 매우 필요적인 기능인데, 그 이유는 내부적으로 중대한 오류가 생겼을 때 개발자나 Operation팀이 인지를 못하면 결국 서비스를 사용하는 다른 프로그램이나 고객들이 엄청난 불편을 겪고 손해를 지게 되기 때문에 서비스가 항상 정상 작동되는지를 확인하는 설정이 꼭 필요하다.

 

Readiness: Kubernetes에 돌아가고 있는 서비스 Docker가 서비스를 제공 할 준비가 되어있는지를 확인해주는 역활을 한다. 컨테이너의 Readiness는 실제로 서비스가 모두 준비가 완료되면 외부 요청을 언제 받을 수 있는지 설정을 할 수 있다. 이렇게 되면 실제로 서비스가 준비중인 상태에서 준비 완료될 때 까지 준비가 안됐다고 알려주게 하는 설정이다. 예로, 서비스 부팅 시간, 캐시 준비 시간, 네트워크 연결 설정 시간 등 시간이 걸리는 프로세스들이 끝날 때 까지 기다릴 수 있다.

 

 

다음 Kubernetes 공식 링크를 보면 Liveness, Readiness, Startup proces에 관한 많은 내용들이 자세하게 설명되어있다.

https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-startup-probes/

 

 

 

 

 

추가로 비슷 한 용어로 블록체인 관점의 합의 알고리즘이 있다: https://velog.io/@psh03225/Safety%EC%99%80-Liveness

 

Safety와 Liveness

Safety: 시스템에 나쁜 일이 발생하지 않는다는 의미이며, 모든 정상적인 참여자는 같은 상태에 동의하여야 하고, 그 상태는 유효해야 한다. 노드는 잘못된 합의를 하지 않는다는 의미이다.Liveness:

velog.io

Liveness에 대해 알아보다가 공부하기 좋은 자료들을 찾아서 링크를 달아놓는다.