[k8s]readiness probe로 파드 health check 하기!
목표: 3.0 버전의 CozServer 파드가 탐침기(probe)에 의해 문제가 있음을 스스로 발견하게 하고, 자동으로 롤백할 수 있게 하세요
- 디플로이먼트의 spec.minReadySeconds 속성의 기본값은 0입니다. 이 말은 곧 파드가 Running으로 변하면 "사용 가능한 것으로 간주한다"는 의미입니다. 그런데, 실제로 CozServer의 3.0 버전은 문제가 있는 버전이었죠. minReadySeconds를 늘리면, 롤아웃의 속도를 조절할 수 있습니다.
- CozServer의 3.0 버전 디플로이먼트에 readiness probe를 달면, 롤아웃이 늦춰지는 동안(minReadySeconds가 충분히 길어야 합니다), 탐침이 가능합니다.
- readiness probe를 달고
- HTTP GET 요청을 1초마다 요청하게 하세요 (헬스체크)
- 3.0 버전에 몇 번 요청을 하고 나면, 500 에러가 발생할 것입니다.
- 자동으로 2.0 버전으로 롤백하는 것을 확인할 수 있습니다.
Health Check
kubelet
은 실행 중인 파드들에 대해 파드의 상태를 주기적으로 체크해, 문제가 있는 파드를 재시작하거나 삭제한다. 이를 Health Check라 하는데, porbe라는 탐침기를 통해 상태 체크가 가능하다. liveness
, readiness
, startup
총 3가지 probe가 있다.
- liveness
: 응답이 없거나 체크 로직에 의해 실패하면 재시작
- readiness
: 파드 내의 앱이 특정 체크 매커니즘에 의해 실패하면 서비스가 트래픽을 보내지 않음
- startup
참고로 컨테이너 라이프 사이클과 관련하여 훅 핸들러를 실행할 수 있기도 하다. pre stop
, post start
등이 있다.
코드
apiVersion: apps/v1
kind: Deployment
metadata:
name: cozserver
labels:
app: cozserver
spec:
replicas: 3
minReadySeconds: 10 #10초 동안 트래픽 받지 않음, 배포시간을 늘리며 probe가 httpGet요청할 시간을 줌.
strategy:
type: RollingUpdate #롤링 업데이트 전략으로 배포
selector:
matchLabels:
app: cozserver
template:
metadata:
labels:
app: cozserver
spec:
containers:
- name: cozserver
image: sebcontents/cozserver:3.0
ports:
- containerPort: 8080
readinessProbe: #httpGet 요청을 앱에 보내며 Ready상태인지 체크
httpGet:
path: /
port: 8080
periodSeconds: 1 #1초 간격으로 체크 요청을 보냄.
readinessProbe를 달고 httpGet
요청을 1초 간격으로 보낸다.
컨테이너의 readiness
를 확인하기 위해 Probe
가 활동할 시간을 minReadySeconds: 10
으로 확보한다.
문제 있는 v3를 배포했더니 READY 0/1로 넘어가지 않는다. 즉 v3을 체크하고 배포가 안된 것이다.
readiness probe는 잘 사용해보았다. 그렇다면 liveness probe는 어떨까?
Liveness Probe
Liveness probe는 컨테이너의 상태를 주기적으로 체크해서, 응답이 없으면 컨테이너를 자동으로 재시작해준다. 컨테이너가 정상적으로 기동 중인지를 체크하는 기능이다.
Liveness probe는 Pod
의 상태를 체크하다가, Pod
의 상태가 비정상인 경우 kubelet
을 통해서 재시작한다.
그렇다면 언제 무엇을 써야할까?
- Liveness Probe: 컨테이너의 상태가
unhealthy
가 뜨는 것과 같이 컨테이너 문제가 의심될 경우. - Readiness Probe: 컨테이너 상태는
healthy
이지만 애플리케이션의 응답이 원하는 것이 아닐 경우. 500번대 응답
출처
https://kubernetes.io/ko/docs/concepts/workloads/pods/pod-lifecycle/