5 분 소요


Agones는 쿠버네티스에서 전용(Dedicated) 게임 서버를 호스팅, 실행 및 확장하기 위한 라이브러리 입니다.
여기에서는 윈도우즈 WSL2 환경에서 Agones를 실행해보겠습니다.

Agones 는 그리스어 agōn 에서 나왔으며 대략 “경쟁” , “게임에서 경쟁”
“모임(gathering)” 의 뜻이 있습니다. 출처




Agones 란?

Agones 는 쿠버네티스를 기반으로 구축된 대규모 멀티플레이어 게임의
전용(Dedicated) 게임 서버를 배포, 호스팅, 확장 및 조정(orchestrating)하기 위한
오픈 소스 플랫폼 입니다.

클라우드 및 온 프레미스 인프라를 모두 염두에 두고 구축된 AgonesFleet 관리,
Autoscaling 등에 필요한 전략을 조정하여 전용 게임 서버를 호스팅하는 데 사용되는 리소스가
해당 환경에 최적의 비용이 되도록 할 수 있습니다.


설계

Agones 는 쿠버네티스와 통합되고 특정 API를 노출하여 게임 별 클러스터링 요청을 쉽게 처리할 수 ​​있습니다.
Agones 는 일반적으로 경기 기간 동안 상태를 메모리에 보관하는 대기 시간이 짧은 전용 게임 서버에 중점을 둡니다.
이 게임 서버는 수명이 짧습니다. 전용 게임 서버는 몇 분 또는 몇 시간 동안 실행됩니다. 이렇게 진행이 빠른 게임은 지연 시간에 민감하므로 전용 게임 서버를 사용하려면 로드밸런서를 거치지 않고 IP 및 포트를 호스팅하는 게임 서버 프로세스에 직접 연결해야 합니다.


통합

Agones 는 쿠버네티스 kubectl 을 통해 커맨드라인 통합을 제공합니다.
그러나 대부분 프로그래밍 방식으로 Agones와 상호 작용하기를 원할 것입니다.
이를 통해 MatchmakerAgones 와 직접 상호 작용하여 전용 게임 서버를 프로비저닝할 수 있습니다.
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 를 사용한다면 윈도우 버전을 설치합니다.

      윈도우에서 설치하는 방법은 다음과 같습니다.


대시보드 설치하기

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
      
  • 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

Tools

Agones

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
      

댓글남기기