지난 무중단 배포 테스트 1,2 를 통해서 우리는 EKS 의 구조적 문제(?)를 확인했다. 그러면 이것을 우회할 방법이 없을까? 두 테스트를 자세히 본 분들은 이미 발견했을것 같다.
preStop 을 사용하는 것이다
EKS 에서 무중단 배포의 구조적 문제는 타겟이 deregister 되고 상태가 draining 으로 변경되면 바로 요청 인입이 막혀야 하나 어떠한 이유에서 초기 약 10 ~ 15초 간 요청이 인입된다는 것이다.
그렇다면 이 초기 10 ~ 15초 간의 요청을 처리해주면 되지 않을까? 이를 위해 Pod LifeCycle 의 한 단계인 preStop 에서 sleep
을 설정하여 의도적으로 잠시 어플리케이션 중지를 막아서 초기 인입되는 요청을 처리하게끔 해주면 된다.
아래는 preStop 에 sleep
을 적용한 예시이다.
...
spec:
containers:
- name: testapp
image: nginx
lifecycle:
preStop:
exec:
command: ["/bin/sh", "-c", "sleep 15"]
terminationGracePeriodSeconds: 120
...
물론 TerminationGracePeriodSeconds 의 값은 무조건 sleep
보단 크게 주어야 한다.
위와 같이 설정 후 테스트하면 이전과 다르게 배포 간 신규 인입 요청에서 실패가 발생하지 않고 모두 잘 처리된다.
여러 테스트를 통해 EKS 에서도 무중단 배포를 달성할 수 있음을 확인했다. 각 배포 환경과 어플리케이션의 성격에 맞춰 적절한 sleep
시간을 설정한다면 안정적인 배포와 적절한 배포 소요 시간을 모두 확보할 수 있을 것이다.