مع مرور الوقت ، قم بإنشاء خادم ألعاب متعدد المستخدمين. العمارة والتركيب

تسمح لك Agones (من اليونانية اليونانية الأخرى - "المنافسة") بنشر مجموعة خوادم ألعاب باستخدام Kubernetes مع Auto-Scaling. تم إنشاء هذا المشروع المفتوح المصدر في عام 2018 ، وسجل بالفعل 2500 نجم ، وكان على Google I / O 2019 ، وعلى Habré ، لمفاجأتنا الكبرى ، لم يرد ذكرها بعد. يصف الموضوع رحلة قصيرة في الهندسة المعمارية وتعليمات لبدء خادم اختبار على جهاز محلي. إذا كانت مهتمة ، مرحبا بكم في كات ، اذهب!


معاني الشعار

وصف المشروع


Agones هو مورد مخصص ( ملحق Kubernetes API ).


يتطلب المشروع في الواقع مزيدًا من الاهتمام ، لأنه يسمح لك بتشغيل خادم ألعاب واحد (GameServer) أو "أسطول" كامل من الخوادم (الأساطيل) من خلال ملفات yaml للتكوين ، من خلال Agones API . بدوره ، يقدم كل خادم تنبيهات حول دورة حياته (دورات حياة GameServer) ، تصف الحالة الحالية (الفحص الصحي ، معلومات الاتصال). تتمتع الخوادم في المجموعة بالقدرة على القياس التلقائي (Fleet Autoscaling) ، والتي تتكامل مع القدرات الأساسية لبرنامج Kubernetes. بالإضافة إلى ذلك ، هناك ناتج إحصائي على لوحة القيادة باستخدام Prometheus أو Grafana أو Stackdriver ، ويتم تصدير المقاييس عبر OpenCensus ، مما يسمح لك بإضافة مصدرك الخاص. مثال على لوحة القيادة في Stackdriver:


صورة


العمارة ، العناصر الأساسية


تأخذ Agones نفسها مهمة إطلاق خوادم الألعاب وتوسيعها تلقائيًا واستضافتها باستخدام Kubernetes كأساس. يتيح لك هذا التركيز على تطوير خادم الألعاب متعددة اللاعبين نفسه ، بدلاً من تطوير بنيته الأساسية ودعم إضافي. يمكنك استخدام أي خادم ألعاب يمكن تشغيله على نظام linux ، ويمكن كتابته بأي لغة برمجة.


تنقسم واجهة برمجة تطبيقات Agones Kubernetes إلى ثلاث حزم رئيسية ، تحتوي كل منها على موارد: agones.dev (GameServer ، GameServerSet ، Fleet) ، custom.agones.dev (GameServerAllocation) ، autoscaling.agones.dev (FleetAutoscaler). مثل موارد Kubernetes الأخرى ، يتم استخدام ملفات yaml لتشغيلها.


وصف موجز لكل مورد:


  • يقوم GameServer - بإنشاء قالب معين يتيح لك استخدام معلمات Pod المعتادة ، مع بعض الإضافات ، مثل hostPort و containerPort لخادم اللعبة. يوفر Agones SDK حاوية جانبية اختيارية يتواصل بها GameServer باستمرار
  • GameServerSet - بنية بيانات لعدة GameServer ، تشبه إلى حد كبير العلاقة بين Depoyment و ReplicaSet
  • الأسطول - ينشئ العديد من GameServer الجاهزة ، ويستخدم GameServerAllocation لتوزيع الموارد
  • GameServerAllocation - يسأل GameServer من Fleet للاستخدام وعلامات أنه جاهز للاستخدام من قبل اللاعبين ، لذلك لن يتم حذف GameServer تلقائيًا
  • FleetAutoscaler - يوسع تلقائيًا أو ، على العكس ، يقلل من عدد الخوادم في Fleet

يوضح المخطط ( من هنا ) دورة حياة مورد GameServer:



تشير الأسهم الأرجواني إلى Agones SDK والأحمر - واجهة برمجة تطبيقات المستخدم والأزرق - وحدة تحكم خادم اللعبة والأصفر - وحدة تحكم التطبيق.


تركيب


في هذا القسم والأقسام اللاحقة ، يتم استخدام فرق مع تعليمات على الموقع الرسمي ، مع بعض الإضافات. نوصي باستخدام الإصدار 1.12 من Kubernetes (تم اختباره بواسطة المطورين). للاختبار على الكمبيوتر المحلي ، يمكنك استخدام minikube ، والذي سيتطلب kubectl و hypervisor ( Hyper-V أو VirtualBox ) المدعومين من قبل نظام التشغيل.


