지난 포스트에 이어서 이번 포스트에서는 무중단 배포가 실패하는 두 가지 경우 중 두 번째인 "배포 과정에서 아직 처리 중인 기존 요청에 대해 응답 실패가 발생하는 경우" 에 대해 알아본다. TerminationGracePeriodSeconds 과 어플리케이션 내의 graceful shutdown 구현을 적용하고 이를 확인하기 위한 테스트를 진행한다.
테스트 환경은 지난 포스트와 동일하다.
TL,DR
- TerminationGracePeriodSeconds 을 적용하면 무조건 좋다
- 어플리케이션을 개발할 때는 graceful shutdown 을 염두하자
Disclaimer
- 이번에도 테스트 과정 전체가 다 포함되서 글이 길어요...
테스트를 위해 먼저 TerminationGracePeriodSeconds 를 120초로 설정한다. 그리고 테스트 용 어플리케이션에는 sync.waitgroup 활용한 graceful shutdown 기능을 구현해 놓는다.
이 후 동일하게 배포 상황을 강제로 만들고 배포 과정 내부를 모니터링한다.
테스트 과정은 이전과 동일하나 아래의 액션을 추가로 실행한다.
$ curl -m 600 test-ingress.yldot.service:8080/sleep?period=110
$ curl -m 600 test-ingress.yldot.service:8080/sleep?period=110 &
[1] 6469
$ curl -m 600 test-ingress.yldot.service:8080/sleep?period=110 &
[2] 6491
$ curl -m 600 test-ingress.yldot.service:8080/sleep?period=110 &
[3] 6499
$ curl -m 600 test-ingress.yldot.service:8080/sleep?period=110 &
[4] 6506
$ curl -m 600 test-ingress.yldot.service:8080/sleep?period=110 &
[5] 6511
$ jobs
[1] Running curl -m 600 test-ingress.yldot.service:8080/sleep?period=110 &
[2] Running curl -m 600 test-ingress.yldot.service:8080/sleep?period=110 &
[3] Running curl -m 600 test-ingress.yldot.service:8080/sleep?period=110 &
[4]- Running curl -m 600 test-ingress.yldot.service:8080/sleep?period=110 &
[5]+ Running curl -m 600 test-ingress.yldot.service:8080/sleep?period=110 &
테스트 과정은 이전 테스트와 크게 다르지 않기에 간략하게 정리한 전체 과정을 통해 살펴보자.
Thu 01 Dec 2022 02:24:05 PM KST
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-7b6b896b5b-q6vb2 1/1 Running 0 8m21s 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 1/1 Running 0 7m42s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
Thu 01 Dec 2022 02:24:06 PM KST ## 배포 시작, new pod 1 생성 시작
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-slzpp 0/1 ContainerCreating 0 1s <none> ip-10-171-184-203.ap-northeast-2.compute.internal <none> 0/1
testapp-7b6b896b5b-q6vb2 1/1 Running 0 8m23s 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 1/1 Running 0 7m44s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
Thu 01 Dec 2022 02:24:08 PM KST
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-slzpp 0/1 ContainerCreating 0 2s <none> ip-10-171-184-203.ap-northeast-2.compute.internal <none> 0/1
testapp-7b6b896b5b-q6vb2 1/1 Running 0 8m24s 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 1/1 Running 0 7m45s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
...
Thu 01 Dec 2022 02:24:29 PM KST
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-slzpp 1/1 Running 0 23s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 0/1
testapp-7b6b896b5b-q6vb2 1/1 Running 0 8m45s 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 1/1 Running 0 8m6s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
Thu 01 Dec 2022 02:24:31 PM KST ## new pod 1 타겟 등록 시작
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-slzpp 1/1 Running 0 25s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 0/1
testapp-7b6b896b5b-q6vb2 1/1 Running 0 8m47s 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 1/1 Running 0 8m8s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
Thu 01 Dec 2022 02:24:32 PM KST
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-slzpp 1/1 Running 0 26s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 0/1
testapp-7b6b896b5b-q6vb2 1/1 Running 0 8m48s 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 1/1 Running 0 8m9s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
...
Thu 01 Dec 2022 02:24:42 PM KST
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-slzpp 1/1 Running 0 36s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 0/1
testapp-7b6b896b5b-q6vb2 1/1 Running 0 8m58s 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 1/1 Running 0 8m19s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
Thu 01 Dec 2022 02:24:43 PM KST ## new pod 1 타겟 등록 완료
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-slzpp 1/1 Running 0 38s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 0/1
testapp-7b6b896b5b-q6vb2 1/1 Running 0 9m 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 1/1 Running 0 8m21s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
Thu 01 Dec 2022 02:24:45 PM KST ## new pod 1 생성 완료
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-slzpp 1/1 Running 0 39s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-q6vb2 1/1 Running 0 9m1s 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 1/1 Running 0 8m22s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
Thu 01 Dec 2022 02:24:46 PM KST ## old pod 1 제거 시작, new pod 1 생성 시작
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-kbwb2 0/1 ContainerCreating 0 2s <none> ip-10-171-227-94.ap-northeast-2.compute.internal <none> 0/1
testapp-5b958f57fd-slzpp 1/1 Running 0 41s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-q6vb2 1/1 Terminating 0 9m3s 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 1/1 Running 0 8m24s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
Thu 01 Dec 2022 02:24:48 PM KST
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-kbwb2 0/1 Running 0 3s 10.171.232.42 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 0/1
testapp-5b958f57fd-slzpp 1/1 Running 0 42s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-q6vb2 1/1 Terminating 0 9m4s 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 1/1 Running 0 8m25s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
...
Thu 01 Dec 2022 02:25:08 PM KST
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-kbwb2 1/1 Running 0 23s 10.171.232.42 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 0/1
testapp-5b958f57fd-slzpp 1/1 Running 0 62s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-q6vb2 1/1 Terminating 0 9m24s 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 1/1 Running 0 8m45s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
Thu 01 Dec 2022 02:25:09 PM KST ## new pod 2 타겟 등록 시작
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-kbwb2 1/1 Running 0 25s 10.171.232.42 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 0/1
testapp-5b958f57fd-slzpp 1/1 Running 0 64s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-q6vb2 1/1 Terminating 0 9m26s 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 1/1 Running 0 8m47s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
Thu 01 Dec 2022 02:25:11 PM KST
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-kbwb2 1/1 Running 0 26s 10.171.232.42 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 0/1
testapp-5b958f57fd-slzpp 1/1 Running 0 65s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-q6vb2 1/1 Terminating 0 9m27s 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 1/1 Running 0 8m48s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
...
Thu 01 Dec 2022 02:25:21 PM KST
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-kbwb2 1/1 Running 0 36s 10.171.232.42 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 0/1
testapp-5b958f57fd-slzpp 1/1 Running 0 75s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-q6vb2 1/1 Terminating 0 9m37s 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 1/1 Running 0 8m58s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
Thu 01 Dec 2022 02:25:22 PM KST ## new pod 2 타겟 등록 완료
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-kbwb2 1/1 Running 0 38s 10.171.232.42 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 0/1
testapp-5b958f57fd-slzpp 1/1 Running 0 77s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-q6vb2 1/1 Terminating 0 9m39s 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 1/1 Running 0 9m 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
Thu 01 Dec 2022 02:25:24 PM KST
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-kbwb2 1/1 Running 0 39s 10.171.232.42 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 0/1
testapp-5b958f57fd-slzpp 1/1 Running 0 78s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-q6vb2 1/1 Terminating 0 9m40s 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 1/1 Running 0 9m1s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
Thu 01 Dec 2022 02:25:25 PM KST ## new pod 2 생성 완료, old pod 2 제거 시작
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-kbwb2 1/1 Running 0 41s 10.171.232.42 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
testapp-5b958f57fd-slzpp 1/1 Running 0 80s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-q6vb2 1/1 Terminating 0 9m42s 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 1/1 Terminating 0 9m3s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
Thu 01 Dec 2022 02:25:27 PM KST
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-kbwb2 1/1 Running 0 42s 10.171.232.42 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
testapp-5b958f57fd-slzpp 1/1 Running 0 81s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-q6vb2 1/1 Terminating 0 9m43s 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 1/1 Terminating 0 9m4s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
...
Thu 01 Dec 2022 02:25:54 PM KST
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-kbwb2 1/1 Running 0 70s 10.171.232.42 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
testapp-5b958f57fd-slzpp 1/1 Running 0 109s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-q6vb2 0/1 Terminating 0 10m 10.171.179.106 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 0/1 Terminating 0 9m32s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
Thu 01 Dec 2022 02:25:56 PM KST ## TerminationGracePeriodSeconds 가 만료되어서 강제로 old pod 1 제거 완료
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-kbwb2 1/1 Running 0 71s 10.171.232.42 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
testapp-5b958f57fd-slzpp 1/1 Running 0 110s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 0/1 Terminating 0 9m33s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
Thu 01 Dec 2022 02:25:57 PM KST
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-kbwb2 1/1 Running 0 73s 10.171.232.42 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
testapp-5b958f57fd-slzpp 1/1 Running 0 112s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
testapp-7b6b896b5b-xv9mc 0/1 Terminating 0 9m35s 10.171.233.254 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
Thu 01 Dec 2022 02:25:59 PM KST ## TerminationGracePeriodSeconds 가 만료되어서 강제로 old pod 2 제거 완료
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-kbwb2 1/1 Running 0 74s 10.171.232.42 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
testapp-5b958f57fd-slzpp 1/1 Running 0 113s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
Thu 01 Dec 2022 02:26:00 PM KST
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
testapp-5b958f57fd-kbwb2 1/1 Running 0 75s 10.171.232.42 ip-10-171-227-94.ap-northeast-2.compute.internal <none> 1/1
testapp-5b958f57fd-slzpp 1/1 Running 0 114s 10.171.176.164 ip-10-171-184-203.ap-northeast-2.compute.internal <none> 1/1
타겟 그룹 상태 확인
신규 요청 상태 확인
Thu 01 Dec 2022 02:24:05 PM KST
- testapp-7b6b896b5b-q6vb2
Thu 01 Dec 2022 02:24:06 PM KST ## 배포 시작, new pod 1 생성 시작
- testapp-7b6b896b5b-xv9mc
Thu 01 Dec 2022 02:24:07 PM KST
- testapp-7b6b896b5b-xv9mc
...
Thu 01 Dec 2022 02:24:30 PM KST
- testapp-7b6b896b5b-xv9mc
Thu 01 Dec 2022 02:24:31 PM KST ## new pod 1 타겟 등록 시작
- testapp-7b6b896b5b-xv9mc
Thu 01 Dec 2022 02:24:32 PM KST
- testapp-7b6b896b5b-q6vb2
...
Thu 01 Dec 2022 02:24:43 PM KST
- testapp-7b6b896b5b-q6vb2
Thu 01 Dec 2022 02:24:44 PM KST ## new pod 1 타겟 등록 완료
- testapp-7b6b896b5b-xv9mc
Thu 01 Dec 2022 02:24:45 PM KST ## new pod 1 생성 완료
- testapp-7b6b896b5b-q6vb2
Thu 01 Dec 2022 02:24:47 PM KST ## old pod 1 제거 시작, new pod 1 생성 시작
- testapp-7b6b896b5b-xv9mc
Thu 01 Dec 2022 02:24:48 PM KST
- testapp-5b958f57fd-slzpp
...
Thu 01 Dec 2022 02:25:08 PM KST
- testapp-7b6b896b5b-xv9mc
Thu 01 Dec 2022 02:25:09 PM KST ## new pod 2 타겟 등록 시작
- testapp-5b958f57fd-slzpp
Thu 01 Dec 2022 02:25:10 PM KST
- testapp-7b6b896b5b-xv9mc
...
Thu 01 Dec 2022 02:25:21 PM KST
- testapp-5b958f57fd-slzpp
Thu 01 Dec 2022 02:25:22 PM KST ## new pod 2 타겟 등록 완료
- testapp-7b6b896b5b-xv9mc
Thu 01 Dec 2022 02:25:23 PM KST
- testapp-5b958f57fd-slzpp
Thu 01 Dec 2022 02:25:24 PM KST ## new pod 2 생성 완료, old pod 2 제거 시작
- testapp-5b958f57fd-kbwb2
Thu 01 Dec 2022 02:25:26 PM KST
- testapp-5b958f57fd-kbwb2
...
Thu 01 Dec 2022 02:25:55 PM KST
- testapp-5b958f57fd-kbwb2
Thu 01 Dec 2022 02:25:56 PM KST ## TerminationGracePeriodSeconds 가 만료되어서 강제로 old pod 1 제거 완료
- testapp-5b958f57fd-slzpp
Thu 01 Dec 2022 02:25:58 PM KST
- testapp-5b958f57fd-slzpp
Thu 01 Dec 2022 02:25:59 PM KST ## TerminationGracePeriodSeconds 가 만료되어서 강제로 old pod 2 제거 완료
- testapp-5b958f57fd-kbwb2
Thu 01 Dec 2022 02:26:00 PM KST
- testapp-5b958f57fd-slzpp
TerminationGracePeriodSeconds 와 어플리케이션 내의 graceful shutdown 구현을 적용한 배포 테스트의 결과는 아래와 같다.
무중단 배포가 실패하는 두가지 경우에 대해서 알아보고 이에 대한 보완책을 적용한 테스트도 함께 진행해보았다.
EKS 와 AWS Load Balancer Controller 의 조합을 사용하면 AWS 기능을 쉽게 활용하며 클러스터를 운영할 수 있다. 구조적인 빈공간이 있었지만 다행히 이를 보완해주는 대비책이 제공되고 있었고 완벽하진 않더라도 많은 부분을 보완해주는 것을 확인하였다.
pod readiness gate 와 TerminationGracePeriodSeconds, 사용하지 않을 이유가 없다 무조건 쓰자!
그리고 어플리케이션에는 graceful shutdown 을 구현해주도록 하자.