7 분 소요


이 가이드는 Agones 를 사용하여 서비스 준비가 된 GameServer Fleet(함대)을 만드는 방법을 설명합니다!

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




목표

  • Agones 커스텀 리소스를 사용하여 쿠버네티스에서 Fleet 을 만듭니다.
  • 초기 구성에서 Fleet 을 확장합니다.
  • 플레이 할 FleetGameServer 할당(allocate)을 요청합니다.
  • AllocatedGameServer에 연결합니다.
  • Fleet 에 새로운 GameServer 구성을 배포합니다.




1. Fleet 생성하기

다음 명령을 실행하여 Fleet 을 생성합니다:

$ kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/release-1.14.0/examples/simple-game-server/fleet.yaml

결과로 다음과 같은 성공 메시지가 표시되어야 합니다.

fleet.agones.dev/simple-game-server created

이 명령으로 쿠버네티스에 Fleet 레코드가 생성되어 게임 세션에 할당할 수 있는
두 개의 Warm GameServer가 생성됩니다.

다음 명령을 실행하면,

$ kubectl get fleet

결과는 다음과 같습니다:

NAME                 SCHEDULING   DESIRED   CURRENT   ALLOCATED   READY     AGE
simple-game-server   Packed       2         3         0           2         9m

kubectl get gameservers 를 실행하여 Fleet 이 생성한 GameServer 를 볼 수도 있습니다.
GameServersimple-game-server 가 접두사로 붙습니다.

NAME                             STATE     ADDRESS            PORT   NODE      AGE
simple-game-server-llg4x-rx6rc   Ready     192.168.122.205    7752   minikube   9m
simple-game-server-llg4x-v6g2r   Ready     192.168.122.205    7623   minikube   9m

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




2. Fleet 상태 가져오기

다음 명령은 두 GameServer 가 준비될 때까지 기다립니다.

