본문 바로가기

Container/Kubernetes

[k8s]readiness probe로 파드 health check 하기!

목표: 3.0 버전의 CozServer 파드가 탐침기(probe)에 의해 문제가 있음을 스스로 발견하게 하고, 자동으로 롤백할 수 있게 하세요

  1. 디플로이먼트의 spec.minReadySeconds 속성의 기본값은 0입니다. 이 말은 곧 파드가 Running으로 변하면 "사용 가능한 것으로 간주한다"는 의미입니다. 그런데, 실제로 CozServer의 3.0 버전은 문제가 있는 버전이었죠. minReadySeconds를 늘리면, 롤아웃의 속도를 조절할 수 있습니다.
  2. 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/

https://bcho.tistory.com/1264

'Container > Kubernetes' 카테고리의 다른 글

[k8s]스테이트풀 셋  (0) 2022.04.26
[k8s]서비스 디스커버리  (0) 2022.04.25
[k8s]쿠버네티스 개념  (0) 2022.04.21