Agones 리서치 Part.4 - GameServer Fleet 만들기
이 가이드는 Agones 를 사용하여 서비스 준비가 된 GameServer Fleet(함대)을 만드는 방법을 설명합니다!
Quickstart: Create a Game Server Fleet을 정리한 글입니다.
목표
- Agones 커스텀 리소스를 사용하여 쿠버네티스에서
Fleet
을 만듭니다. - 초기 구성에서
Fleet
을 확장합니다. - 플레이 할
Fleet
에GameServer
할당(allocate)을 요청합니다. Allocated
된GameServer
에 연결합니다.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
를 볼 수도 있습니다.
GameServer
는 simple-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()
을 호출하거나 수동으로 삭제할 때까지 제거하지 않습니다.
GameServerAllocation
이 Fleet
과 관련된 점이 없다는 것에 주목할 필요가 있습니다.
GameServerAllocation
은 레이블 선택기(label selector)를 사용하여 할당할 GameServer
그룹을
결정합니다. 즉, Fleet
과 GameServerAllocation
은 종종 함께 사용됩니다.
이 예제에서는 레이블 선택기를 사용하여 방금 만든 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
수를 확인할 수 있습니다.
(gs
는 gameserver
의 약칭입니다.)
$ 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 배포하기
또한 실행 중인 Fleet
의 GameServer
구성을 변경하고 현재 할당된 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 GameServer
인 containerPort
:7654 인스턴스와 새 구성인 containerPort
:6000 의
4 개의 인스턴스가 표시될 때까지 watch kubectl get gs
를 실행합니다.
이제 게임의 새 버전을 배포했습니다.
다음 과정
-
GameServerAllocation
사양을 살펴보고 추가 기능이 스모크 테스팅, 서버 정보의 통신 등을 가능하게 하는 방법을 확인하세요. -
이제
Fleet Autoscaler
를 생성하여 실제 사용량에 따라Fleet
의 크기를 자동으로 조정할 수 있습니다.Fleet Autoscaler
만들기를 참고하세요. -
GameServer
생성, 할당 및 종료 수명 주기 다이어그램을 살펴보면 생성에서 매치메이커와의 통합에 이르기까지 모든 요소가 어떻게 결합되는지에 대한 개요를 알 수 있습니다. -
또는 자체
GameServer
컨테이너를 사용하려는 경우 Agones SDK를 올바르게 통합했는지 확인하세요. -
프로그래밍 방식으로
Fleet
에서GameServer
를 할당하는 방법을 배우고 싶다면, Kubernetes API를 통해 Agones에 액세스하는 방법 또는 필요에 따라Allocator
서비스를 참조하십시오.
참고자료
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
$ 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 테스트하기
댓글남기기