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!

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:

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
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:
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 ...