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
댓글남기기