배포 자동화 스크립트를 만들기 전에 가장 궁금했던 것은 배포 전략(?) 이었다.
예를 들어 로드 밸런서에 인스턴스 2 대를 운영 중이라면, 3 가지 정도의 배포 방법을 생각할 수 있다.
- 인스턴스를 2 대 이용할 경우, A 인스턴스를 중단하고 새로 배포 후, B 인스턴스를 중단하고 새로 배포하는 방법이 있을 수 있다.
- 인스턴스를 2 대에서 2 대를 추가할 경우, C/D 인스턴스에 새로 배포 후, A/B 인스턴스를 중단하는 방법이 있을 수 있다.
- 인스턴스를 2 대에서 1 대를 추가할 경우, C 인스턴스에 새로 배포 후에, A 나 B 인스턴스를 중단하든 그 반대로 하든... 아무튼...
Service 설정에 보면 Replica 전략에서 배포구성에 관한 옵션이 두가지 있다. minimumHealthyPercent 와 maximumPercent 인데 이것과 인스턴스 수 조정으로 배포 전략을 결정할 수 있다. minimumHealthyPercent 은 RUNNING 상태인 Task 수를 최소 얼만큼 유지할 것인지를 설정한다. 로드 밸런서를 붙인 상태에서는 동시에 inService 상태 인지도 체크한다. maximumPercent 는 RUNNING 상태이거나 PENDING 상태의 최대 Task 수를 고려하여 설정한다.
(아래는 min / max 로 표현하겠음.)
로드 밸런서를 붙인 상태에서 운영중인 2 대의 인스턴스를 가장 빠르고 안정적으로 배포하기 위한 설정을 위해 다음과 같이 테스트 해 보았다.
A. Instance 2 (+0) 50% 100%
이 설정은 인스턴스 2 대 중, 하나의 인스턴스의 Task(50%) 는 무조건 RUNNING 상태를 유지하게 된다는 것을 예상할 수 있다. 그로 인해 번갈아 가면서 배포가 가능하게 될 것이다.
- Service Log
00:00:00 - 로드밸런스에서 A 인스턴스 등록 해제
00:00:00 - A Task DRAINING 상태 시작
00:00:12 - A Task 중지 완료
00:00:22 - 새로운 A Task 시작
00:00:33 - 로드밸런스에서 A 인스턴스 등록
00:00:54 - 로드밸런스에서 B 인스턴스 등록 해제
00:00:54 - B Task DRAINING 상태 시작
00:01:15 - B Task 중지 완료
00:01:25 - 새로운 B Task 시작
00:01:36 - 로드밸런스에서 B 인스턴스 등록
A Instance -> LB 해제 -> Task 중지 -> Task 시작 -> LB 등록
B Instance -> LB 해제 -> Task 중지 -> Task 시작 -> LB 등록
로그를 보면 Task 를 삭제하거나 실행하는 과정은 간단하다.
1. 로드밸런스에서 인스턴스 등록 해제
2. Task DRAINING 시작
3. Task 중지
4. 새로운 Task 시작
5. 로드밸런스에서 인스턴스 재등록
여기서 max 를 200% 로 둔 다면 하나의 Task 를 DRAINING 으로 변경하며 즉시 여유분의 인스턴스를 찾을 것이므로 경고가 발생한다. 배포는 되겠지만 약간의 딜레이가 발생할 것이다.
B. Instance 2 (+0) 100% 150%
이 설정은 인스턴스 2 대 중, 2 대의 인스턴스의 Task(100%) 가 무조건 RUNNING 상태를 유지하게 되므로 배포할 방법이 없다.
min 을 100% 로 설정하려면 max 값에 대응할 수 있는 추가 인스턴스가 필요하다.
CPU / MEM / PORT 등의 요구사항을 만족하는 인스턴스를 찾지 못했다는 에러 메시지가 나타날 것이다.
- Service Log
00:00:00 - 요구사항에 부합하는 컨테이너 인스턴스가 없으므로 Task 를 실행할 수 없다.
C. Instance 2 (+1) 50% 150%
- Service Log
00:00:00 - 로드밸런스에서 A 인스턴스 등록 해제
00:00:00 - A Task DRAINING 상태 시작
00:00:00 - 새로운 C Task 시작
00:00:20 - A Task 중지 완료
00:00:20 - 로드밸런스에서 C 인스턴스 등록
00:00:31 - 새로운 A Task 시작
00:00:41 - 로드밸런스에서 B 인스턴스 등록 해제
00:00:41 - B Task DRAINING 상태 시작
00:00:41 - 로드밸런스에서 A 인스턴스 등록
00:01:02 - B Task 중지 완료
A Instance -> LB 해제 -> Task 중지 -> Task 시작 -> LB 등록
B Instance -> LB 해제 -> Task 중지
C Instance -> Task 시작 -> LB 등록
D. Instance 2 (+1) 100% 150%
- Service Log
00:00:00 - 새로운 C Task 시작
00:00:13 - 로드밸런스에서 C 인스턴스 등록
00:00:34 - 로드밸런스에서 A 인스턴스 등록 해제
00:00:34 - A Task DRAINING 상태 시작
00:00:54 - A Task 중지 완료
00:01:05 - 새로운 A Task 시작
00:01:16 - 로드밸런스에서 A 인스턴스 등록
00:01:37 - 로드밸런스에서 B 인스턴스 등록 해제
00:01:37 - B Task DRAINING 상태 시작
00:01:58 - B Task 중지 완료
A Instance -> LB 해제 -> Task 중지 -> Task 시작 -> LB 등록
B Instance -> LB 해제 -> Task 중지
C Instance -> Task 시작 -> LB 등록
E. Instance 2 (+2) 50% 200%
- Service Log
00:00:00 - 로드밸런스에서 A 인스턴스 등록 해제
00:00:00 - A Task DRAINING 상태 시작
00:00:00 - 새로운 C, D Task 시작
00:00:10 - 로드밸런스에서 C 인스턴스 등록
00:00:21 - 로드밸런스에서 B 인스턴스 등록 해제
00:00:21 - B Task DRAINING 상태 시작
00:00:21 - A Task 중지 완료
00:00:21 - 로드밸런스에서 D 인스턴스 등록
00:00:32 - B Task 중지 완료
A Instance -> LB 해제 -> Task 중지
B Instance -> LB 해제 -> Task 중지
C Instance -> Task 시작 -> LB 등록
D Instance -> Task 시작 -> LB 등록
F. Instance 2 (+2) 100% 200%
- Service Log
00:00:00 - 새로운 C, D Task 시작
00:00:12 - 로드밸런스에서 C, D 인스턴스 등록
00:00:34 - 로드밸런스에서 A, B 인스턴스 등록 해제
00:00:34 - A, B Task DRAINING 상태 시작
00:00:55 - A, B Task 중지 완료
A Instance -> LB 해제 -> Task 중지
B Instance -> LB 해제 -> Task 중지
C Instance -> Task 시작 -> LB 등록
D Instance -> Task 시작 -> LB 등록
위와 같이 minimumHealthyPercent / maximumPercent / task 수를 설정하여 다양한 배포 방법들을 테스트 해 보았다. B 를 제외한 A/C/D/E/F 의 배포는 모두 정상적으로 이루어 졌다. 물론 시간이나 순서 등은 각자의 배포물 용량이나 트래픽에 따라 변할 수 있다. 단계가 간결한 F 배포가 가장 빠를 것 같았는데 E 배포가 더 빨랐다는 것은 예상 밖이다. C 나 D 같은 경우는 min 과 max 값이 동시에 모두 가능할 때 어느쪽으로 먼저 배포에 영향을 미치는지를 보고 싶어서 테스트 한 것이었는데 minimumHealthyPercent 가 매우 중요함을 알게 됐다.이번 테스트로 A 방법이 가장 효율적인 것을 알게 되었고, 빠르고 빈도수가 높은 배포는 E/F 방법을 으로 전략을 세우는 것이 효과적임을 알게 됐다.
결론
가성비 좋은 배포는 A, 속도/빈도수 높은 배포는 E/F 를 사용하자.
WRITTEN BY
- 손가락귀신
정신 못차리면, 벌 받는다.