您可以選擇使用托管Azure Kubernetes服務(wù)(AKS),在Azure上使用Kubernetes協(xié)調(diào)程序管理容器化專(zhuān)用游戲服務(wù)器。
本文將描述GitHub上的此示例中使用的體系結(jié)構(gòu)。請(qǐng)注意,此參考體系結(jié)構(gòu)中的代碼只是一個(gè)指南示例,在用于生產(chǎn)環(huán)境之前,可能還有需要優(yōu)化的地方。
體系結(jié)構(gòu)關(guān)系圖
相關(guān)服務(wù)
Azure流量管理器-可根據(jù)延遲情況將玩家連接到最合適的區(qū)域。
Azure Kubernetes服務(wù)-可簡(jiǎn)化Kubernetes的部署和操作。
Azure容器注冊(cè)表-允許為所有類(lèi)型的容器部署存儲(chǔ)映像。
體系結(jié)構(gòu)注意事項(xiàng)
自定義資源定義(CRD)
在此參考體系結(jié)構(gòu)中,通過(guò)使用自定義資源定義(CRD)對(duì)象擴(kuò)展了Kubernetes。這些對(duì)象將用于表示專(zhuān)用游戲服務(wù)器實(shí)體。
具體來(lái)說(shuō),有2個(gè)核心實(shí)體,分別由2個(gè)不同的CRD表示:
DedicatedGameServer:表示多人游戲服務(wù)器本身。每個(gè)DedicatedGameServer都有一個(gè)單獨(dú)對(duì)應(yīng)的子Pod,它將使用游戲服務(wù)器可執(zhí)行文件運(yùn)行容器映像。
DedicatedGameServerCollection:表示將運(yùn)行相同Pod模板的相關(guān)DedicatedGameServers集合,并且可以在集合內(nèi)進(jìn)行縮放(即添加或刪除更多服務(wù)器實(shí)例)。
屬于同一DedicatedGameServerCollection成員的DedicatedGameServer在執(zhí)行環(huán)境方面有很多相似之處,例如,都可以啟動(dòng)相同的多人游戲地圖或相同類(lèi)型的游戲。因此,您可以在游戲中針對(duì)“奪旗”模式創(chuàng)建一個(gè)集合,針對(duì)“征服”模式創(chuàng)建另一個(gè)集合?;蛘?,針對(duì)地圖“X”上的玩家創(chuàng)建一個(gè)集合,針對(duì)地圖“Y”上的玩家創(chuàng)建另一個(gè)集合。
組件
此參考體系結(jié)構(gòu)包含兩個(gè)主要組件,它們都是作為單實(shí)例Kubernetes部署創(chuàng)建的:
API服務(wù)器組件
這是我們項(xiàng)目的API服務(wù)器(與Kubernetes API服務(wù)器無(wú)關(guān))。它包含兩個(gè)子組件:
API服務(wù)器子組件
它提供可由游戲服務(wù)器或外部安排系統(tǒng)(如大廳服務(wù)或Matchmaker)調(diào)用的REST API。
Webhook子組件
一個(gè)Kubernetes準(zhǔn)入Webhook,可驗(yàn)證和修改關(guān)于我們對(duì)Kubernetes API服務(wù)器的CRD的請(qǐng)求。
控制器
Kubernetes控制器是表現(xiàn)為主動(dòng)協(xié)調(diào)進(jìn)程的對(duì)象。簡(jiǎn)而言之,這意味著控制器會(huì)監(jiān)控某個(gè)(或某組)對(duì)象,查看對(duì)象是否達(dá)到理想狀態(tài)以及其實(shí)際狀態(tài)。它會(huì)主動(dòng)比較這兩種狀態(tài),并盡全力使實(shí)際狀態(tài)接近理想狀態(tài)。
此項(xiàng)目包含一組控制器,每個(gè)控制器都會(huì)執(zhí)行協(xié)調(diào)特定對(duì)象集的任務(wù)。所有控制器都基于官方Kubernetes示例控制器和此處的相應(yīng)文檔構(gòu)建而成。此項(xiàng)目中的控制器是為了協(xié)調(diào)我們的自定義資源定義(CRD)對(duì)象,即DedicatedGameServerCollections和DedicatedGameServers。
DedicatedGameServerCollectionController
它負(fù)責(zé)處理DedicatedGameServerCollection的DedicatedGameServer對(duì)象。
DedicatedGameServerController
它負(fù)責(zé)處理DedicatedGameServer對(duì)象的Pod。
DGSActivePlayersAutoScalerController
您可以選擇是否啟動(dòng)它(通過(guò)控制器上的命令行參數(shù)),它負(fù)責(zé)每個(gè)選擇加入Pod自動(dòng)縮放機(jī)制的DedicatedGameServerCollection上的Pod自動(dòng)縮放。
這些組件是它們自己的命名空間的一部分(示例中名為dgs-system),與DedicatedGameServers的命名空間分離。在大型群集場(chǎng)景中,每個(gè)DedicatedGameServerCollections列表可以有一個(gè)命名空間。
公共IP
游戲客戶(hù)端應(yīng)該能夠直接連接到專(zhuān)用游戲服務(wù)器,因此所有節(jié)點(diǎn)都應(yīng)該有一個(gè)公共IP。Azure Kubernetes服務(wù)默認(rèn)不提供公共IP,但您可以使用此GitHub項(xiàng)目來(lái)啟用它。
部署模板
按照這些說(shuō)明創(chuàng)建Azure Kubernetes群集。
安全注意事項(xiàng)
所有API方法都通過(guò)訪問(wèn)代碼進(jìn)行保護(hù),顯示為字符串形式,并保存在名為apiaccesscode的Kubernetes密鑰中。這是在項(xiàng)目安裝過(guò)程中創(chuàng)建的,應(yīng)傳遞到所有方法調(diào)用代碼GET參數(shù)中。默認(rèn)情況下,唯一不要求身份驗(yàn)證的方法是/running方法。但是,可以在API服務(wù)器進(jìn)程命令行參數(shù)中更改方法。
優(yōu)化注意事項(xiàng)
對(duì)于較小的群集,您可以使用適用于所有節(jié)點(diǎn)的單個(gè)Pod(包含API服務(wù)器子組件、Webhook子組件和控制器的Pod)來(lái)實(shí)現(xiàn)簡(jiǎn)化。按照設(shè)計(jì),在Kubernetes群集中,每個(gè)Pod可以與所有其他節(jié)點(diǎn)中的其他Pod對(duì)話(huà)。
其他資源和示例
官方Kubernetes文檔
定價(jià)
如果您沒(méi)有Azure訂閱,可以創(chuàng)建免費(fèi)帳戶(hù),開(kāi)始使用12個(gè)月的免費(fèi)服務(wù)。除非您超出這些服務(wù)的使用限制,否則無(wú)需為Azure免費(fèi)帳戶(hù)中包含的這些免費(fèi)服務(wù)付費(fèi)。了解如何通過(guò)Azure門(mén)戶(hù)或使用情況文件查看服務(wù)使用情況。
您需要承擔(dān)運(yùn)行這些參考體系結(jié)構(gòu)時(shí)所使用的Azure服務(wù)的費(fèi)用。總金額將因使用情況而異。請(qǐng)參閱參考體系結(jié)構(gòu)中使用的每項(xiàng)服務(wù)的定價(jià)網(wǎng)頁(yè):
Azure流量管理器
Azure Kubernetes服務(wù)
Azure容器注冊(cè)表
您還可以使用Azure定價(jià)計(jì)算器,以配置和估算您計(jì)劃使用的Azure服務(wù)的成本。