Kubernetes在微服务化游戏中的探索实践

  • 时间:
  • 浏览:0

3、在pod拿到VF与IP资源,进行绑定设置后,就能无需 像物理网卡一样使用。

在kubernetes集群中,业务使用域名访问有两种生活方法:

一起去你们都 也做了之前 优化:包括VF中断CPU绑定一起去关闭物理机的irqbalance功能,容器内设置RPS,把容器内的中断分到各个CPU处置,来提升网络性能。

以下是基于flannel实现的overlay网络的通信案例:

监控、告警是整个游戏运营过程中最为核心的功能之一,在游戏运行过程中,对其性能进行架构设计 、统计与分析,来发现游戏模块是是否是过低图片,负载是是否是过低,是是否是需用扩缩容同类等等。在监控你这人块,你们都 在cadvisor基础上进行定制,其社会形态如下:

此类容器除了SRIOV网络之外,还有原先overlay网络接口,也即是多重网络,能无需 把公司内网流量导入到overlay集群中,实现集群内外之间的通信。在实际应用中,你们都 会用此类容器来收归通往集群内的通信,同类你们都 用haproxy LB容器来提供服务。

本文转自中文社区-Kubernetes在微服务化游戏中的探索实践

对于哪些微服务化的游戏,服务模块小且多。如此,怎样才能快速部署,怎样才能弹性伸缩,怎样才能实现服务发现等等,完整都是你们都 需用处置的问题图片。容器化哪些服务是原先不错的方案,接下来就说 容器调度、编排平台的建设了。在当前完整都是多种方案可选,mesos,swarm等,而你们都 沿用了kubernetes做来容器的整个调度管理平台,这也得能够原先 VM模式下kubernetes的成功应用。不同的是你们都 选者了高版本的kubernetes,无论从功能的富有上,性能的提升上,稳定性,可扩展性上来说,完整都是绝对的优势

cr-arbitrator做为extender scheduler,集成到kubernetes中,包括两主次内容:

每个母机部署cadvisor守护进程,用于架构设计 母机上容器的性能数据,目前包括CPU使用情况,memory,网络流量,TCP连接数

定制的网络与调度方案:集群的网络方案,是最为复杂性,也是最为基础的一项。结合业务各模块之间的访问关系,你们都 选定的方案如下

Docker在容器日志处置你这人块,目前已很富有,除了默认的json-file之外,还提供了gcplogs、awslogs、fluentd等log driver。而在你们都 的日志系统中,还是简单的使用json-file,一方面容器日志无需整个方案中的关键节点,愿意之前 日志上的问题图片而影响docker的正常服务;当事人面,把容器日志落地到母机上,接下来只需用把日志及时架构设计 走即可,而架构设计 这块方案能无需 根据情况灵活选者,可扩展性强。你们都 当前选者的方案是filebeat+kafka+logstash+elasticsearch,其社会形态如下

在负载均衡方面:通常情况下,游戏的原先模块能无需 通过deployment之前 是replication controller来创建多个pod(即多组服务),一起去哪些容器又需用对外提供服务。之前 给每个pod都配置原先公司内网IP,也是能无需 处置,但带来的问题图片就说 物理IP资源浪费,一起去无法做到负载均衡,以及弹性伸缩。

集群内模块访问公司内网通信:NAT方案

你们都 基于flannel来实现overlay网络,每个主机拥有原先完整的子网,在你这人扁平化的网络中间,管理简单。当你们都 创建容器的原先 ,会为容器分配原先唯一的虚拟IP,容器与容器之间能无需 方便地通信。当然,在实现中,业务之前 必单纯的用IP来访问,就说 结合DNS服务,通过域名来访问,中间会讲到

Kubernetes在容器image发布你这人块的支持已比较稳定,对于无情况的服务,还能无需 考虑rolling-update方法进行,使游戏服务近乎无缝地平滑升级,即在不停止对外服务的前提下完成应用的更新。

以上便是kubernetes在微服务化游戏中的原先处置方案,定制的网络与调度方案,为游戏容器的运行提供基础环境;域名服务与负载均衡,处置游戏高可用、弹性伸缩问题图片;通过性能数据、日志的架构设计 、统计分析,及时发现守护进程问题图片与性能瓶颈,保证游戏容器稳定、可持续性运行;最后,基于image的发布扩容,使得游戏部署流程更加标准化以及高效。

在你们都 的平台中,原先namespace只属于原先业务,通过namespace,能无需 快速的搜索到业务对应的日志,通过容器的name,能无需 查看业务内每个模块的日志

游戏的逻辑层按不同的服务划分为不同的模块,每个模块完整都是高内聚低耦合,之间的通信通过消息队列(之前 API)来实现。模块的版本通过CI/CD,实现镜像标准交付,快速部署。在哪些模块中,大主次是无情况服务,很容易实现弹性伸缩。

以下是SRIOV网络拓扑图与实现细节

TGW接入时,需用提供物理IP,之前 对接TGW后会用到SRIOV网络的容器,同类中间提到的haproxy LB容器。原先 公网通过TGW访问haproxy,再由haproxy转到集群内容器,从而打通访问的整个链路。

