【本文内容基于9月份Cloud Ace CTO 江文远分享的线上研讨会内容总结而成。】
摘要
Kubernetes,简称K8s,是Google开发的,目前最为风行的容器编排和治理引擎,它反对自动化部署、大规模可伸缩、利用容器化治理。K8s的个性使得它实用于架构简单且要求高的服务,也就是游戏架构的搭建。
因为Cloud Ace为谷歌云代理公司,所以咱们本次分享的实操是在谷歌开发的Google Kubernetes Engines上运行的,GKE是谷歌基于K8s所开发的Kubernetes治理平台,次要在谷歌云平台上运行。
Kubernetes与微服务架构
随着利用的倒退,程序变得越来越简单,传统一体化架构的服务会造成微小的不便,比如说:新增性能与测试放在一起,使得程序十分复杂;开发和利用新语言和新框架的效率低;安全性低,所有的模块构建在一个process里,一旦呈现bug可能牵一发而动全身。
而微服务 (microservices) 架构正好解决了这样的问题,将每一个具备商业逻辑的服务独立进去,例如不再将所有材料都写入同一个资料库,而是每个独自的服务都有一个最适宜本人自身构造的资料库。益处是让每个服务都能够用最适宜本人的语言、资料库来开发。在实操时,每一个商业性能/服务都可能是一台 VM 或者一个容器。
微服务架构的呈现给了游戏一个新的抉择,下图的两个架构就是游戏应用的架构,都是通过不同的功能模块来划分的,按功能模块划分不同的服务,前端通过HAProxy来代理用户申请,后端服务能够依据负载来实现扩缩容。在服务发现模块中,通过registrator来监督容器的启动和进行,依据容器裸露的端口和环境变量主动注册服务,后端存储应用了consul,联合consul-template来发现服务的变动时,能够更新业务配置,并重载。
K8s就是微服务架构
后面提到K8s适宜微服务架构,为什么呢?
因为k8s的架构与微服务十分相似,在某些性能上是统一的,第一就是k8s的master和node,能够实现不同性能不同服务器之间的隔离;第二是k8s下面提供了API server,基本上能够等同于网关;第三是k8s的服务编排性能好,能够实现弹性伸缩;第四点是k8s的configmap基本上能够作为配置核心;第五是k8s能够通过在node上部署agent来实现日志的收集和监控。
Kubernetes 将数个容器组合起来成一个服务(Service,注:Service 是 K8S 的专有名词,上面会介绍),Kubernetes 也提供了良好的服务发现(Service discovery)机制,让每个服务彼此能够通信。最重要的是 K8S 弱小的编程能够主动扩大服务,甚至还能够对大规模的容器作滚动更新 (Rolling update) 以及回滚机制 (Rolling back/Undo),更能够整合 CI/CD 等 DevOps 的工具。
K8s在游戏架构搭建上的劣势
基于前两者,咱们总结进去K8s在游戏架构搭建上的劣势为:
- 定制的网络与调度计划,为游戏容器的运行提供根底环境;
- 域名服务与负载平衡,解决游戏高可用、弹性伸缩问题;
- 通过性能数据、日志的收集、统计分析,及时发现程序问题与性能瓶颈,保障游戏容器稳固、可持续性运行;
- 基于image的公布扩容,使得游戏部署流程更加标准化以及高效。
Google Kubernetes Engine(GKE)游戏架构搭建实操
咱们的实操参考的是谷歌的技术文档来搭建的。
游戏:Open Arena(雷神之锤)---开源游戏
游戏架构如下图,明天咱们只讲对于dedicated game server这一部分。
游戏环境设定如下:
为什么这么设置呢?
第一是处于占用资源上思考,如果是地图比拟大的游戏,关上地图就会须要比拟长的工夫去载入,同样的,你工夫越长须要载入的材料越多,占用越多的资源,因而大部分游戏都会定义工夫限度,因为一旦有玩家在玩,主机就无奈敞开,造成大量的资源节约。
第二点是出于老本管制上设置的,因为线上游戏须要弹性,高峰期和非高峰期的人数差别较大,因而须要尽可能的match更多的玩家进来,把玩家集中在一个服务器上玩,这样对vm的需要会比拟少,有利于老本管制。
第三点是思考到游戏技术上的难度,如果说玩家呈现问题掉线了,那么就间接重开游戏,不要复原它的状态,因为复原状态对技术要求十分高。
GKE搭建后盾示例如下:
首先咱们先从右上角开始,右上角就是一个根本的游戏的组成,DGS也就是delicate game server ,它是一个open source的套件,能够在GKE上运行。
这里波及到两个VM,第一个VM用来搭建image,第二个VM用于加载数据/资料片,也就是Asset Disk,咱们把Asset Disk挂起来后,VM2咱们就间接删掉,VM2是不会留下来的,咱们只有留下Disk就能够,之后一旦GKE的class开起来,也就是把gke-dgs image部署进去,部署进去之后,这边就他会去把资料片挂起来。
在K8s上的话,有个点须要留神,如果pod想用到disk外面的材料,那么disk须要做成PV,也就是群集中的资源。PVC是对这些资源的申请,只有用户申请后发送了PVC能力拜访存储的资料片。
一轮游戏一个回合,可能容许的玩家是有肯定限度的,如果说node上有两个pod,两个pod可能容许20集体玩,那么当玩家数量超过了20集体的时候,就须要零碎及时监控到这个状况,开新的pod,这里就波及到了scaling manager。
Scaling manager翻译过去叫缩放管理器,它其实就是一直的在监控整个class里的每一个node的状态。在k8s外面有个性能叫HPA,Horizontal Pod Autoscaler,HPA能够实现 Pod主动弹性伸缩,HPA是怎么实现主动弹性伸缩的呢?是通过对Pod中运行的容器各项指标(CPU占用、内存占用、网络申请量)的检测,实现对Pod实例个数的动静新增和缩小。
然而这里会产生一个问题,比方一个游戏回合,因为会设定游戏工夫,因而可能玩家都退出了,然而游戏可能还在进行。HPA这里检测到的仍然是游戏占用了很多资源,所以会认定pod不能关掉,然而玩家其实都退出了。这里波及到了一些底层的监控和运算公式在外面,绝对比较复杂。所以在理论的操作过程中,工程师须要去设置监控和弹性缩放的逻辑和算法。
游戏服务器常常会碰到的问题就是如何实现主动扩大和缩放,这里咱们总结了一下:
Cordon指令是什么意思呢?就是说pod在缩放的时候,如果确定某个node的玩家都退出了,要把 node撤掉的时候,要标记为不可调度。因为GKE的规定是,只有明天有玩家进来玩,scaling manager就会主动调配pod给他。如果咱们想删减node,可是scaling manager发现 node的下面没有任何的pod在跑,它就会主动在这个咱们想删减的node下面开pod给玩家,就会发生冲突,因而如果咱们要删除node,须要把它标记为不可调度。
当这两个程序如果之间没有做好沟通的话,一个在缩小pod,一个在部署pod,两个就会互相冲突,要想方法让另外一个程序晓得说这个Pod是不可调度的。
第一点就是abandon instance,依照谷歌云的instance group原先的规定,设定了node是20个,那么当咱们缩减掉一个node的时候,instance group为了确保node数量满足20个,会主动减少新的node,这里也是抵触的,咱们缩减一个node,它主动减少一个新的node,因而咱们就须要通过abandon instance指令来缩减node。abandon instance命令上来之后, node会间接变少,不会增长。
以上就是咱们本次分享的内容,这里附上qwiklab的链接,有须要的能够在qwiklab上进行游戏架构搭建的实操。
https://www.qwiklabs.com/focu...
11月4日Cloud Ace工程师将分享对于谷歌推出的Cloud Spanner——寰球散布且强一致性的企业级数据库服务,欢送各位报名加入。