Pod(Probe)
개념
Probe는 Health Check 같은 원리를 사용 현재 나의 Pod이 어떠한 상태인지를 파악하는 용도입니다.
startupProbe
- 현재 앱이 기동이 되었는지를 파악
readnessProbe
- 외부 트래픽을 Pod가 받을 수 있는 상태인지를 파악(Service와 Pod를 연결)
- 초기 데이터 로딩, 연동 시스템 체크, DB 데이터 Validation등
User 초기화
완료여부
livenessRrobe
- App이 살아있는지를 파악
- startupProbe가 true로 나온 이후 해당 앱이 살아있는지에 대한 여부
- false로 나온다면 App을 재기동 시킴
해동 API의 기능은 직접 구현해야하고 상황에 맞게 로직도 만들어 두어야 합니다.
예시로 보는 이해
모든 Probe는 "/ready"
라는 url path로 통신이 성공했는지를 파악합니다.
때문에 우리는 코드를 구성할 때 "/ready"
라는 API를 만들어두어야 합니다.
Probe
속성에 대해 아래 예시를 통해 설명해보겠습니다.
httpGet
해당 속성은 언급하지 않아도 이해 하실 거라 생각하고 넘어가겠습니다.
periodSeconds
해당 요청을 몇초에 한번씩 날릴 껀지에 대한 설정입니다.
아래 예시를 보면 모든 Probe의 요청이 10초에 한번씩 발생하도록 설정한것을 알 수 있습니다.
successThreshold
해당 요청이 몇번 200 OK라는 응답코드를 주었을 때 성공으로 인지할지에 대한 count입니다.
failueThreshold
실패 시 최대 몇번의 실패까지 허용할지에 대한 설정입니다.
아래 예시를 보면 기동중(startupProbe)에는 응답이 실패할테니 10번까지는 인정해주는 모습을 볼 수 있습니다.
그리고 다른 두개의 Probe에는 두번 응답에 실패하면 Pod이 죽었다고 판단하고 재기동을 시키게 됩니다.
로그로 보는 이해
순서대로 봐볼게요.
먼저 처음에 찍히는 startupProbe
의 실행이 보일 겁니다. 아직 App이 올라가기 전이라서 startupProbe
가 flase
로 로그가 찍히는게 보일겁니다.
그 다음 명세를 한 부분에서 periodSeconds
가 5로 설정되어 있어, 5초마다 해당 요청이 발생하는걸 볼 수 있죠.
이젠 App is started라고 찍힌 부분에서 확인할 수 있듯이 App이 완전히 올라 왔고, startupProbe
에서 성공했다는 로그가 찍히게 됩니다.
그러면 이제 readinessProbe
과 livenessProbe
의 요청이 10초마다 발생하기 시작하죠.
처음에 App이 올라오면 livenessProbe
의 경우에는 앱이 실행됐는지 Health Check를 하니 true
를 반환 할겁니다.
하지만, 아직 User 초기화는 완료되지 않아. readnessProbe
는 false
를 반환하게하여 Serivce와 Pod의 연결을 지연시켜야 하기 때문에 false
를 반환하게 됩니다.
그 이후 모든 Data가 로딩이 완료되면 readnessProbe
와 livenessProbe
둘 다 true
를 반환하여 서비스를 이용할 수 있도록 만들어 줍니다.
일시적 장애에 대한 대책
우리는 개발을 하면서 다양한 일시적 장애를 마주할 수 있습니다.
예를 들면 Overload
, Leak
, ThreadFull
, 등 다양한 상황에 말이죠.
이 경우는 일시적으로 일어나는 장애지만, livenessProbe
는 false
를 반환하면서 앱이 재기동될 가능 성이 있는 것이죠.
이럴경우 우리는 Probe의 요청간격을 늘려 사용하여 해결 할 수 있습니다.livenessProbe
의 periodSeconds
의 시간을 넉넉하게 잡아 이를 해결하는 것이죠.
차후 실패하지 않고 App작업을 모두 완료시키는 방법인 "graceful shutdown"을 나중에 배워보겠습니다.
실습하기
사전 작업
pod 최소 갯수를 1개로 변경
로그를 편하게 보기 윈한 작업으로 현재 HPA에서 최소 replica가 2개로 잡혀있기 때문에 1개로 수정하여 실습하겠습니다.
kubectl patch -n anotherclass-123 hpa api-tester-1231-default -p '{"spec":{"minReplicas":1}}'
그라파나에 접속
아래 주소에 접속해서 로그를 실시간으로 볼 수 있게 준비합니다.
우측 상단에 보면 live버튼이 있는데 클릭하면 실시간으로 로그를 볼 수 있습니다.
${MasterNode IP}:30001
대쉬보드 접속
대쉬보드에 접속해서는 실제로 Pod를 삭제해 새로 Pod이 생성활 때 어떻게 Probe관련 로그가 찍히는지 확인해보세요.
${MasterNode IP}:30000
필요한 command
# 1번 API - 외부 API 실패
curl http://${MasterNode IP}:31231/hello
# 2번 API # 외부 API 실패
curl http://${MasterNode IP}:31231/hello
# 내부 API 성공
kubectl exec -n anotherclass-123 -it api-tester-1231-7459cd7df-2hdhk -- curl localhost:8080/hello
kubectl exec -n anotherclass-123 -it <my-pod-name> -- curl localhost:8080/hello
# 3번 API - 외부 API 성공
curl http://${MasterNode IP}:31231/hello
# 4번 API# 트래픽 중단 - (App 내부 isAppReady를 False로 바꿈)
curl http://${MasterNode IP}:31231/traffic-off
# 외부 API 실패
curl http://${MasterNode IP}:31231/hello
# 트래픽 재개 - (App 내부 isAppReady를 True로 바꿈)
curl http://${MasterNode IP}:31231/traffic-on
# 5번 API - 장애발생 (App 내부 isAppLive를 False로 바꿈)
curl http://${MasterNode IP}:31231/server-error
'FrameWorks > Kubernetes' 카테고리의 다른 글
[Kubernetes] Application 이해하기 - PVC, PV, Deployment, Service, HPA (0) | 2025.03.11 |
---|---|
[Kubernetes] Application 기능 이해하기 - Configmap, Secret (0) | 2025.03.10 |
[Kubernetes] Object의 metadata 그림으로 파헤치기 (0) | 2025.03.07 |
[Kubernetes] 쿠버네티스에 모니터링 시스템 설치하기(feat. Prometheus, Loki-stack) (0) | 2025.03.07 |
[Kubernetes] RedHat계열을 이용한 쿠버네티스 설치 (1) | 2025.03.06 |
댓글