$ watch kubectl describe fleet simple-game-server
Name:         simple-game-server
Namespace:    default
Labels:       <none>
Annotations:  kubectl.kubernetes.io/last-applied-configuration={"apiVersion":"agones.dev/v1","kind":"Fleet","metadata":{"annotations":{},"name":"simple-game-server","namespace":"default"},"spec":{"replicas":2,...
API Version:  agones.dev/v1
Kind:         Fleet
Metadata:
  Cluster Name:
  Creation Timestamp:  2018-07-01T18:55:35Z
  Generation:          1
  Resource Version:    24685
  Self Link:           /apis/agones.dev/v1/namespaces/default/fleets/simple-game-server
  UID:                 56710a91-7d60-11e8-b2dd-08002703ef08
Spec:
  Replicas:  2
  Strategy:
    Rolling Update:
      Max Surge:        25%
      Max Unavailable:  25%
    Type:               RollingUpdate
  Template:
    Metadata:
      Creation Timestamp:  <nil>
    Spec:
      Health:
      Ports:
        Container Port:  7654
        Name:            default
        Port Policy:     Dynamic
      Template:
        Metadata:
          Creation Timestamp:  <nil>
        Spec:
          Containers:
            Image:  gcr.io/agones-images/simple-game-server:0.3
            Name:   simple-game-server
            Resources:
Status:
  Allocated Replicas:  0
  Ready Replicas:      2
  Replicas:            2
Events:
  Type    Reason                 Age   From              Message
  ----    ------                 ----  ----              -------
  Normal  CreatingGameServerSet  13s   fleet-controller  Created GameServerSet simple-game-server-wlqnd

아래를 보면 현재 Ready 상태에 있는 GameServer 수를 알려주는 Status > Ready Replicas
섹션이 있습니다. 잠시 후 2 개의 Ready Replicas 가 생깁니다.




3. Fleet 확장하기

Fleet 복제본(Replicas)을 2개에서 5개로 확장하겠습니다.

다음 명령을 실행합니다.

$ kubectl scale fleet simple-game-server --replicas=5

이제 kubectl get gameservers 명령을 실행하면 5 개의 GameServer 들을 볼 수 있습니다.

NAME                             STATE    ADDRESS           PORT    NODE       AGE
simple-game-server-sdhzn-kcmh6   Ready    192.168.122.205   7191    minikube   52m
simple-game-server-sdhzn-pdpk5   Ready    192.168.122.205   7752    minikube   53m
simple-game-server-sdhzn-r4d6x   Ready    192.168.122.205   7623    minikube   52m
simple-game-server-sdhzn-wng5k   Ready    192.168.122.205   7709    minikube   53m
simple-game-server-sdhzn-wnhsw   Ready    192.168.122.205   7478    minikube   52m




4. Fleet 에서 GameServer 할당하기

웜(Warm) GameServer 가 많기 때문에 그 중 하나를 사용하도록 요청하고
해당 서버에 접근하는 플레이어가 있다고 표시할 방법이 필요합니다.
(따라서 완료될 때까지 삭제해서는 안됩니다).

노트:
프로덕션에서는 Kubernetes API 호출을 통해 다음 작업을 수행할 수 있지만
kubectl 을 통해서도 이 작업을 수행하고 무슨 일이 일어 났는지 확인할 수 있도록
yaml 로 응답을 반환하도록 요청할 수도 있습니다.

GameServerAllocation 을 통해 사용할 GameServer 를 할당할 수 있으며,
사용 가능할 경우 GameServer 의 세부 정보를 반환하고, 플레이어가 있다고 표시하는
Allocated 상태로 바꾸고, SDK.Shutdown() 을 호출하거나 수동으로 삭제할 때까지 제거하지 않습니다.

GameServerAllocationFleet 과 관련된 점이 없다는 것에 주목할 필요가 있습니다.
GameServerAllocation레이블 선택기(label selector)를 사용하여 할당할 GameServer 그룹을
결정합니다. 즉, FleetGameServerAllocation 은 종종 함께 사용됩니다.

이 예제에서는 레이블 선택기를 사용하여 방금 만든 simple-game-server Fleet을
구체적으로 지정합니다.

$ kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/release-1.14.0/examples/simple-game-server/gameserverallocation.yaml -o yaml

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

명령을 실행한 결과는 다음과 같습니다:

apiVersion: allocation.agones.dev/v1
kind: GameServerAllocation
metadata:
  creationTimestamp: 2019-02-19T02:13:12Z
  name: simple-game-server-dph9b-hfk24
  namespace: default
spec:
  metadata: {}
  required:
    matchLabels:
      agones.dev/fleet: simple-game-server
  scheduling: Packed
status:
  address: 192.168.122.152
  gameServerName: simple-game-server-dph9b-hfk24
  nodeName: minikube
  ports:
  - name: default
    port: 7714
  state: Allocated

Status 섹션을 보면 몇 가지 유의해야 할 사항이 있습니다.
상태 값은 GameServer 가 할당되었는지 여부를 알려줍니다. GameServer 를 찾을 수 없는 경우
UnAllocated 로 설정됩니다.
너무 많은 동시 요청이 시스템을 압도하는 경우, 사용 가능한 GameServer 가 있어도
상태가 Contention(경합)로 설정됩니다.

우리는 status.state 값이 Allocated 인 것을 알 수 있습니다.
즉, Fleet 에서 GameServer 가 성공적으로 할당되었으며 이제 플레이어를 연결할 수 있습니다!

더 많은 세부 정보를 검색하는 데 사용하려는 경우 주소, 포트 및 GameServer 이름과 같은 상태에서
GameServer 의 다양한 변경되지 않는 세부 정보를 볼 수 있습니다.

또한 다음 명령을 사용하여 Allocated GameServer 수와 Ready GameServer 수를 확인할 수 있습니다.
(gsgameserver 의 약칭입니다.)

$ kubectl get gs

결과로 현재의 모든 GameServer 목록과 Status.State 가 표시됩니다.

NAME                             STATE       ADDRESS           PORT   NODE      AGE
simple-game-server-sdhzn-kcmh6   Ready       192.168.122.205   7191   minikube  52m
simple-game-server-sdhzn-pdpk5   Ready       192.168.122.205   7752   minikube  53m
simple-game-server-sdhzn-r4d6x   Allocated   192.168.122.205   7623   minikube  52m
simple-game-server-sdhzn-wng5k   Ready       192.168.122.205   7709   minikube  53m
simple-game-server-sdhzn-wnhsw   Ready       192.168.122.205   7478   minikube  52m




5. Fleet 축소하기

Fleet 을 확장할 수 있을 뿐만아니라 축소할 수도 있습니다.

Agones의 좋은 점은 GameServer 들이 Allocated 상태가 되었는 지, 자동으로 축소시킬 지 알 수 있을만큼
똑똑하다는 것입니다 - 플레이어가 이 GameServer 들에서 플레이하고 있다고 가정하고 연결을 끊으면 안됩니다.

Fleet 을 0으로 축소하고(예! 그렇게 할 수 있습니다!) 무슨 일이 일어나는지 지켜보겠습니다.

kubectl scale fleet simple-game-server --replicas=0 명령을 실행하여 복제본 수를 5에서 0으로 수정합니다.

모든 GameServer들이 종료되는 데 약간의 시간이 소요될 수 있으므로 모두 watch 한 후에 살펴보겠습니다.

$ watch kubectl get gs

결국 목록에서 하나씩 제거되며 다음과 같이 표시됩니다.

NAME                             STATUS      ADDRESS          PORT    NODE       AGE
simple-game-server-tfqn7-g8fhq   Allocated   192.168.39.150   7148    minikube   55m

이 외로운 Allocated GameServer 는 혼자 남아서 실행 중입니다!

원한다면 Fleet 설정의 replicas 필드를 편집하고 GameServer 목록이 늘어나고 줄어드는 것을
확인해보세요.




6. GameServer 연결하기

이 하나뿐이므로 할당 된 유일한 게임 서버의 IP 및 포트에 대한 세부 정보만 가져옵니다:

$ kubectl get gameservers | grep Allocated | awk '{print $3":"$4 }'

실행 결과로 게임 서버 IP 주소와 포트가 출력됩니다.(예 : 10.130.65.208:7936)

이제 GameServer 와 통신할 수 있습니다.

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

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

kubectl describe gs | grep State 명령을 다시 실행한다면 - GameServer 가 새로운
Ready GameServer 로 교체되거나 삭제되는 과정인 Shutdown 상태가 됩니다.

우리는 Fleet 을 실행하고 있기 때문에 Agones는 항상 Ready 또는 Allocated 된 상태의 풀에 구성된
GameServer 들이 있는지 확인합니다.




7. Fleet에 새 버전의 GameServer 배포하기

또한 실행 중인 FleetGameServer 구성을 변경하고 현재 할당된 GameServer 를 중단하지 않고
변경 사항을 적용할 수 있습니다.

kubectl scale fleet simple-game-server --replicas = 5를 실행하여 복제본 수를 5로 되돌립니다!
GameServer 를 할당합니다:

$ kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/release-1.14.0/examples/simple-game-server/gameserverallocation.yaml -o yaml

이제 4개의 Ready GameServer 와 1 개의 Allocated 가 있습니다.

kubectl get gs 를 실행하여 확인할 수 있습니다.

NAME                             STATE       ADDRESS          PORT   NODE       AGE 
simple-game-server-tfqn7-c9tz7   Ready       192.168.39.150   7136   minikube   5m       
simple-game-server-tfqn7-g8fhq   Allocated   192.168.39.150   7148   minikube   5m   
simple-game-server-tfqn7-n0wnl   Ready       192.168.39.150   7453   minikube   5m   
simple-game-server-tfqn7-hiiwp   Ready       192.168.39.150   7228   minikube   5m   
simple-game-server-tfqn7-w8z7b   Ready       192.168.39.150   7226   minikube   5m   

프로덕션에서는 containers > image 설정을 변경하여 Fleet 을 업데이트하여
새로운 GameServer 프로세스를 실행할 수 있지만, 이 예제를 간단하게 만들기 위해
containerPort 를 7654 에서 6000으로 변경합니다.

kubectl edit fleet simple-game-server 를 실행하고 필요한 사항을 수정한 후 편집기를 저장하고 종료합니다.

그러면 컨테이너 포트 6000으로 실행되는 새로운 GameServer 세트의 배포가 시작됩니다.

경고
이렇게하면 더 이상 simple-game-server GameServer 에 연결할 수 없게 됩니다.

Allocated GameServercontainerPort:7654 인스턴스와 새 구성인 containerPort:6000 의 4 개의 인스턴스가 표시될 때까지 watch kubectl get gs 를 실행합니다.

이제 게임의 새 버전을 배포했습니다.




다음 과정




참고자료

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
      

댓글남기기