本文在本人博客,原文地址:http://viogami.tech/index.php/blog/346/
我是gopher,離不開云原生,自然也逃不了理解docker和K8S這倆。今天抽空想玩下agones,進而對K8S有實踐性的理解。
學一個新事物從底層理論學肯定是最系統的,但不是最工程的。對于K8S,我個人認為相比苦苦理解各種集群,節點,pods等等概念,不如實際上手一次,從實踐上逐步理解理論,自頂向下才是最快最高效的學習模式,因為目的是使用K8S,是工程化,而不是了解k8s架構,設計云云。
本文基本從0開始部署Agones,進而逐步理解docker,理解K8S。
相信如果你能發現本文,自然了解Agones是什么,如果不知道自行了解下,不做多介紹,引用官方介紹:
Agones 是一個開源平臺,用于部署、托管、擴展和編排專用游戲服務器,用于大型多人游戲,構建在行業標準的分布式系統平臺
Kubernetes 之上。
部署Agones只是一個任務性的引子,重點還是K8S.
準備工作
安裝docker-desktop
由于我是win機器,在一切之前,得介紹下開發環境,但很簡單。
首先得安裝docker,注意如下:
- 打開任務管理器,看看cpu有沒有開啟虛擬化,沒有則在bios設置中開啟。(必要)
- 安裝wsl,無需開啟hyper-v,所以家庭還是專業版的windows沒啥影響。
- 自備代理工具,docker官網需要魔法。
安裝完docker基本就完成了。
由于是個人開發測試用,只用部署一個單節點集群就好了,而這在docker-desktop中已經集成了,很方便,如下所示,打開即可:
kubectl get nodes
如果返回類似 Ready 狀態的節點,說明 Kubernetes 已經啟動成功。
注意 ?:Docker Desktop 的 Kubernetes 只能運行在單個節點上,不適用于生產環境的高可用集群。
vscode的K8S插件
安裝桌面版的docker是有圖形化界面的,很直觀,但K8S目前我們是沒有GUI的,需要嗎?并不一定,使用gui會更多的限制你。
Kubernetes 本身主要是通過 kubectl 命令行工具和 YAML 配置文件進行管理的。
雖然有kubernetes-dashboard
,但別著急,在vscode的插件也有gui可以打開dashboard。推薦安裝docker和k8s插件,在vscode中集成開發,然后我逐步解釋下插件中每個顯示項的作用,從這里就開始理解如何使用K8S辣
- Namespace(命名空間)Kubernetes 內部的邏輯隔離單位,用于劃分不同的應用、環境或團隊。一個集群可以包含多個 Namespace,每個 Namespace 內的資源相互獨立。
- Workloads(工作負載)管理 Kubernetes 里運行的應用程序,本質上就是 運行 Pod 的控制器。Workload 負責定義應用如何部署、擴縮容、更新和運行。
- Network(網絡) 負責 Kubernetes Pod 之間、Pod 和外部系統之間的通信。管理 Service、Ingress、Network Policy 這些 K8s 網絡資源。
- Storage(存儲)管理 Kubernetes 里的持久化存儲,確保 Pod 重新啟動后數據不會丟失。Volume 只在 Pod 生命周期內有效,但 PersistentVolume(PV)可持久存儲數據。
- Configuration(配置管理)管理應用的配置信息、環境變量、Secrets(敏感信息)。讓應用和環境解耦,比如可以在不修改代碼的情況下更改應用配置。
- Custom Resource(自定義資源)擴展 Kubernetes,增加新的資源類型,比如 Agones 添加了 GameServer 資源。允許你 創建自己的 K8s API,以適配特定的業務需求。
- Helm Releases(Helm 版本管理)管理 Helm 安裝的應用(比如 agones)。Helm 是 Kubernetes 的包管理工具,可以一鍵安裝、更新、刪除復雜應用。
但Docker Desktop 不包含K8S的包管理工具 Helm
但安裝了K8S插件會自動提示下載kubectl
和helm
,前者是命令行操作工具。都是編譯好的exe。如果需要可以配到環境變量中,位置在.../user/.vs-kubernetes
下
提出疑問-區別概念
好了,在部署之前,安裝了上文所說的插件,如果剛入門K8S,難免有一些疑問,下面我著重進行些概念補充,希望下面可以順利進行~
Kubernetes 中 Node 和 Pod 的關系
Node(節點)就是機器,它可以是:物理機(裸機服務器),虛擬機(云服務器、Docker Desktop 里的虛擬 K8s 節點),你的本機(如果你用 Docker Desktop Kubernetes)
Pod(Pod 是容器的封裝單位),Pod 運行在 Node上,一個Pod 里面可以有一個或多個容器,Pod共享存儲(Volume)、網絡(IP 地址)等,K8s 只管理 Pod,不直接管理容器
如果 Kubernetes 是一個數據中心:
- Node = 一臺服務器
- Pod = 服務器上的一個應用進程組(可能包含多個容器)
- 容器 = 運行的進程(比如 Nginx、MySQL 等)
現實中,一個項目是不是只要一個k8s集群就夠了?
YES!一個 Kubernetes 集群足夠應付絕大部分的項目需求,包括擴展、彈性、資源管理和容器的自動化部署。
一個K8S集群中會有很多nodes,這些nodes就是物理上的機器,可以有很多個,每個nodes里有很多pods,pods才是實際的部署的應用。nodes已經完成了分布式,多集群可能確實在大型復雜項目的跨地區部署中用到,但咱可以不用了解
命名空間和nodes有什么區別,為什么有了nodes還需要namespace
- Nodes(節點) 物理或虛擬機,負責運行 Pod 實際的計算資源(CPU、內存、存儲)
- Namespace(命名空間) 邏輯隔離的環境,管理不同的 K8s 資源 邏輯上的組織單位,不影響物理資源分配
可以把 Node 理解為 “真實的服務器”,而 Namespace 更像是 “應用的文件夾或項目空間”
安裝Agones
好了,終于來到重點也不算是重點的部分了。
但并不重要,因為你可以根據官方文檔逐步操作
根據agones官方文檔,安裝可以通過yaml文件,也可以通過helm包管理安裝。
我是用kubectl命令行拉取的yaml文件完成的安裝
kubectl create namespace agones-system
kubectl apply --server-side -f https://raw.githubusercontent.com/googleforgames/agones/release-1.48.0/install/yaml/install.yaml
然后你就可以在Custom Resource
中發現拉去下來的服務了!
接下來按照官方文檔操作進行部署了,并不贅述,因為本文不是介紹怎么部署agones。
本人使用rider及其K8S插件,在游戲開發的時候進行服務器集群控制的。記住命令行得到pod的ip和端口,接下來就是網絡通信的知識了。如果要在unity中和部署的服務器應用通信,自寫和后端的通信協議,Agones只是個后臺應用調度工具,不涉及和前端交互。
注意 ? Agones Unity SDK 適用于 服務器端(GameServer) 的 Unity 進程而不是前端!
例如:你用 Unity 制作了一款 服務器端模擬的游戲邏輯,需要讓 Agones 調度這個服務器。或者你的游戲服務器是 Unity 編寫的,想要與 Agones 交互來管理它的生命周期。但是,如果你想讓 Unity 客戶端 連接到 GameServer,那 Unity SDK 并不需要。客戶端應該直接用 WebSocket、TCP、UDP、HTTP 連接 GameServer。
結束
怎么就結束了?
因為從安裝agones敲下一行命令行開始,已經完成了一次K8S的體驗,只要了解從0到啟動一個K8S單節點集群的全過程每個操作的意義,那么恭喜你,已經入門K8S了,就這么簡單,剩下的內容需要在一次次部署應用,一次次開關容器中不斷積累吧。這不是整體圖看這個概念那個概念是什么意思可以解決的。在實踐中結束吧!
如果你有任何疑問,都可以評論聯系我~