쿠버네티스 클러스터 상에는 많은 파드가 가동됩니다. 이것들이 정상적으로 움직이고 있는지 아닌지를 체크해서 만일 문제가 있으면 재빨리 복구해야 합니다. 쿠버네티스에서는 컨테이너 애플리케이션이 올바르게 움직이고 있는지 아닌지를 항상 감시하여 문제가 있으면 파드를 자동으로 재시작하는 장치가 있습니다.
위 장치를 Probe라고 합니다. 즉 프로브(Probe)는 컨테이너에서 kubelet에 의해 주기적으로 수행되는 진단(diagnostic)입니다. 진단 방식(Probe)에는 다음 두가지 가 있습니다.
livenessProbe
컨테이너가 실행됐는지 확인합니다. 이 진단이 실패하면 kubelet은 컨테이너를 종료시키고, restart 정책에 따라 컨테이너를 재시작합니다. 컨테이너에 liveness Probe를 어떻게 할지 명시되지 않았다면 기본 상태 값은 Success 입니다.
liveness Probe는 말 그대로 '애플리케이션이 응답하는지 아닌지'를 체크하기 위한 장치입니다. 파드 안의 컨테이너는 가동 중이지만 서비스로서 정상적으로 움직이고 있지 않은' 경우가 있기 때문에 이 장치를 사용합니다. 예를 들어 프로세스가 데드락을 일으켜 리퀘스트에 응답할 수 없는 경우 등이 그렇습니다.
readinessProbe
컨테이너가 실행된 후 실제로 서비스 요청에 응답할 수 있는지 진단합니다. 이 진단에 실패하면 엔드포인트 컨트롤러는 해당 파드에 연결된 모든 서비스를 대상으로 엔드포인트 정보를 제거합니다. 첫 번째 readinessProbe를 하기 전까지의 기본 상태 값은 Failure입니다. readinessProbe를 지원하지 않는 컨테이너라면 기본 상태 값은 Success 입니다.
readniss Probe는 '애플리케이션이 시작할 준비가 되었는지 아닌지'를 체크하기 위한 장치입니다. readinessProbe를 지원하는 컨테이너라면 컨테이너가 실행된 다음 바로 서비스에 투입되어서 트래픽을 받지 않고, 실제 트래픽을 받을 준비가 되었음을 확인한 후 트래픽을 받을 수 있습니다. 이를 이용하여 애플리케이션 초기화까지 시간이 걸리거나 대용량 데이터를 불러와야하는 상황 등에 대비할 수 있습니다.
컨테이너 진단 handler
컨테이너 진단은 컨테이너가 구현한 핸들러(handler)를 kubelet이 호출해서 실행합니다. 핸들러에는 세 가지가 있습니다.
종류 | 설명 |
ExecAction | 컨테이너 안에 지정된 명령어를 실행하고 종료 코드가 0일 때 Success라고 진단합니다. |
TCPSocketAction | 컨테이너 안에 지정된 IP와 포트로 TCP 상태를 확인하고 포트가 열려있으면 Success라고 진단합니다. |
HTTPGetAction | 컨테이너 안에 지정된 IP, 포트, 경로로 HTTP GET 요청을 보냅니다. 응답 상태 코드가 200에서 400 사이면 Success라고 진단합니다. |
진단 결과도 세 가지가 있습니다.
종류 | 설명 |
Success | 컨테이너가 진단에 성공 |
Failure | 컨테이너가 진단에 실패 |
Unknown | 진단 자체가 실패해서 컨테이너 상태를 알 수 없음 |
livenessProbe vs readinessProbe
두 Probe의 차이를 간단하게 정리하면 다음과 같다.
구분 | livenessProbe | readinessProbe |
감시 | 컨테이너가 실행 중인지 아닌지 | 컨테이너가 실행할 준비가 됐는지 아닌지 (트래픽을 받을 준비가 됐는지 아닌지) |
진단 방법 | HTTP GET, Exec, tcpSocket | HTTP GET, Exec, tcpSocket |
진단 실패 시 | 컨테이너 삭제(or container restart) | 트래픽을 보내지 않도록 함 (Service에서 해당 파드 제외) |
쿠버네티스의 Probe 방법 두 가지에 대하여 알아보았습니다.
참고
'About > Kubernetes' 카테고리의 다른 글
[k8s] Liveness Probe - HTTP Request를 이용한 Health Check(HTTPGetAction) (0) | 2022.01.20 |
---|---|
[k8s] 파드의 우선순위(Pod QoS, Quality of Service) (0) | 2022.01.18 |
[k8s] Pod LifeCycle(파드의 생명 주기) (0) | 2022.01.17 |
[k8s] Job/CronJob (0) | 2022.01.13 |
[k8s] 데몬셋(Daemonset) (0) | 2022.01.13 |