레거시 api 중에 `502 Bad Gateway` 에러가 발생하여 올바르게 동작하지 못하였다...(이럴 수가 502 에러라니👀)
502 에러이기 때문에 repo에서 찍은 로그도 찾을 수 없어 nginx 로그를 뒤져보았담.
확인해 보니 Connection refused가 난 로그를 확인할 수 있었습니다.
그동안 문제가 없었는데 왜 Connection refused 에러가 있었을까요??
로그남은 일시를 확인해 보니 버그가 있어 배포를 진행된 시점과 동일했다...
현재 쿠버네티스에서 롤링업데이트로 배포가 진행되고 있었는데 이 과정에서 기존 파드에서 발생된 오류로 판단하였다..
쿠버네티스의 롤링 업데이트와 TerminationGracePeriodSeconds 설정으로 해결한 방안을 살펴보겠습니다.
쿠버네티스의 롤링 업데이트란??
롤링 업데이트는 쿠버네티스에서 애플리케이션의 새로운 버전을 배포할 때, 기존 버전을 점진적으로 교체하는 방식입니다.
이를 통해 서비스의 가용성을 유지하면서 업데이트를 수행할 수 있습니다.
주요 특징은 다음과 같습니다!
- 점진적 교체
- 기존 파드를 하나씩 종료하고, 새로운 파드를 하나씩 시작합니다.
- 이를 통해 서비스의 다운타임을 최소화합니다. - MaxUnavailable와 MaxSurge
- MaxUnavailable : 업데이트 중 동시에 사용할 수 없는 최대 파드 수를 지정합니다. 기본 값은 25%입니다.
- MaxSurge: 업데이트 중 동시에 생성할 수 있는 최대 초과 파드 수를 지정합니다. 기본 값은 25%입니다.
만약 MaxUnavailable이 1이고 MaxSurge가 1인 경우, 하나의 파드가 종료되고 새로운 파드가 시작될 때까지 다른 모든 파드는 계속 동작합니다.
TerminationGracePeriodSeconds
'TerminationGracePeriodSeconds'는 파드가 종료될 때 쿠버네티스가 그 파드에게 종료 신호(SIGTERM)를 보내고, 강제 종료(SIGKILL) 전에 기다리는 시간입니다. 이 설정은 파드가 현재 처리 중인 작업을 마무리하고 리소스를 정리할 시간을 주기 위해 사용됩니다.
- Graceful Shutdown
- 파드가 종료 신호(SIGTERM)를 받으면, 애플리케이션은 현재 작업을 완료하고 필요한 정리 작업을 수행해야 합니다.
- terminationGracePeriodSeconds 동안 애플리케이션 종료 작업을 수행할 수 있도록 합니다. - 기간 설정
- 기본값은 30초입니다. 이 값은 파드의 종료 시점을 조정할 수 있도록 합니다.
- 애플리케이션의 종료 시간에 따라 이 값을 조정해야 할 수 있습니다.
문제 원인
파드가 종료 신호를 받고도 정리 작업이 완료되지 않은 상태에서 terminationGracePeriodSeconds 기간이 만료되면, 파드는 강제로 종료(SIGKILL)됩니다.
강제 종료되면, 현재 진행 중인 요청이나 작업이 중단될 수 있습니다.
이로 인해 API 서버와의 연결이 끊기고 502 Bad Gateway 오류가 발생할 수 있습니다.
- 짧은 TerminationGracePeriodSeconds:
- terminationGracePeriodSeconds 값이 너무 짧으면, 파드가 현재 처리 중인 요청을 완료하고 정리 작업을 수행하기 전에 종료될 수 있습니다.
- 이로 인해 요청이 중단되고 연결 오류가 발생할 수 있습니다.
- 긴 종료 시간:
- 애플리케이션이 종료 신호를 받은 후, 종료 작업을 완료하는 데 시간이 오래 걸리는 경우가 있습니다.
- 이는 데이터베이스 연결 해제, 세션 정리, 파일 시스템 정리 등 다양한 이유로 발생할 수 있습니다.
해결 방법
- TerminationGracePeriodSeconds 증가
- terminationGracePeriodSeconds를 30초에서 60초로 증가시키면, 파드가 종료 신호를 받은 후 충분한 시간을 두고 정리 작업을 완료할 수 있습니다.
- 이는 파드가 정상적으로 종료될 수 있도록 도와주며, 강제 종료로 인한 연결 오류를 방지할 수 있습니다.
정리
- 롤링 업데이트 중 Graceful Shutdown
- 쿠버네티스는 롤링 업데이트 중 기존 파드를 종료하고 새 파드를 시작합니다.
- 종료되는 파드가 현재 처리 중인 작업을 완료할 수 있도록 TerminationGracePeriodSeconds를 설정합니다.
- 이 값이 너무 짧으면, 파드가 강제 종료되어 연결 오류가 발생할 수 있습니다.
- 문제 해결
- TerminationGracePeriodSeconds를 충분히 늘려 파드가 정리 작업을 완료할 수 있도록 합니다.
'ContainerTech' 카테고리의 다른 글
Docker와 Kubernetes 비교 (0) | 2024.08.03 |
---|