Agones 리서치 Part.3 - GameServer 만들기
이 가이드는 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
- 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을 시도
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
 
- simple-game-server 테스트하기
        
- 
    Getting Started with Minikube on WSL2 
 Cannot reach Kubernetes Cluster from WSL - failed to solve
 
      
댓글남기기