基于K3s构建面向云原生应用的容器平台设计与实践
2021-01-14刘忠
摘 要:视频分析系统随着检测类型、检测视频路数的不断增加,既有系统后台架构的弊端日渐凸显,主要体现在高可用、部署、自动化运维、横向自动扩缩容四个方面。为了解决这四个方面问题,提出了基于K3s的云原生应用容器平台的架构设计。经试用实践证明,该平台架构既保证了视频分析系统的高可用性,又有效地提高了部署效率,在基本实现了自动化运维的同时,也具有了横向扩缩容功能。
关键词:K3s;容器;自动化运维
中图分类号:TP393 文献标识码:A 文章编号:2096-4706(2021)12-0022-04
Abstract: With the continuous increase of detection types and the number of detection video channels, the disadvantages of the background architecture of the existing video analysis system are becoming increasingly prominent, which are mainly reflected in four aspects: high availability, deployment, automatic operation and maintenance and horizontal automatic expansion and contraction. In order to solve these four problems, the architecture design of cloud native application container platform based on K3s is proposed. The trial practice shows that the platform architecture not only ensures the high availability of the video analysis system, but also effectively improves the deployment efficiency. It not only basically realizes automatic operation and maintenance, but also has the function of horizontal expansion and contraction.
Keywords: K3s; container; automatic operation and maintenance
0 引 言
隨着高速铁路的快速发展,为了进一步提高车站、站台以及沿线的安全,对视频分析系统(以下简称分析系统)提出了更高的要求。在视频检测量不断增多的同时,多样化的检测需求也在不断地提出,而分析系统通过不断地增加视频检测服务来满足需求。
不断增多的视频检测服务让分析系统问题凸显:
(1)由于检测服务多,有些服务间彼此依赖,某一个服务的异常都可能导致某一类检测服务的不可用。
(2)以人工为主的部署,可维护性差。
(3)以人工为主的运维错误率较高,导致稳定性差。
(4)在检测需求波动大时,无法做到横向自动扩缩容。因此,只有探索提高平台的高可用、服务的易部署、运维的自动化、横向的自动扩缩容的解决方案,才能解决目前分析系统所遇到的瓶颈问题。
容器技术+容器编排调度工具是国内外现阶段平台建设领域的主流。本文根据分析系统自身业务的需求和特点,结合K3S等开源项目搭建私有的云原生应用容器平台(以下简称容器云),并将原有系统的服务拆分改造并容器化后迁移到容器云上,以达到分析系统的高可用、易部署、自动化运维、横向自动扩缩容的目的。
1 开源项目概述
1.1 Docker
Docker是一个开源的应用容器引擎,让开发者可以打包应用以及依赖到一个可移植的容器中,然后发布到任何流行的Linux设备或者Windows设备,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口[1]。结合Dockers镜像私库,可以方便地管理镜像以及版本,达到了一次打包随处部署的可能。同时,将应用部署到容器使其具有了可移植性,成为一种必然的趋势。因此,可以将Docker作为构建容器云的基础引擎。
1.2 Nvidia-device-plugin与Nvidia-docker
Nvidia-device-plugin是用于K3s的NVIDIA设备插件。通过将此插件部署为一个DaemonSet。可以实现:
(1)在集群的每个节点上公开GPU的数量。
(2)跟踪GPU的运行状况。
(3)在K8s集群中运行支持GPU的容器。
Nvidia-docker是NVIDIA容器工具包,允许用户构建和运行GPU加速的Docker容器,该工具包包括一个容器运行时库和实用程序,用于自动配置容器以利用NVIDIA GPU。目前分析系统中使用的正是NVIDIA的GPU设备,所以需要在配备了GPU的主机上部署以上两个插件,使Docker支持GPU的应用。
1.3 K3s
对于大型企业而言,随着系统规模的不断扩大,应用服务的数量和节点主机的数量都在逐渐增加,单纯靠Docker已无法满足系统运维的需求[2]。K3s是Rancher开源的一个轻量级的Kubernetes[3](以下简称K8s)发行版,它针对边缘计算、物联网等场景进行了高度优化,最大程度减轻了外部依赖性。K3s保留了K8s的:
(1)集群管理。
(2)应用健康检测与自动修复能力。
(3)容器集群的自动化部署。
(4)支持服务的发现调度。
(5)弹性伸缩等特性[4]。
由于K8s背靠Google,且有众多的成功案例。而K3s来源于K8s,因此基于K3s构建容器云是一个不错的选择。
1.4 Prometheus
Prometheus是一个系统监控和告警的开源项目,2016年加入CNCF(Cloud Native Computing Foundation),成为仅次于K8s之后的第二个托管项目。Prometheus的主要优势:
(1)由指标名和键/值对标签标识的时间序列数据组成的多维数据模型。
(2)强大的查询语言PromQL。
(3)不依赖分布式存储,单个服务节点具有自治能力。
(4)HTTP协议的数据服务接口。
(5)支持多种类型的图表和仪表盘[5]。
目前已被广泛地用于K8s集群的监控系统中。因此,选择Prometheus作为容器云的基础监控及告警的工具。
1.5 Docker-Registry
Registry是一個无状态、高度可扩展的服务端应用程序,用于存储和分发Docker镜像。Registry是开源的[6]。此项目是Docker官方提供给用户构建私有本地镜像仓库的工具。因此,作为容器云的私有镜像仓库工具。
2 容器云的平台设计
2.1 总统设计
容器云既可以部署在物理主机上,也可以部署在云主机上,总体架构如图1所示。
资源层属于设备层,可以是物理主机设备,也可以是云主机设备,主要是为平台层提供存储和部署能支撑容器的操作系统。本次平台设计与实践是以物理主机为主,用于检测服务的主机设备还需要配备NVIDIA的GPU硬件。
平台层包括容器云的核心组件,如:集群监控Prometheus、运行镜像的容器引擎Docker、支持GPU设备的容器插件、统一编排与调度的K3s、镜像私库Docker-Registry、高可用的分布式存储MinIO等。
应用层是针对平台层进行对集群管理、应用管理、部署管理、镜像管理以及监控管理等的一些平台类的管理软件。
2.2 系统总体功能设计
容器云,主要是对分析系统的可视化部署、自动化运维、服务高可用、横向自动扩缩容四方面的支持。自动化运维包括:平台监控、故障自动修复等,为分析系统的高可用运行提供保障。
2.2.1 可视化部署
容器云对部署提供可视化界面,简化了通过编写YAML或JSON文件等方式来部署的烦琐操作,保证了部署的容器具有统一规范的命名、labels等,便于后期的运维管理;通过可视化界面可以很方便地对所部署的容器选择所依赖的GPU厂商,并将此容器部署到配备了所依赖厂商GPU的节点上,避免了由于部署错误而导致容器不可用的问题。可视化部署界面如图2所示。
2.2.2 自动化运维
容器云提供对平台的监控、故障的自修复等功能,为运维人员提供高效便捷的自动化运维工具:
(1)平台监控。容器云监控工具采用开源项目Prometheus。提供的监控项主要有:物理主机的状态、平台的运行状态、应用的状态、服务负载等方面的监控指标。同时以图表及仪表盘的方式进行展示。对异常告警可以通过邮件、微信等通信方式推送到指定的运维人员,既降低了人工巡检的成本,又缩短了故障发现的周期。集群主机节点及监控如图3所示。
(2)故障自动修复。当K3s的健康检查机制发现某个节点出现问题,它会自动将该节点上的资源转移到其他节点上并完成自动恢复;当检测发现某个容器出现问题时,会重启容器。私有仓库的搭建,为分析系统的服务出现异常时进行自动修复提供了支持,为新版本部署失败后回滚到其他历史版本提供了支持,为应用服务的不间断运行提供了可能。
2.2.3 服务高可用
分析系统的服务高可用通过K3s的副本及探针等机制来实现。
2.2.4 横向自动扩缩容
K3s根据容器预定义的负载指标(包括:CPU、GPU、内存、磁盘等)的使用情况来确定是否进行扩容或缩容。在分析系统中,主要以GPU的监控指标来确定扩缩容的情况。
2.3 容器云的高可用设计
分析系统在面向生产环境的实践中,高可用部署是无法避免的问题。在这种情况下,通过容器云的高可用,来避免所造成的影响,或者将影响降到最低。
2.3.1 K3s的高可用部署
虽然单节点K3s集群可以满足各种用例,但对于Kubernetes Control-plane的正常运行至关重要的环境,可以在高可用配置中运行K3s[7]。这种模式下,必须有奇数的服务器节点,建议从三个节点开始。K3s高可用架构示意图如图4所示。
2.3.2 存储的可靠性
容器云根据分析系统对存储的安全性要求,对视频检测结果的图片、视频片段等文件都存储到统一的分布式对象存储MinIO中;对用户数据则存储到采用主从方式部署的高可用集群数据库中。在K3s集群中采用ETCD作为数据存储的媒介。
2.3.3 分析系统的高可用
分析系统的各类服务都以容器的形式部署到K3s中,K3s通过副本的冗余来提供服务的高可用。首先打包服务为镜像并上传到镜像私库,然后在容器云的可视化部署界面,根据业务的实际运行情况,以Deployment、StatefulSets或DaemonSets中的任一种方式部署服务,通过配置合理的副本数和探针保证服务的高可用。当主机节点出现故障或服务本身的BUG导致不可用时,K3s就会自动在其他主机上重新部署服务或重启服务,来保证与部署配置的一致性。
2.3.4 监控的多样化与自动告警
容器云分别从主机节点、容器云、容器三个方面对容器云的健康状况进行监控。
在所有的主机节点上都部署了Prometheus的客户端组件node-exporter(配备了NVIDIA GPU的主机需要部署dcgm-exporter[6],其他厂商的GPU需要根据厂商提供的插件安装),实时采集宿主机的硬件、操作系统以及所部署的容器的关键指标并上报。一旦出现告警,就会触发Alert manager组件,并根据平台配置进行告警。
对于容器,利用K3s的探针机制,定期检测健康状态,当检测到异常时,自动根据配置策略对容器进行下一步的操作,同时发送告警信息。
以上三个方面的监控都可以通过平台配置,及时地通过即时通信软件告知运维人员,以便及时排查问题。
2.4 技术要点分析
2.4.1 Docker支持GPU
K3s支持对节点上的GPU进行管理。但是需要根据各GPU厂商的要求部署GPU容器插件。例如NVIDIA的GPU容器插件要求:
(1)必须预先安装了NVIDIA驱动。
(2)必须预先安装了Nvidia-Docker2.0。
(3)Docker的默认运行时必须设置为Nvidia-Container-Runtime,而不是RunC。
(4)NVIDIA驱动版本~=384.81[8]。
2.4.2 如何将容器部署到指定主机节点
要将容器部署到指定的主机节点,需要进行两方面的设置。首先对加入容器云集群并配备了GPU的主机增加自定义labels:hardware-type(例如:hardware-type=NVIDIA GPU);然后分析系统检测服务部署时需要指定nodeSelector的值,具体内容为:spec.nodeSelector.hardware-type=NVIDIAGPU或spec.template.spec.nodeSelector.hardware-type=NVIDIAGPU。按以上内容配置后,就能将检测服务部署到配备有NVIDIA GPU的主机节点上了。
2.4.3 横向自动扩缩容
K3s提供了Pod水平自动伸缩(Horizontal Pod Autoscaler, HPA),根据资源利用率或自定义的指标自动调整副本的数量,实现部署的自动扩容与缩容。让部署的规模接近于实际服务的负载。
2.4.4 服务的高可用
K3s提供了ReplicaSet(RS)/Replication Controller(RC)来保证部署的服务是多副本的;而提供的Probe(探针)是对容器执行的定期诊断,每次诊断都会获得三种结果(成功、失败、未知)之一,针对运行中的容器,可以运行三种探针的一种或多种:
(1)livenessProbe,存活态探针,探测容器是否正常运行,如果失败,则杀死容器,并将根据其重启策略决定未来。
(2)readinessProbe,就绪态探针,探测容器是否准备好为请求提供服务,如果失败,节点控制器从与容器组匹配的所有服务的节点列表中删除该容器组的IP地址。
(3)startupProbe,启动探针,探测容器中的应用是否已经启动,如果失败,那么其他探针都将被禁止。
3 容器云试用成效
在搭建完成的容器云上迁移并测试视频分析系统的各个模块后,得到以下试用效果:
(1)具备了高可用性:容器云的高可用架构设计,通过冗余和故障的自动修复保证了分析系统各类服务的高可用性。
(2)提高了部署效率:在容器云的可视化部署界面只需要选择镜像、设置副本、需要GPU的选择相应的GPU厂商后,就可以部署一个应用,相比之前依靠手动或Shell脚本的部署,既降低了难度又提高了成功率。
(3)提升了监控能力:采用Prometheus对容器云的多级监控,使得监控指标更丰富,监控内容更完善,运维自动化程度的加强,提高了故障通知的及时性和故障响应的效率。
(4)实现了自动扩缩容:通过对检测服务的容器预定义GPU的指标,可以自动的对检测服务进行扩容/缩容,既增强了服务的响应能力又提高了GPU资源的利用率。
4 结 论
容器云基于K3s技术将分析系统的部署可视化、运维自动化、各类服务高可用化、横向扩缩容自动化。容器云在分析系统项目的迁移试用中达到了预期的效果,但对于原生云涉及的DevOps和持续交付两部分本文暂未涉及,有待下一步进行探索和实践。
参考文献:
[1] 百度百科.Docker [EB/OL].[2021-04-19].https://baike. baidu.com/item/Docker/13344470?fr=aladdin.
[2] 翁涅元,单杏花,阎志远,等.基于Kubernetes的容器云平台设计与实践 [J].铁路计算机应用,2019,28(12):49-53.
[3] Kubernetes. Kubernetes是什么? [EB/OL].[2021-04-19].https://kubernetes.io/zh/docs/concepts/overview/what-is-kubernetes/.
[4] Rancher. K3s介绍 [EB/OL].[2021-04-19].https://docs. rancher.cn/docs/K3s/_index.
[5] Prometheus. OVERVIEW [EB/OL]. [2021-04-19].https://prometheus.io/docs/introduction/overview/.
[6] Docker Docs. Docker Registry [EB/OL].[2021-04-15].https://docs.docker.com/registry/.
[7] Rancher.架構介绍 [EB/OL].[2021-04-20].https://docs.rancher.cn/docs/K3s/architecture/_index.
[8] Kubernetes.调度GPU [EB/OL].[2021-04-18].https://kubernetes.io/zh/docs/tasks/manage-gpus/scheduling-gpus/.
作者简介:刘忠(1976.12—),男,汉族,河北张家口人,工程师,研究方向:通信信息。