4 분 소요


이 가이드는 Agones 를 사용하여 GameServer 를 빠르게 만드는 방법을 설명합니다.

Quickstart: Create a Game Server을 정리한 글입니다.




목표

  • Agones 커스텀 리소스를 사용하여 쿠버네티스에서 GameServer 를 만듭니다.
  • IP 주소, 포트 및 상태와 같은 GameServer 정보를 가져옵니다.
  • GameServer 에 연결합니다.




1. GameServer 생성하기

다음 명령을 실행하여 쿠버네티스에 GameServer 레코드를 생성하고,
간단한 UDP 게임 서버 코드를 실행하기 위한 백업 파드도 생성합니다:

  $ kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/release-1.14.0/examples/simple-game-server/gameserver.yaml
    gameserver.agones.dev/simple-game-server-4ss4j created

다음 몀령을 실행하면 실행 중인 모든 GameServer 를 볼 수 있습니다:

  $ kubectl get gameservers
  NAME                       STATE      ADDRESS        PORT   NODE             AGE
  simple-game-server-k9vxm   Shutdown   192.168.65.4   7536   docker-desktop   61m

다음 명령을 실행하면 생성된 파드를 볼 수 있습니다:

  $ kubectl get pods
    NAME                        READY     STATUS    RESTARTS   AGE
    simple-game-server-k9vxm    2/2       Running   0          5m

파드는 simple-game-server 로 시작됩니다.
위에서 볼 수 있듯이 READY : 2/2 는 이 파드에서 실행 중인 두 개의 컨테이너가 있다는 의미입니다.
이는 Agones 가 GameServer의 준비 및 상태 확인을 위해 SDK 사이드카를 주입했기 때문입니다.

YAML 파일에 대한 자세한 내용은 GameServer 사양 가이드를 참조하세요.




2. GameServer 상태 가져오기

다음 명령으로 GameServer 상태가 Ready 가 될 때까지 기다립니다:

  $ watch kubectl describe gameserver

다음 명령으로 GameServer 확인하고,

  $ kubectl get gameservers
    NAME                       STATE      ADDRESS        PORT   NODE             AGE
    simple-game-server-k9vxm   Shutdown   192.168.65.4   7536   docker-desktop   61m

자세한 정보는 다음 명령으로 확인합니다:

  $ kubectl describe gameserver
  Name:         simple-game-server-k9vxm
  Namespace:    default
  Labels:       <none>
  Annotations:  agones.dev/ready-container-id: docker://8423ea6916bc04b36bd44811b72451c2b7b1c3ca25cb9bfd60d12e4c8a8f224e
                agones.dev/sdk-version: 1.14.0
  API Version:  agones.dev/v1
  Kind:         GameServer
  Metadata:
    Creation Timestamp:  2021-05-15T12:45:51Z
    Finalizers:
      agones.dev
    Generate Name:  simple-game-server-
    Generation:     7
    Managed Fields:
      API Version:  agones.dev/v1
      Fields Type:  FieldsV1
      fieldsV1:
        f:metadata:
          f:generateName:
        f:spec:
          .:
          f:template:
            .:
            f:spec:
              .:
              f:containers:
      Manager:      kubectl-create
      Operation:    Update
      Time:         2021-05-15T12:45:51Z
      API Version:  agones.dev/v1
      Fields Type:  FieldsV1
      fieldsV1:
        f:metadata:
          f:annotations:
            f:agones.dev/ready-container-id:
        f:spec:
          f:ports:
        f:status:
          f:address:
          f:nodeName:
          f:ports:
      Manager:      controller
      Operation:    Update
      Time:         2021-05-15T12:46:07Z
      API Version:  agones.dev/v1
      Fields Type:  FieldsV1
      fieldsV1:
        f:status:
          f:state:
      Manager:         sdk-server
      Operation:       Update
      Time:            2021-05-15T13:31:31Z
    Resource Version:  879673
    Self Link:         /apis/agones.dev/v1/namespaces/default/gameservers/simple-game-server-k9vxm
    UID:               6984705e-58ae-4c20-b989-dc1f5e05ada0
  Spec:
    Container:  simple-game-server
    Health:
      Failure Threshold:      3
      Initial Delay Seconds:  5
      Period Seconds:         5
    Ports:
      Container:       simple-game-server
      Container Port:  7654
      Host Port:       7536
      Name:            default
      Port Policy:     Dynamic
      Protocol:        UDP
    Scheduling:        Packed
    Sdk Server:
      Grpc Port:  9357
      Http Port:  9358
      Log Level:  Info
    Template:
      Metadata:
        Creation Timestamp:  <nil>
      Spec:
        Containers:
          Image:  gcr.io/agones-images/simple-game-server:0.3
          Name:   simple-game-server
          Resources:
            Limits:
              Cpu:     20m
              Memory:  64Mi
            Requests:
              Cpu:     20m
              Memory:  64Mi
  Status:
    Address:    192.168.65.4
    Node Name:  docker-desktop
    Players:    <nil>
    Ports:
      Name:          default
      Port:          7536
    Reserved Until:  <nil>
    State:           Shutdown
  Events:
    Type    Reason    Age   From                Message
    ----    ------    ----  ----                -------
    Normal  Shutdown  30m   gameserver-sidecar  SDK state change

