Agones Part.1 - 소개
Agones는 쿠버네티스에서 전용(Dedicated) 게임 서버를 호스팅, 실행 및 확장하기 위한 라이브러리 입니다.
여기에서는 윈도우즈 WSL2 환경에서 Agones를 실행해보겠습니다.
Agones 는 그리스어 agōn 에서 나왔으며 대략 “경쟁” , “게임에서 경쟁” 및
“모임(gathering)” 의 뜻이 있습니다. 출처
Agones 란?
Agones 는 쿠버네티스를 기반으로 구축된 대규모 멀티플레이어 게임의
전용(Dedicated) 게임 서버를 배포, 호스팅, 확장 및 조정(orchestrating)하기 위한
오픈 소스 플랫폼 입니다.
클라우드 및 온 프레미스 인프라를 모두 염두에 두고 구축된 Agones 는 Fleet
관리,
Autoscaling
등에 필요한 전략을 조정하여 전용 게임 서버를 호스팅하는 데 사용되는 리소스가
해당 환경에 최적의 비용이 되도록 할 수 있습니다.
설계
Agones 는 쿠버네티스와 통합되고 특정 API를 노출하여 게임 별 클러스터링 요청을 쉽게 처리할 수 있습니다.
Agones 는 일반적으로 경기 기간 동안 상태를 메모리에 보관하는 대기 시간이 짧은 전용 게임 서버에 중점을 둡니다.
이 게임 서버는 수명이 짧습니다. 전용 게임 서버는 몇 분 또는 몇 시간 동안 실행됩니다. 이렇게 진행이 빠른 게임은 지연 시간에 민감하므로 전용 게임 서버를 사용하려면 로드밸런서를 거치지 않고 IP 및 포트를 호스팅하는 게임 서버 프로세스에 직접 연결해야 합니다.
통합
Agones 는 쿠버네티스 kubectl
을 통해 커맨드라인 통합을 제공합니다.
그러나 대부분 프로그래밍 방식으로 Agones와 상호 작용하기를 원할 것입니다.
이를 통해 Matchmaker
는 Agones 와 직접 상호 작용하여 전용 게임 서버를 프로비저닝할 수 있습니다.
Agones 는 두 가지의 통합 방법을 제공하는데, 하나는 Kubernetes API 를 사용하는 것이고
다른 하나는 SDK를 사용하여 Agones API 를 직접 통합하는 방법입니다.
Agones SDK는 Unreal Engine, Unity, C ++, Node.js, GO 등과 같은 다양한 프로그래밍 언어로 제공됩니다.
위 그림은 게임 서버 할당 워크플로를 보여줍니다.
Matchmaker
는 게임 서버를 Kubernetes API를 통해 요청하고,
Agones 가 요청을 처리하기 위해 호출을 가로채어 처리합니다.
왜 Agones 인가?
Agones 의 장점은 다음과 같습니다:
- 멀티플레이어 게임 서버의 호스팅, 확장 및 조정을 위한 개발 및 운영 비용을 낮춥니다.
- Linux에서 실행할 수 있는 모든 게임 서버는 모든 언어나 종속성들에 대해서
호스팅 및 조정될 수 있습니다. - Kubernetes를 실행할 수 있는 모든 곳에서 실행할 수 있습니다.
(클라우드, 온 프레미스, 로컬 머신 또는 필요한 모든 곳) - 게임 서비스와 게임 서버는 동일한 기본 플랫폼에 있을 수 있으므로
도구 및 운영 지식이 단순화됩니다. - Kubernetes 도구 생태계를 활용할 수 있습니다.
- 무료, 오픈 소스이며 공개적으로 개발되었습니다.
필수지식
- Docker 및 컨테이너화
Docker 및 컨테이너화는 Agones 의 기술 기반입니다. - Kubernetes
Kubernetes는 Docker를 기반으로 빌드되어 많은 머신에서 대규모로 컨테이너를 관리합니다. - 전용 게임 서버
Agones 는 멀티 플레이어 게임용 전용 게임 서버를 위한 플랫폼입니다. - 게임 엔진
Agones 용 SDK를 즉시 사용할 수있는 엔진은 다음과 같습니다.
설치하기
윈도우즈 환경에서 Docker Desktop
+ Kubernetes
환경에서 설치하는 방법을 소개합니다.
사용 요건
- 쿠버네티스 클러스터 버전 1.18
- Google Kubernetes Engine, Azure Kubernetes Service, Amazon EKS, Minikube
- 게임서버가 클러스터에서 연결할 수 있도록 포트 범위에 대한 방화벽이 허용되어야 합니다.
-
게임서버 상태, 헬스체크 등을 관리하려면 게임서버에 게임서버 SDK가 통합되어 있어야 합니다.
- 도구 설치
-
Helm 설치하기
Helm 은 쿠버네티스 패키지 관리자입니다.Docker Desktop 의 Kubernetes 를 사용한다면 윈도우 버전을 설치합니다.
윈도우에서 설치하는 방법은 다음과 같습니다.
-
Helm Release 에서 Windows amd64 다운로드합니다.
-
helm.exe
경로를 PATH 에 추가합니다.
-
-
대시보드 설치하기
Docker Desktop 에는 쿠버네티스 GUI 가 기본으로 설치되어 있지 않습니다.
대시보드를 사용하여 클러스터를 관리하기 위한 웹 UI를 확인할 수 있습니다.
- 쿠버네티스 대시보드를 설치합니다.
$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/v2.2.0/aio/deploy/recommended.yaml
- 파워셀에서 다음 명령으로 토큰을 생성합니다.
$ $TOKEN=((kubectl -n kube-system describe secret default | Select-String "token:") -split " +")[1] $ kubectl config set-credentials docker-for-desktop --token="${TOKEN}"
성공하면,
%USERPROFILE%/.kube/config
파일의users/name:docker-for-desktop/user/token
에 토큰이 생성됩니다. - 대시보드를 보기 위해 다음 명령을 실행합니다.
$ kubectl proxy Starting to serve on 127.0.0.1:8001
이제
http://localhost:8001/api/v1/namespaces/kubernetes-dashboard/services/https:kubernetes-dashboard:/proxy/
URL 로 대시보드를 볼 수 있습니다.
Agones 설치하기
-
Helm 을 사용하여 설치하기
Heml v3.2.3+ 버전이 필요합니다.- Chart 설치하기
$ helm repo add agones https://agones.dev/chart/stable $ helm repo update $ helm install my-release --namespace agones-system --create-namespace agones/agones
- Chart 설치하기
-
Agones 설치 확인하기
다음 명령으로 Agones 가 실행 중인지 확인합니다:$ kubectl describe --namespace agones-system pods
agones-system
네임스페이스로 생성된 6 개의 파드(Pod)가 문제없는 지 확인합니다.
모든 Conditions 섹션은 다음과 같아야 합니다:Conditions: Type Status Initialized True Ready True ContainersReady True PodScheduled True
모든 파드는
RUNNING
상태여야 합니다:$ kubectl get pods --namespace agones-system NAME READY STATUS RESTARTS AGE agones-allocator-5c988b7b8d-cgtbs 1/1 Running 0 8m47s agones-allocator-5c988b7b8d-hhhr5 1/1 Running 0 8m47s agones-allocator-5c988b7b8d-pv577 1/1 Running 0 8m47s agones-controller-7db45966db-56l66 1/1 Running 0 8m44s agones-ping-84c64f6c9d-bdlzh 1/1 Running 0 8m37s agones-ping-84c64f6c9d-sjgzz 1/1 Running 0 8m47s
이제 Agones 가 설치되었고, 커스텀 리소스 정의를 활용하여
GameServer, Fleet 타입의 리소스를 생성할 수 있습니다.
Agones 정리하기
Agones 배포를 제거/삭제하고 agones-system
네임 스페이스를 삭제하는 방법입니다:
$ kubectl delete fleets --all --all-namespaces
$ kubectl delete gameservers --all --all-namespaces
$ kubectl delete -f https://raw.githubusercontent.com/googleforgames/agones/release-1.14.0/install/yaml/install.yaml
$ kubectl delete namespace agones-system
결론
윈도우즈 WSL 에서 Minikube 를 실행하는 것은 네트워크 제약으로 구성이 어렵고
여러 문제들이 발생합니다.
여기에서는 윈도우즈 환경에서 Docker Desktop으로 Agones 를 실행해 봤습니다.
다음에는 윈도우즈에서 더 좋은 방향으로 구성하는 방법을 소개하겠습니다.
참고자료
Kubernetes
- Kubernetes
- WSL+Docker: Kubernetes on the Windows Desktop
- Kubernetes NodePort vs LoadBalancer vs Ingress? When should I use what?
- Running Kubernetes and the dashboard with Docker Desktop
- docker for window 환경 kubernetes dashboard 생성
- Load Balancing and Reverse Proxying for Kubernetes Services
Tools
- kubectl 치트 시트
- Minikube
- Helm
The package manager for Kubernetes
Agones
- Agones
- Agones: Scaling Multiplayer Game Servers with Open Source (GDC ‘19)
- Scaling UDP Workloads with Kubernetes
- Agones 인스톨하기
GCP 환경에서 설치하는 방법을 소개 - OpenMatch + Agones을 시도
- Agones - a Kubernetes-centric Game Server Toolkit
Docker
문제해결
Agones Getting Started Guide with Minikube uses wrong IP due to minikube bug
Minikube doesn’t properly set the node’s external IP kubernetes/minikube#4330
$ minikube start --extra-config kubelet.node-ip=192.168.99.100
파드의 TCP 포트를 로컬 포트로 포워딩하기
Accessing Kubernetes Pods from Outside of the Cluster
kubernetes/minikube: add documentation for WSL2
cheslijones opened this issue on 24 Apr 2020
If you are on Docker for macOS or Docker for Windows, networking works a bit differently, as there is no direct IP connectivity to the container. On these platforms, Docker requires individual ports to be proxied through.
See the Deploy applications section of https://minikube.sigs.k8s.io/docs/start/ for instructions on how to get access to your service. Please let me know if this helps!
도커 클러스터 접근하기
- 도커를 사용하여 접근하기
$ docker ps -a $ docker exec -it {Container ID} /bin/sh
kubectl
을 사용하여 접근하기$ kubectl exec --stdin --tty {Container Name} -- /bin/bash
- 아니면,
minikube ssh
를 사용합니다.$ minikube ssh
Netcat
- WSL2 Ubuntu 에 netcat 설치
$ sudo apt-get update $ sudo apt-get install netcat
- netcat 테스트
- simple-game-server 테스트하기
$ nc -u IP Port
- simple-game-server 테스트하기
댓글남기기