Agones, buat server game multi-pengguna. Arsitektur dan Instalasi

Agones (dari agunan Yunani lainnya - "kompetisi") memungkinkan Anda untuk menyebarkan kluster server game menggunakan Kubernetes dengan Penskalaan Otomatis. Proyek open-source ini dibuat pada 2018, sudah mencetak 2.500 bintang, ada di Google I / O 2019, dan di Habré, sangat mengejutkan kami, belum disebutkan. Topik ini menjelaskan kunjungan singkat ke arsitektur dan instruksi untuk memulai server uji pada mesin lokal. Jika tertarik, selamat datang di kat, pergi!


Logo Agones

Deskripsi Proyek


Agones adalah Sumber Daya Kustom ( Ekstensi API Kubernetes ).


Proyek ini sebenarnya membutuhkan lebih banyak perhatian, karena memungkinkan Anda untuk menjalankan server game tunggal (GameServer) atau seluruh "armada" server (Armada) melalui file konfigurasi yaml, melalui Agones API . Pada gilirannya, setiap server memberi peringatan tentang siklus hidupnya (siklus hidup GameServer), menjelaskan status saat ini (pemeriksaan kesehatan, informasi koneksi). Server dalam cluster memiliki kemampuan untuk secara otomatis skala (Fleet Autoscaling), yang terintegrasi dengan kemampuan dasar Kubernetes. Selain itu, ada output statistik di dasbor menggunakan Prometheus, Grafana atau Stackdriver, metrik diekspor melalui OpenCensus , yang memungkinkan Anda untuk menambahkan eksportir Anda sendiri. Contoh dasbor di Stackdriver:


gambar


Arsitektur, elemen dasar


Agones sendiri bertugas meluncurkan, memperluas secara otomatis, dan meng-hosting server game menggunakan Kubernet sebagai dasarnya. Ini memungkinkan Anda untuk fokus pada pengembangan server game multi-pemain itu sendiri, alih-alih mengembangkan infrastruktur dan dukungan lebih lanjut. Anda bisa menggunakan server game apa saja yang bisa dijalankan di linux, dan itu bisa ditulis dalam bahasa pemrograman apa pun.


API Agones Kubernetes dibagi menjadi tiga paket utama, yang masing-masing berisi sumber daya: agones.dev (GameServer, GameServerSet, Armada), alokasi.agones.dev (GameServerAllocation), autoscaling.agones.dev (FleetAutoscaler). Seperti sumber daya Kubernet lainnya, file yaml digunakan untuk menjalankannya.


Deskripsi singkat dari setiap sumber daya:


  • GameServer - membuat templat tertentu yang memungkinkan Anda menggunakan parameter Pod biasa, dengan beberapa tambahan, seperti hostPort dan containerPort untuk server game. Agones SDK menyediakan wadah sespan opsional yang dengannya GameServer akan terus berkomunikasi
  • GameServerSet - struktur data untuk beberapa GameServer, sangat mirip dengan hubungan antara Depoyment dan ReplicaSet
  • Armada - membuat beberapa GameServer yang sudah jadi, menggunakan GameServerAllocation untuk mendistribusikan sumber daya
  • GameServerAllocation - meminta GameServer dari Fleet untuk digunakan dan menandakan bahwa GameServer siap digunakan oleh pemain, sehingga GameServer tidak akan dihapus secara otomatis
  • FleetAutoscaler - secara otomatis memperluas atau, sebaliknya, mengurangi jumlah server di Armada

Diagram ( dari sini ) menunjukkan siklus hidup sumber daya GameServer:



Panah ungu menunjukkan Agones SDK, merah - API pengguna, biru - pengontrol server permainan, kuning - pengontrol aplikasi.


Instalasi


Di bagian ini dan selanjutnya, tim dengan instruksi di situs web resmi digunakan, dengan beberapa tambahan. Kami merekomendasikan menggunakan Kubernetes versi 1.12 (diuji oleh pengembang). Untuk pengujian di komputer lokal, Anda dapat menggunakan minikube , yang akan membutuhkan kubectl dan hypervisor ( Hyper-V atau VirtualBox ) yang didukung oleh sistem operasi.


Untuk menginstal cluster dan Agones, Anda harus menjalankan perintah berikut:


minikube profile agones #    agones minikube start --kubernetes-version v1.12.10 --vm-driver hyperv #virtualbox minikube status #     kubectl create namespace agones-system #    agones kubectl apply -f https://raw.githubusercontent.com/googleforgames/agones/release-1.0.0/install/yaml/install.yaml 

Perintah terakhir mengunduh file konfigurasi Agones yang membuat Custom Resource Definition (CRD) melalui API Kubernetes.


Meluncurkan GameServer


Sekarang Anda dapat memulai server UDP di kluster menggunakan server uji yang sudah jadi dari contoh, yang hanya akan menanggapi permintaan yang dikirim ke sana:


 # GameServer  kubectl create -f https://raw.githubusercontent.com/googleforgames/agones/release-1.0.0/examples/simple-udp/gameserver.yaml kubectl get gameservers #  GameServer minikube ip #     kubectl describe gameserver #    GameServer kubectl get gs #  ,   GameServer 

