본문 바로가기

Kubernetes

[kubernetes] liveness, readiness probe에 관하여(feat. period, timeout seconds)

liveness는 health 체크 후에 특정 threshold에 도달하면 pod을 restart 시킨다.

readiness는 health 체크 후에 특정 threshold에 도달하면 pod을 서비스에서 제외시켜버린다.

성능테스트를 하다가 hpa 동작 과정에서 latency가 급격히 증가하는 케이스가 있는데, 이것은 readiness probe 설정을 안해주었기 때문이다.

 

period, timeout seconds 라는 옵션이 있다.

일반적인 동작 방식은 아래 표와 같다. (표 삽입)

위 표를 예시를 통해 알아보자.

 

initialDelay: 60초

timeoutSeconds: 3초

periodSeconds: 10초

 

응답을 1초만에 주는 서버가 있다고 가정하자. (실패를 리턴)

1. request를 보낸다.

2. 결과를 기다린다. (1초)

3. 실패처리를 한다. (서버가 실패를 응답)

4. 9초를 기다린다. (10초 - 1초)

5. request를 보낸다.

6. 결과를 기다린다. (1초)

7. 실패처리를 한다. (서버가 실패를 응답)

8. 9초를 기다린다. (10초 - 1초)

9. request를 보낸다.

10. 결과를 기다린다. (1초)

11. 실패처리를 한다. (서버가 실패를 으답)

12. pod restart - 1번으로 돌아감. (무한반복)

pod이 뜨고 나서 restart까지 총 81초(60초 + 21초)가 걸린다.

 

같은 설정에서 만약 서버가 응답을 4초만에 준다면

1. request를 보낸다.

2. 결과를 기다린다. (3초 - timeoutseconds)

3. fail 처리를 한다. (timeout으로 인해)

4. 7초를 기다린다. (10초 - 3초)

5. request를 보낸다.

6. 결과를 기다린다. (3초 - timeoutseconds)

7. fail 처리를 한다. (timeout으로 인해)

8. 7초를 기다린다. (10초 - 3초)

9. request를 보낸다.

10. 결과를 기다린다. (3초 - timeoutseconds)

11. fail 처리를 한다. (timeout으로 인해)

12. pod restart - 1번으로 돌아감. (무한반복)

pod이 뜨고 나서 restart까지 총 81초(60초 + 21초)가 걸린다.

 

그런데, 만약 timeoutSeconds가 periodSeconds보다 더 크다면 어떻게 동작할까?

실험 결과는 다음과 같다.

 

initialDelay: 60초

timeoutSeconds: 15초

periodSeconds: 10초

 

서버는 응답을 20초만에 준다고 가정한다.

1. request를 보낸다.

2. 결과를 기다린다. (15초 - timeoutseconds)

3. fail 처리를 한다. (timeout으로 인해)

4. request를 보낸다. (10초만에 보냈어야되는데 timeout으로 인해 5초가 늦어진다.)

5. 결과를 기다린다. (15초 - timeoutseconds)

6. fail 처리를 한다. (timeout으로 인해)

7. request를 보낸다. (10초만에 보냈어야되는데 timeout으로 인해 5초가 늦어진다. 총 10초가 늦어졌다.)

8. 결과를 기다린다. (15초 - timeoutseconds)

9. fail 처리를 한다. (timeout으로 인해)

10. pod restart - 1번으로 돌아감. (무한반복)

pod이 뜨고 나서 restart까지 총 105초(60초 + 45초)가 걸린다.

결국, 내가 작성한 periodSeconds는 아무 의미가 없고, timeoutSeconds 값과 동일하게 periodSeconds가 동작하게된다.

 

물론 timeout 발생하는 케이스가 흔한 케이스는 아니지만 (음.. 그래도 종종 발생하긴 한다.) 어쨌든 내가 설정한 값과 실제 동작이 다르게 흘러가는 것은 좋지 않다고 생각하기 때문에, 되도록 timeoutSeconds는 periodSeconds 보다 짧게 설정하도록 하자!

 

'Kubernetes' 카테고리의 다른 글

[Docker] Dockerfile cache 및 작성 Tip  (0) 2021.03.14
[Kubernetes] ConfigMap 사용 이유  (1) 2020.09.09