안녕하세요, 플라네타리움에서 Libplanet을 개발하고 있는 문성원입니다. 작년 12월 16일부터 2주일간, 저희가 만들고 있는 완전 탈중앙 MMORPG인 나인 크로니클의 알파 테스트가 있었는데요. 오늘은 그 준비를 위해 쿠버네티스(Kubernetes)에 헤드리스 게임을 배포한 경험을 공유해보려고 합니다.
어떤 게 필요한가요?
Libplanet으로 개발된 게임은 블록체인 노드라고 할 수 있는데, 이는 나인 크로니클도 마찬가지입니다. 즉 모든 게임 클라이언트는 그 자체로 일반적인 게임 서버와 비슷한 역할(데이터 저장, 판정)을 온전히 수행할 수 있습니다. 이러한 P2P 환경에서 게임 환경과 최대한 유사하게 테스트하기 위해서는, 이러한 게임 클라이언트를 동시에 많이 실행하여 테스트할 필요가 있었습니다.
구체적인 희망 사항
- (많은 소프트웨어가 그렇듯이) 테스트 중인 게임 역시 필요에 따라 업데이트를 해야 할 때가 있습니다. 이때 실행된 모든 클라이언트를 돌면서 직접 업데이트하는 것은 그리 좋은 전략이 아닙니다.
- 한두 개를 켜서 실행하는 것은 개발자 개인이 쉽게 할 수 있는 일이지만, 우리는 그것보다 많은 게임 클라이언트를 테스트하고 싶습니다.
- 게임을 실행하긴 하지만, 많은 게임 클라이언트를 동시에 띄우는 것이기 때문에 각 게임 클라이언트의 화면을 보는 것은 그렇게 중요한 사항이 아닙니다. 즉 아무런 UI 없이 헤드리스(headless)로 실행해도 괜찮습니다.
도커(Docker)
이런 사항을 만족하기 위해서는 여러 개의 프로세스를 동시에 실행하고 관리해야 했는데, 이때 사용한 솔루션이 도커(Docker)입니다. 도커는 리눅스 응용 프로그램을 실행환경째로 컨테이너화하여 실행하기 위해 많이 사용하는 솔루션입니다. 나인 크로니클은 첫 출시에서 리눅스를 주요 플랫폼으로 고려하고 있진 않지만, Unity를 사용해서 게임 개발을 하다보니 비교적 쉽게 리눅스용 빌드를 뽑을 수 있었고 (헤드리스 테스트 노드에선 크게 중요치 않은) UI 버그를 제외하면 동작도 크게 다르진 않았습니다.
쿠버네티스(Kubernetes)
도커를 사용해서 게임 빌드를 어디서나 쉽게 돌릴 수 있게 컨테이너로 만들었지만 이걸로 끝은 아니었습니다. 저희의 목표는 어디까지나 많은 클라이언트를 손쉽게 실행/종료/업데이트하며 테스트 환경을 유지하는 것이니까요. 이를 위해서는 도커만으로는 부족했습니다.
가장 먼저 떠오른 방법은 ECS와 같이 클라우드 공급자가 제공하는 실행 환경이었습니다. 이런 실행 환경들은 복잡한 워크플로우를 효율적으로 설정할 수 있게 디자인되어있지만, 바꾸어보면 설정이 복잡하며 테스트 환경에서만 사용한다면 많은 기능을 사용하지 않을 것이라는 생각이 들었습니다. 또한 특정 클라우드 공급자에 종속되는 테스트 환경이 이후 이전 작업등에 부담이 될 것 같기도 했고요.
그래서 떠올린 대안이 쿠버네티스였습니다. 쿠버네티스는 저희가 ECS 같은 서비스를 통해서 하고 싶은 일을 공급자 중립적(Provider Agonistic)으로 할 수 있는 오픈소스 프로젝트입니다. 여러 종류의 복잡한 컨테이너를 손쉽게 띄우고 내리는 기능을 컨테이너 오케스트레이션이라고 하는데, 저희는 거의 같은 종류의 컨테이너(게임)를 여러 개 띄우고 싶은 것뿐이니 설정은 그리 복잡하지 않았습니다.
다음 이야기
적다 보니 이야기가 많이 길어졌네요. 다음 시간에는 테스트를 위해 쿠버네티스를 어떻게 설정하고 클라우드 상에 배치하고 있는지 구체적인 절차에 대해 살펴보도록 하겠습니다.