Untuk mengkonfirmasi bahwa server berfungsi, Anda dapat menggunakan NetCat, untuk linux program biasanya datang dengan sistem, untuk windows Anda perlu mengunduhnya, misalnya di sini . NetCat harus dimulai dengan parameter -u (permintaan UDP), menentukan alamat minikube (lebih baik untuk menyalin alamat dari perintah minikube ip ) dan port GameServer aktif:


 echo "hello" | nc -u $(minikube ip) 7331 

Jika setelah menjalankan perintah di konsol, respons "ACK: hello" muncul, maka server berfungsi, Anda dapat mematikannya dengan perintah berikut, yang menginisialisasi:


 echo "EXIT" | nc -u $(minikube ip) 7331 

Status server diperiksa oleh kubectl describe gameserver , itu harus berubah menjadi Shutdown.


Membuat perubahan pada GameServer


Menggunakan contoh sebelumnya, kami akan mengubah respons server. Pertama, salin repositori proyek:


 git clone git@github.com:googleforgames/agones.git 

Dalam file agones / example / simple-udp / main.go, ubah baris 159 menjadi


 respond(conn, sender, "ACKNOWLEDGED: "+txt+"\n") 

Dari folder root proyek, jalankan yang berikut untuk membuat gambar buruh pelabuhan dan simpan di minikube. Untuk windows, Anda harus menjalankan minikube docker-env | Invoke-Expression minikube docker-env | Invoke-Expression , untuk linux eval $(minikube docker-env) . Ini akan memungkinkan Anda untuk membuat gambar buruh pelabuhan langsung di minikube.
Buat gambar buruh pelabuhan:


 docker build -t agones-go:modified -f .\examples\simple-udp\Dockerfile . 

Perintah ini mungkin memakan waktu, karena seluruh repositori proyek akan disalin ke gambar. Ini dapat dihindari dengan hanya menyisakan folder sdks, main.go dan Dockerfile di direktori.


Selanjutnya, dalam contoh \ simple-udp \ gameserver.yaml, ubah baris 28 ke image: agones-go:modified dan buat GameServer baru:


 kubectl create -f .\examples\simple-udp\gameserver.yaml 

Periksa perubahan dan matikan server:


 echo "hello" | nc -u 172.17.113.72 7331 echo "EXIT" | nc -u 172.17.113.72 7331 

Jika setelah menjalankan perintah di konsol respons "ACKNOWLEDGED: hello" muncul, maka perubahan berhasil.


Kami memulai server secara lokal


Anda dapat mengulangi perubahan untuk pengembangan yang nyaman tanpa Kubernetes, hanya menggunakan Agones SDK. Saat server permainan berjalan, SDK berkomunikasi melalui TCP dengan server gRPC kecil yang dijalankan Agones dalam wadah di bawah namespace yang sama. Wadah seperti itu di Kubernetes disebut sespan. Oleh karena itu, untuk pengembangan lokal, Anda harus memulai proses SDK. Untuk melakukan ini, Anda perlu menjalankan file sumbernya dengan parameter -local , yang mengaktifkan mode 'mode lokal'. Mode ini memberi tahu proses untuk berada dalam mode pasif dan tidak terhubung di mana pun, cukup tampilkan log di konsol sehingga Anda dapat melihat apa yang dilakukan SDK saat server game sedang berjalan.


Anda dapat mengunduh agonessdk-server terbaru dalam rilis repositori proyek resmi. Secara default, setelah memulai server SDK, kosong konfigurasi GameServer dibuat, yang digunakan untuk permintaan GameServer () dan WatchGameServer () SDK. Saat startup, Anda dapat menentukan file konfigurasi Anda sendiri dalam format yaml atau json, untuk ini Anda memerlukan parameter -file atau versi singkatnya -f bersama dengan parameter -local .


 .\sdk-server --local -f .\examples\simple-udp\gameserver.yaml sdk-server : {"ctlConf":{"Address":"localhost","IsLocal":true,"LocalFile":".\\examples\\simple-udp\\gameserver.yaml","Timeout":0,"Test":""},"grpcPor t":59357,"httpPort":59358,"message":"Starting sdk sidecar","severity":"info","source":"main","time":"2019-09-29T12:45:59.8379817+02:00","version":"1.0.0"} {"filePath":"C:\\agones-release-1.0.0\\examples\\simple-udp\\gameserver.yaml","message":"Reading GameServer configuration","severity":"info","time":"2019-09-29T12:45:59.8479789+02:00"} {"message":"Starting SDKServer grpc service...","severity":"info","source":"main","time":"2019-09-29T12:45:59.8529791+02:00"} {"message":"Starting SDKServer grpc-gateway...","severity":"info","source":"main","time":"2019-09-29T12:46:00.1555756+02:00"} 

Dilanjutkan ...

Source: https://habr.com/ru/post/id469381/


All Articles