跳至主要内容

如何開Game Server

現在你已經跑了Game Server,問題來了 我要怎麼Allocate一個Game Server,然後知道他的IP去進行連線?

官方範例

https://agones.dev/site/docs/guides/access-api/

Create a game server

這部分跟官方是一樣的,簡單來說是創一個新的Game Server
用的是你指定的image位置: gcr.io/agones-images/simple-game-server:0.6

package main

import (
"fmt"
"context"

agonesv1 "agones.dev/agones/pkg/apis/agones/v1"
"agones.dev/agones/pkg/client/clientset/versioned"
"agones.dev/agones/pkg/util/runtime"
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
)

func main() {
config, err := rest.InClusterConfig()
logger := runtime.NewLoggerWithSource("main")
if err != nil {
logger.WithError(err).Fatal("Could not create in cluster config")
}

// Access to standard Kubernetes resources through the Kubernetes Clientset
// We don't actually need this for this example, but it's just here for
// illustrative purposes
kubeClient, err := kubernetes.NewForConfig(config)
if err != nil {
logger.WithError(err).Fatal("Could not create the kubernetes clientset")
}

// Access to the Agones resources through the Agones Clientset
// Note that we reuse the same config as we used for the Kubernetes Clientset
agonesClient, err := versioned.NewForConfig(config)
if err != nil {
logger.WithError(err).Fatal("Could not create the agones api clientset")
}

// Create a GameServer
gs := &agonesv1.GameServer{ObjectMeta: metav1.ObjectMeta{GenerateName: "simple-game-server", Namespace: "default"},
Spec: agonesv1.GameServerSpec{
Container: "simple-game-server",
Ports: []agonesv1.GameServerPort{{
ContainerPort: 7654,
HostPort: 7654,
Name: "gameport",
PortPolicy: agonesv1.Static,
Protocol: corev1.ProtocolUDP,
}},
Template: corev1.PodTemplateSpec{
Spec: corev1.PodSpec{
Containers: []corev1.Container{{Name: "simple-game-server", Image: "gcr.io/agones-images/simple-game-server:0.6"}},
},
},
},
}
newGS, err := agonesClient.AgonesV1().GameServers("default").Create(context.TODO(), gs, metav1.CreateOptions{})
if err != nil {
panic(err)
}

fmt.Printf("New game servers' name is: %s", newGS.ObjectMeta.Name)
}

Allocate game server from fleet.

上面的範例是要告訴你如跟Agones溝通,如果每次都在那邊新開Game Server,首先你會需要比較多時間等待,雖然它可能是幾秒的時間內(看你的伺服器程式大小),這應該是不能被玩家接受的。

注意: 這邊使用的Agones版本是1.16.0
替換掉上面的//Create a GameServer後部分 並且加上自動的myLabels可以傳入遊戲參數

// Get a GameServer from fleet
myLabels := map[string]string{"USER_DEFINE_KRY": "roomID"}
allocacteInterface := agonesClient.AllocationV1().GameServerAllocations(gameserversNamespace)
GameServerAllocation, err := allocacteInterface.Create(context.Background(), &allocationv1.GameServerAllocation{
Spec: allocationv1.GameServerAllocationSpec{Required: metav1.LabelSelector{
MatchLabels: map[string]string{"agones.dev/fleet": "simple-game-server"},
},
MetaPatch: allocationv1.MetaPatch{
Labels: myLabels,
},
}}, metav1.CreateOptions{})
if err != nil {
panic(err)
}

newGS, err := agonesClient.AgonesV1().GameServers(gameserversNamespace).Get(context.Background(), GameServerAllocation.Name, metav1.GetOptions{})

fmt.Printf("New game servers' name is: %s", newGS.ObjectMeta.Name)

Other

如果需要其他操作(像是list),需要請自行參考API文件

Reference

Agones-Access Agones via the Kubernetes API
Agones-Agones Kubernetes API