Container Port(7654) 와 Host Port(7536) 를 확인합니다.

실제 GameServer 의 UDP 포트를 확인하면 컨테이너에 직접 접속해서 확인해 볼 수 있습니다.

$ kubectl exec -it simple-game-server-k9vxm -- sh
  / $ netstat -an | grep udp  
  udp        0      0 :::7654                 :::*




서비스 생성하기(윈도우/Mac 환경)

이 가이드는 21년 06월에 작성했습니다. 가이드를 작성하는 동안에는
WSL 환경에서 Minikube 를 실행할 때 포트가 노출되지 않아 서비스를
수동으로 실행해야 했습니다.


외부에서 접근할 수 있는 서비스를 만들기 위해,
다음 내용으로 agones.yaml 서비스 파일 생성합니다.

  apiVersion: v1
  kind: Service
  metadata:
    name: agones-service
  spec:
    type: NodePort
    selector:
      agones.dev/role: gameserver
    ports:
      - protocol: UDP
        #nodePort: {Node Port}
        port: {Host Port}
        targetPort: {Container Port}

다음 명령으로 agones-service 서비스를 적용합니다.

$ kubectl apply -f agones.yaml
  service "agones-service" created

다음 명령으로 agones-service 서비스 상세 내용을 볼 수 있습니다.

$ kubectl describe service agones-service

모든 서비스를 확인하는 명령은 다음과 같습니다.

$ kubectl get services
  NAME             TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
  agones-service   NodePort    10.99.28.120   <none>        7654:30054/UDP   15m
  kubernetes       ClusterIP   10.96.0.1      <none>        443/TCP          18d

다음 명령으로 agones-service 서비스를 테스트할 수 있습니다.

$ ncat -u localhost {Node Port}

다음 명령으로 agones-service 서비스 정리합니다.

$ kubectl delete service agones-service
  service "agones-service" deleted




3. GameServer 연결하기

이제 게임 서버와 통신 할 수 있습니다:

$ nc -u {IP} {PORT}
  Hello World !
  ACK: Hello World !
  EXIT

마지막으로 종료 명령을 실행하도록 SDK에 지시하는 EXIT 를 입력하여
GameServer 를 종료할 수 있습니다.

kubectl describe gameserver 명령을 다시 실행하면 GameServer
완전히 사라지거나 삭제되는 상태인 Shutdown 으로 표시됩니다.




다음 과정

자체 GameServer 컨테이너를 사용하려는 경우 Agones SDK를 올바르게 통합했는지 확인하세요.




참고자료

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
shell $ 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
      




댓글남기기