假设当sshd-2访问nginx-0:当packet{172.16.28.5:port => 172.16.78.9:port} 到达docker0时,根据node1上的路由规则,选对flannel.1作为出口,一起去,根据iptables SNAT规则,将packet的源IP地址改为flannel.1的地址(172.16.28.0/12)。flannel.1是原先VXLAN设备,将packet进行隧道封包,之前 发到node2。node2解包,之前 根据node2上的路由规则,从接口docker0出发,再转给nginx-0。最终实现通信

Docker-monitor,是基于cadvisor架构设计 的数据而实现的一套性能统计与告警守护进程。在性能统计方面,除了对每个容器的性能计算外,还能无需 对游戏的每个服务进行综合统计分析,一方面用于前端用户展示,当事人面能无需 以此来对服务进行智能扩缩容。告警方面,用户能无需 按业务需求,配置个性化的告警规则,docker-monitor会针对不同的告警规则进行告警。

2、Kubernetes在调度时,为每个pod分配原先VF与子机IP

在存储方面,目前直接写入到TenDis中,后续之前 压力不要 ,还能无需 考虑在TenDis前加一层消息队列,同类kafka集群

在微服务化游戏中,模块与模块之间是高内聚低偶合,模块的版本内容一般后会通过持续集成来构建成原先个镜像(即image),之前 以image来交付、部署。一起去,游戏版本发布完整都是原先时间窗,整个发布流程都需用在你这人时间窗里完成,之前 就会影响用户体验。怎样才能做到版本的高效发布? 这里有原先关键点:一是基于kubernetes的发布有效性;一是image架构设计 波特率;

之前 ,你们都 需用原先稳固、高效的Loadbalancer方案来代理哪些服务,其中也评估了kubernetes的service方案,过低旺盛期图片 的句子是什么是什么的句子的句子是什么是什么是什么是什么,在业务上应用甚少。刚好kubernetes的第三方插件service-loadbalancer提供了这方面的功能,它主就说 通过haproxy来提供代理服务,之前 有其它在线游戏也用了haproxy,之前 你们都 选者了service-loadbalancer。

sriov-cni是你们都 基于CNI定制的一套SRIOV网络方案,而CNI作为kubernetes network plugins,插件式接入,非常方便,目前已开源,地址:https://github.com/hustcat/sriov-cni

在上述网络方案中,你们都 讲到SRIOV需用绑定物理IP,之前 在容器调度中,除了kubernetes原生提供的CPU\Memory\GPU之外,你们都 还把网络(物理IP)也作为原先计算资源,一起去结合kubernetes提供的extender scheduler接口,你们都 定制了符合你们都 需求的调度守护进程(cr-arbitrator)。其社会形态如下

你们都 以DaemonSet方法部署filebeat到集群中,架构设计 容器的日志,并上报到kafka,最后存储到Elasticsearch集群,整个过程还是比较简单。而这里有个关键点,在业务混合部署的集群中,通过filebeat架构设计 日志时怎样才能去区分不同的业务?而这恰恰是做日志权限管理的前提条件,你们都 只希望用户如此查看当事人业务的日志。

在提高image架构设计 波特率方面,你们都 基于Distribution打造了原先企业级镜像中心,主要涉及到以下几点:

1、母机上开启SRIOV功能,一起去向公司申请子机IP资源,每个VF对应原先子机IP

service-loadbalancer除了haproxy服务外,还有原先servicelb服务。servicelb通过kubernetes的master api来时时获取对应pod信息(IP和port),之前 设置haproxy的backends,再reload haproxy守护进程,从而保证haproxy提供正确的服务。

在网络一节,你们都 讲到kubernetes会为每个pod分配原先虚拟的IP,但你这人IP是非固定的,同类pod发生故障迁移后,如此IP就会发生变化。之前 在微服务化游戏架构下,业务模块之间的访问更多地采用域名方法进行访问。在kubernetes生态链中,提供了skydns作为DNS服务器,能无需 很好的处置域名访问问题图片。

集群内各模块之间的通信:overlay网络

而在近一两年,主次游戏的架构也逐渐往微服务化方向转变,以下是一款游戏的架构

以下是具体的处置方案与流程:

随着docker技术在近几年的快速发展,国内外掀起了一股容器之风。而你们都 也在这时,开启了游戏容器化的探索之路。最刚开始在docker容器的应用上,还是以VM的模式去部署,毕竟游戏是非常复杂性的应用,如此统一的模式。除此之外,对于一项全新技术的应用,你们都 都很谨慎,一步一步地去实践。

也是按功能模块划分不同的服务,前端通过HAProxy来代理用户请求,后端服务能无需 根据负载来实现扩缩容。在服务发现模块中,通过registrator来监视容器的启动和停止,根据容器暴露的端口和环境变量自动注册服务,后端存储使用了consul,结合consul-template来发现服务的变化时,能无需 更新业务配置,并重载。

除了cr-arbitrator实现的调度策略外,你们都 还实现了CPU核绑定。能无需 使容器在其生命周期内使用固定的CPU核,一方面是处置不同游戏业务CPU抢占问题图片;当事人面在稳定性、性能上(结合NUMA)得到保障及提升,一起去在游戏业务资源核算方面会更加的清晰。