Web/SpringBoot

[springboot] healthcheck ,actuator, kubernetes 헬스 체크 하여 pod 롤링 업데이트 502 에러 - 1/2

벨포트조던 2019. 10. 30.
반응형

환경

- springboot 2.1 

- kubernetes 로 마이크로서비스로 서버 운영

- docker

 

 

나는 처음, java는 healthcheck 가 필요없는주 알앗다. 서버가 다 뜨지 않으면 어차피 헬스체크가 안돌아가고, db커넥션 다 연결하고, 컴파일하고 뭐하고 서버 올라오면 그때 서버 호출 가능하니까 그런주 알앗는데.. 잘못생각했나보다.

 

springboot도 헬스체크가 필요하다. 

 

헬스체크 기능을 쓰려면 actuator를 사용해야한다. 

 

참조한 블로그들 

----------------------------------------------------------------------------------------------------

https://jeong-pro.tistory.com/160

https://supawer0728.github.io/2018/05/12/spring-actuator/

https://cloud.ibm.com/docs/java?topic=java-spring-healthcheck

https://stackoverflow.com/questions/30736514/spring-boot-actuator-health-returning-down

https://devwari.tistory.com/2

https://stackoverflow.com/questions/41803253/application-status-down-when-mongo-is-down-with-spring-boot-actuator

https://www.callicoder.com/spring-boot-actuator/

https://www.codeprimers.com/health-check-api-in-spring-boot-application/

http://wonwoo.ml/index.php/post/1787[ acuator 기능 요약 ]

----------------------------------------------------------------------------------------------------

 

 

헬스체크를 써야했던 이유는 기존 다른 서버들은 node, golang 으로 되어있어서 그거 기반으로 k8s가 셋팅되어있었다.

springboot 로 새로 추가하려니까 약간 안맞는 부분이 생겻음

안맞다보니 재배포시 pod가 롤링업데이트 될때 502 에러가 엄청 나옴 ... ( 이외에도 문제가 많은데 우선 이게 문제 )

기존 k8s 환경설정 보면, readiness 는 없고, liveness 만 설정되어있음. 

 

 

여러가지 테스트 해보고, 내가 적용한 것들 

 

- springboot actuator 설정 추가 .

1. endpoint 변경

( 이건 예를 든거다 )

management.endpoints.web.base-path=/monitor
management.endpoints.web.path-mapping.health=healthcheck

management.endpoint.health.show-details=always

 

2. healthcheck 몽고db 검증 제외 

https://stackoverflow.com/questions/41803253/application-status-down-when-mongo-is-down-with-spring-boot-actuator

몽고나 redis는 일부 커넥션이 안맺어져 있을 수 있어서 끈다. ( sentinel, cluster 같은 설정에서 )

 

3. customhealthindicator 추가(추가했는데 이건 안씀.. 필요없어보여서.. 이건 아래 블로그에 잘 나와잇음 )

 

actuator 사용은 이정도 한거같고,

 

 

 

이까지가 healthcheck를 사용하는 방법이다.

 

------------------------------------------------------------------------------

 

이제 502에러가 발생하는 원인을 찾아보았다. 여러가지 테스트를 겁나 해봤는데 ..
원인은 readiness 를 설정을 하지 않아서였다.

 

readiness healthcheck 하니 502가 생기지 않았다. 

k8s 설정을 추가했다 .

https://www.baeldung.com/spring-boot-kubernetes-self-healing-apps

여기서는, custom healthcheck를 만들수있다.

이걸 사용하면, 미리 초기화필요한 데이터들을 완료할 수 있다.

 

 

kubernetes 문서 

https://kubernetes.io/ko/docs/concepts/workloads/pods/pod-lifecycle/

 

https://cloud.ibm.com/docs/java?topic=java-spring-healthcheck&locale=ko

 

pod readiness

https://rahulsharma.page/2019-01-02-k8s-springboot-readinessCheck/

 

 

이렇게 502가 생기지 않게되었다.

 

그러나 ... 이후로 403이 발생했따.. ㅅㅂ. .... 

 

403해결은 다음 포스팅에 .,..

 

 

반응형

댓글