لتثبيت الكتلة و Agones ، يجب تشغيل الأوامر التالية:


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 

يقوم آخر أمر بتنزيل ملف التكوين Agones الذي ينشئ Custom Resource Definitions (CRD) عبر واجهة برمجة تطبيقات Kubernetes.


إطلاق GameServer


يمكنك الآن بدء تشغيل خادم UDP في الكتلة باستخدام خادم اختبار جاهز من الأمثلة ، والتي سوف تستجيب ببساطة للطلب المرسلة إليه:


 # 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 

للتأكد من أن الخادم يعمل ، يمكنك استخدام NetCat ، لأن نظام لينكس يأتي عادةً مع النظام ، بالنسبة للنوافذ التي تحتاج إلى تنزيلها ، على سبيل المثال هنا . يجب بدء NetCat باستخدام المعلمة -u (طلب UDP) ، مع تحديد عنوان minikube (من الأفضل نسخ العنوان من أمر minikube ip ) ومنفذ GameServer النشط:


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

إذا ظهرت استجابة "ACK: hello" بعد تشغيل الأمر في وحدة التحكم ، فعندئذ يعمل الخادم ، يمكنك إيقاف تشغيله عن طريق الأمر التالي الذي يبدأ في التهيئة:


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

يتم التحقق من حالة الخادم من قبل فريق kubectl describe gameserver ، يجب أن يتغير إلى إيقاف التشغيل.


إجراء تغييرات على GameServer


باستخدام المثال السابق ، سوف نقوم بتغيير استجابة الخادم. أولاً ، قم بنسخ مستودع المشروع:


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

في ملف agones / أمثلة / simple-udp / main.go ، قم بتغيير السطر 159 إلى


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

من مجلد جذر المشروع ، قم بتشغيل التالي لإنشاء صورة عامل حفظ وحفظه في minikube. بالنسبة إلى نظام التشغيل windows ، تحتاج أولاً إلى تشغيل minikube docker-env | Invoke-Expression minikube docker-env | Invoke-Expression ، من أجل linux eval $(minikube docker-env) . هذا سيسمح لك بإنشاء صور عامل ميناء مباشرة في minikube.
إنشاء صورة عامل ميناء:


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

قد يستغرق هذا الأمر بعض الوقت ، حيث سيتم نسخ مستودع المشروع بالكامل إلى الصورة. يمكن تجنب ذلك من خلال ترك مجلد sdks فقط و main.go و Dockerfile في الدليل.


بعد ذلك ، في أمثلة \ simple-udp \ gameserver.yaml ، قم بتغيير السطر 28 إلى image: agones-go:modified وإنشاء تطبيق جديد لـ GameServer:


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

تحقق من التغييرات وأطفئ الخادم:


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

إذا ظهرت استجابة "ACKNOWLEDGED: hello" بعد تشغيل الأوامر في وحدة التحكم ، فكانت التغييرات ناجحة.


نبدأ الخادم محليا


يمكنك تكرار التغييرات من أجل تطوير مناسب بدون Kubernetes ، باستخدام Agones SDK فقط. أثناء تشغيل خادم اللعبة ، يتصل SDK عبر TCP مع خادم gRPC صغير ، والذي يعمل Agones في حاوية تحت نفس مساحة الاسم. وتسمى هذه الحاوية في Kubernetes الجانبي. لذلك ، للتنمية المحلية ، يجب أن تبدأ عملية SDK. للقيام بذلك ، تحتاج إلى تشغيل ملف المصدر الخاص به باستخدام المعلمة -local ، التي تعمل على وضع "الوضع المحلي". يخبر هذا الوضع العملية في وضع غير فعال ولا يتصل بأي مكان ، فقط قم بعرض السجلات في وحدة التحكم بحيث يمكنك رؤية ما تقوم به SDK أثناء تشغيل خادم اللعبة.


يمكنك تنزيل أحدث إصدار من خادم agonessdk في إصدارات مستودع المشروع الرسمي. افتراضيًا ، بعد بدء تشغيل خادم SDK ، يتم إنشاء تكوين GameServer فارغًا ، والذي يستخدم لطلبات SDK GameServer () و WatchGameServer (). عند بدء التشغيل ، يمكنك تحديد ملف التكوين الخاص بك بتنسيق yaml أو json ، لذلك تحتاج إلى المعلمة -file أو نسخته المختصرة -f مع المعلمة -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"} 

أن تستمر ...

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


All Articles