구글과 유비소프트가 게임 업계에 큰 선물을 하나 했습니다. 쿠버네티스 기반의 게임 서버인 Agones를 발표한 것인데요, Agones는 그리스어로 경기, 경연, 모임을 뜻합니다. Agones의 등장으로 온라인 멀티플레이어 게임 서버 확장에 새로운 지평이 열릴 것 같습니다.
FPS, MMO, MOBA 게임 같은 온라인 멀티플레이어 게임 사용자는 로그인한 다음 게임 서버를 선택해 플레이합니다. 게임 서버는 보통 스테이트풀 애플리케이션(Stateful application)을 운영합니다. 메모리에 모든 게 올라가 있죠. 하지만 데이터베이스 같은 스테이트풀 애플리케이션과 다른 점도 있습니다. 몇 달, 몇 년씩 운영되는 데이터베이스 서버와 달리 게임 서버는 몇 분에서 몇 시간으로 운영 시간이 짧죠. 여러 플레이어가 접속해 한 게임을 몇 달, 몇 년 하지는 않잖아요. 또한, 게임 서버는 네트워크 지연에 민감하므로 로드밸런서를 거치지 않고 호스트 IP와 포트에 직접 접속합니다. 다음 구성도는 전통적인 게임 서버 환경입니다.
“Agones을 쓰면 좋은 이유는?”
Agones은 위 구성도를 간결하게 만들어 줍니다. 클러스터 관리와 게임 서버 확장 솔루션을 쓸 일이 없게 만들죠. 아래 구성도를 보시죠. 이 환경에서는 게임 서버 생성, 운영, 관리가 쿠버네티스 도구와 API를 통해 이루어집니다.
Agones이 쿠버네티스를 토대로 삼는 것이 제공하는 이점은 매우 많습니다. 서비스 환경과 같이 서버 환경을 마련해 개발할 수 있죠. 미니쿠베(Minikube)를 이용할 경우 로컬 머신에 개발 환경을 꾸리기도 쉽습니다. 쿠버네티스는 게임 서비스 관련해 여러 서버에 대한 운영을 간결하게 만듭니다. 쿠버네티스 환경에 게임 서버뿐 아니라 고객 지원 서비스, 계정 관리, 게임 마켓 플레이스 등을 띄워 놓고 운영하면 됩니다.
Agones이 제공하는 가장 큰 혜택은? 네, 중소 게임 업체는 보통 서버 사이드 전문가가 없는 경우가 많죠. Agones을 쓰면 이 고민을 할 필요가 없습니다. 쿠버네티스 플랫폼은 수백 명의 고수의 기여를 통해 지속해서 개선이 이루어지는 오픈 소스 프로젝트입니다. 이런 지식을 게임 업체가 고스란히 활용할 수 있다는 점, 이것만 해도 Agones은 무조건 고려해야 할 대상이 아닐까 싶네요.
자, 실습 간단히 한번 해보시죠. 게임 서버 좀 만들어 보겠습니다.
다 만들고 나면 와우 소리가 절로 나올 것입니다. 쿠버네티스를 안다면, 일반 워크로드 배포와 별반 다르지 않다고 느낄 것입니다.
게임 서버를 컨테이너 이미지로 구성합니다.
Dockerfile
FROM debian:stretch RUN useradd -m server COPY ./bin/game-server /home/server/game-server RUN chown -R server /home/server && \ chmod o+x /home/server/game-server USER server ENTRYPOINT ["/home/server/game-server"]
쿠버네티스에 Agones을 설치한 다음과 같이 게임 서버 리소스를 쿠버네티스에 추가합니다.
gameserver.yaml
apiVersion: "stable.agon.io/v1alpha1" kind: GameServer metadata: name: my-game-server spec: containerPort: 7654 # Pod template template: spec: containers: - name: my-game-server-container image: gcr.io/agon-images/my-game-server:0.1
kubectl 명령 또는 쿠버네티스 API를 이용해 게임 서버를 생성할 수 있습니다.
$ kubectl apply -f gamesever.yaml gameserver "my-game-server" created
Agones 매니저는 yaml에 정의한 게임 서버 프로세스를 시작합니다. 이 과정에서 IP와 포트가 할당되고, 이를 통해 게임 서버는 자신이 고른 서버에 접속합니다. 게임 서버 관리자는 kubectl 명령 또는 쿠버네티스 API로 어떤 게이머가 연결되어 있는지, 게임 서버 상태는 어떤지 등을 살펴볼 수 있습니다.
$ kubectl describe gameserver my-game-server Name: my-game-server Namespace: default Labels: Annotations: API Version: stable.agones.dev/v1alpha1 Kind: GameServer Metadata: Cluster Name: Creation Timestamp: 2018-02-09T05:02:18Z Finalizers: stable.agones.dev Generation: 0 Initializers: Resource Version: 13422 Self Link: /apis/stable.agones.dev/v1alpha1/namespaces/default/gameservers/my-game-server UID: 6760e87c-0d56-11e8-8f17-0800273d63f2 Spec: Port Policy: dynamic Container: my-game-server-container Container Port: 7654 Health: Failure Threshold: 3 Initial Delay Seconds: 5 Period Seconds: 5 Host Port: 7884 Protocol: UDP Template: Metadata: Creation Timestamp: Spec: Containers: Image: gcr.io/agones-images/my-game-server:0.1 Name: my-game-server-container Resources: Status: Address: 192.168.99.100 Node Name: agones Port: 7884 State: Ready Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal PortAllocation 3s gameserver-controller Port allocated Normal Creating 3s gameserver-controller Pod my-game-server-q98sz created Normal Starting 3s gameserver-controller Synced Normal Ready 1s gameserver-controller Address and Port populated
Agones는 현재 v0.1 알파 릴리즈가 공개된 초기 단계라 부족한 부분도 많지만 오픈 소스 프로젝트의 특성상 아마 매우 빠르게 개선이 이루어질 것입니다. v0.2 버전이 곧 릴리즈 될 예정인데, 여기에는 게임 서버 플릿 등 기대되는 기능이 추가됩니다.
구글 클라우드 컴퓨팅 환경에서 Agones로 게임 사업 기반을 다지고자 한다면 언제든 메가존으로 문의 바랍니다.