Agones でMinecraftサーバーを建ててみた話
Agones で minecraft サーバーを立てる
kubernetes の練習として、Agones を使い、Minecraft(Java)のサーバーを建てます。
スケールがしやすいことから大規模なゲームサーバーに向いているようです。
今回はできなかったのですが、接続しているプレイヤーの人数が取れたり、サーバー管理しやすいのかなって印象です。
今回は個人で minecraft を遊ぶサーバーなので、ちょっと大げさですが、お勉強なので。
環境
参考: https://github.com/saulmaldonado/agones-minecraft/
kind v0.23.0 go1.22.3 darwin/amd64
サーバーの要件はこちら
ローカルの PC(A) でサーバーを立てて、別のローカルPC(B)でPC(A)に建てたサーバーに接続します
Docker Desktop に割り当てているリソースはこのくらいです
頑張れ PC
前提
・kind https://kind.sigs.k8s.io
・Kubernetesのうっすらとした知識
・Minecraft Java版 接続確認に使用します
Agonesのオブジェクト
こちらで簡単に説明してくれています。
https://medium.com/google-cloud-jp/agones-beginner-jp-5a6553e7e9a4
作業開始
まずはkindでkubernetesを建てます。
その後はhelm を使って Agones をインストールします
https://agones.dev/site/docs/installation/install-agones/helm
$ kind create cluster
$ helm repo add agones https://agones.dev/chart/stable
$ helm repo update
$ helm install agones-mc --namespace agones-system --create-namespace agones/agones
NAME: agones-mc
LAST DEPLOYED: Thu Jun 6 01:34:25 2024
NAMESPACE: agones-system
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
The Agones components have been installed in the namespace agones-system.
You can get their status by running:
kubectl --namespace agones-system get pods -o wide
Once ready you can create your first GameServer using our examples https://agones.dev/site/docs/getting-started/create-gameserver/ .
Finally don't forget to explore our documentation and usage guides on how to develop and host dedicated game servers on top of Agones:
- Create a Game Server (https://agones.dev/site/docs/getting-started/create-gameserver/)
- Integrating the Game Server SDK (https://agones.dev/site/docs/guides/client-sdks/)
- GameServer Health Checking (https://agones.dev/site/docs/guides/health-checking/)
- Accessing Agones via the Kubernetes API (https://agones.dev/site/docs/guides/access-api/)
リソースがあることを確認できます
$ kubectl api-resources | grep -e Game -e Fleet
fleets flt agones.dev/v1 true Fleet
gameservers gs agones.dev/v1 true GameServer
gameserversets gss,gsset agones.dev/v1 true GameServerSet
gameserverallocations gsa allocation.agones.dev/v1 true GameServerAllocation
fleetautoscalers fas autoscaling.agones.dev/v1 true FleetAutoscaler
gameserverallocationpolicies gsap multicluster.agones.dev/v1 true GameServerAllocationPolicy
サーバー作成
k8s/gameserver.yaml
apiVersion: 'agones.dev/v1'
kind: GameServer
metadata:
name: mc
spec:
container: mc-server # Minecraft server container name
ports:
- name: mc
# "Dynamic" (default) the system allocates a free hostPort for the gameserver (default 7000-8000), for game clients to connect to
portPolicy: Dynamic
# The name of the container to open the port on. Defaults to the game server container if omitted or empty.
container: mc-server
# the port that is being opened on the game server process
containerPort: 25565
# Minecraft uses TCP to connect players
protocol: TCP
# Health checking for the running game server
health:
# Number of seconds after the container has started before health check is initiated.
# This should match the initial-delay flag for agones-mc-monitor which defaults to 60s
initialDelaySeconds: 60
# If the `Health()` function doesn't get called at least once every period (seconds), then
# the game server is not healthy.
# This should at least match the interval flag for agones-mc-monitor which defaults to 10s
periodSeconds: 12
# Minimum consecutive failures for the health probe to be considered failed after having succeeded.
# Defaults to 3. Minimum value is 1
# This should match the attempts flag for agones-mc-monitor which defaults to 5
failureThreshold: 5
template:
metadata:
labels:
game: mc
spec:
containers:
- name: mc-server
image: itzg/minecraft-server # Minecraft server image
env: # Full list of ENV variables at https://github.com/itzg/docker-minecraft-server
- name: EULA
value: "TRUE"
ports:
- containerPort: 25575 # RCON port
- name: mc-monitor
image: saulmaldonado/agones-mc-monitor # Agones SDK sidecar
imagePullPolicy: Always
k8s/service.yaml
kind: Service
apiVersion: v1
metadata:
name: mc-service
spec:
type: NodePort
selector:
game: mc
ports:
# Default port used by the image
- port: 1119
targetPort: 25565
上記ファイルを用意してApplyします
$ alias k=kubectl
$ k apply -f k8s/gameserver.yaml
# 確認
$ kubectl get gs -w
NAME STATE ADDRESS PORT NODE AGE
mc PortAllocation 0s
mc Creating 0s
mc Starting 0s
mc Scheduled 172.18.0.2 7123 kind-control-plane 4s
$ k apply -f k8s/service.yaml
GameServerファイルをapplyするとGameServerが作られていきますね
GameServer の STATE は画像の通り
PortAllocation Createing Starting Scheduled RequestReady Ready になるはず。
Scheduledでも接続が行えましたので、このまま進めます。
サービスができた後、ポートフォワーディングを行います。ポード番号は適当なので自由に変えてください。
kubectl port-forward --address {PC(A)の ローカルIP} svc/mc-service 8081:1119
サーバーに接続する
ソフトの入っているPC(B)でMinecraftを起動して、サーバーに接続します。
すると、、
繋がりました!!!とりあえず安心。
残点
この状態のままだとデータの保存も読み込みもされません。
sidecar や init を使って保存やロードできるようにする必要があったりします。
私はMinecraftはサバイバルで遊ぶので、サーバーが落ちるたびにリセットされるのは厳しいですね。
この投稿へのトラックバック
トラックバックはありません。
- トラックバック URL
この投稿へのコメント