Kubernetes可视化管理平台
2021-03-08赵旭杰粱正和
赵旭杰,粱正和
(河海大学 计算机与信息学院,江苏 南京 211100)
0 引 言
随着计算机技术的快速发展,传统的应用部署方式已经无法满足开发者的需求。现如今,既要避免应用与操作系统的绑定,又要改善虚拟机技术十分笨重,不利于移植的特点。
Docker这种应用容器引擎的出现填补了这个空缺。相对于传统方式的虚拟机,它占用的空间更少,启动更快,并且不需要虚拟出整个操作系统,只需要虚拟出一个小规模的环境。每个容器之间互相隔离,并且有着自己的文件系统。容器之间可以通过共用网络资源栈的方式进行交互[1]。任何应用都可以被打包成镜像,在发布成功后,供其他人拉取使用[2]。但是,要将Docker应用于具体的业务实现,还是存在着很大的困难。人们需要一种基于容器的集群管理平台,来解决Docker在编排、管理和调度等方面上存在的问题。
Kubernetes的出现填补了这个空缺,它是开源的容器集群管理系统,可以实现容器集群的自动化部署、自动扩缩容、自动维护等功能[3-4]。并且因为它是基于容器的技术,在移植性、扩展性和自动化方面也具有很大的优势。Kubernetes可以满足生产环境中的很多常见需求,比如:多个进程的协同工作、存储系统挂载、应用实例的复制、日志访问、负载均衡等[1]。通过Kubernetes,可以直接管理云平台中多个主机上的容器化的应用。但与此同时,它也带来了一些操作上的麻烦。目前,大多使用Kubectl命令行的方式,对平台应用进行管理。而这种方式,很大程度上降低了开发的效率,并且提高了运维的成本。
为了改善这种情况,该文使用集成开发平台Fabric8实现对Kubernetes集群的操作,并且使用前端框架React和组件库Ant Design实现平台的可视化。通过该平台,管理人员可以对Kubernetes中的物理节点、Pod节点、Replication Controller、Namespaces、Service 直接进行操作,很好地取代了命令行的方式。
1 系统集成相关技术
1.1 Kubernetes
Kubernetes是一种面向应用的容器集群部署和管理的系统,前身源自Google公司内部的Borg系统,有着强大的开源支撑和10年以上的技术沉淀[5]。相对于Apache下的Mesos和Docker下的SWARM,Kubernetes具备的功能更加齐全,部署也更加方便。Kubernetes在具有强大的集群管理、防护策略和自我修复能力的同时,还支持弹性伸缩和负载均衡,并且提供便捷的服务升级和完善的管理工具[6]。Kubernetes架构如图1所示。
图1 Kubernetes架构
Kubernetes由管理节点和工作节点组成。可以简单理解为它们之间是主从的关系[7]。为了提高平台的可靠性和决策能力,一般会部署奇数数量的管理节点,而工作节点也会部署多个,具体数目由实际资源情况决定。采用这种策略,可以有效地避免在某个节点宕机后,对整个集群产生影响。
管理节点中的核心组件有APIServer、Etcd、Controller Manager、Scheduler等。APIServer是资源操作的唯一入口,有着身份认证、授权和访问控制等机制,也可以用于API注册和发现[1,8-9]。管理人员借助Kubectl命令行工具,可以实现对于Kubernetes集群的管理。Etcd是一个可信赖的分布式键值存储服务,是Kubernetes实现存储化的方案,里面保存着整个集群的状态[9-10]。而Scheduler则负责资源的调度,可以将Pod调度到相应的物理机器上[11]。在调度的过程中,它会首先与APIServer进行交互,然后通过APIServer将请求写入到Etcd中。Controller Manager负责控制器的管理,使得集群达到期望中的状态。Controller Manager中的Replication Controller、Replica Sets和Deployment都可以直接或间接控制Pod的副本数量,使其达到期望的副本数目。并且Controller Manager具备故障检测、自动拓展和滚动更新等功能。
工作节点中主要运行着Kubelet、Kube-proxy和Pod。Kubelet负责管理容器的生命周期,可以对节点中的容器进行删除和添加[8,12]。为了实现容器间文件的持久化和共享,需要借助Volume(CVI),而这也是由Kubelet进行管理的[1,13]。除此之外,Kubelet还负责容器的网络管理和监控等。因为节点中容器有着大量的副本,所以Kubernetes Service想要访问其中对应的副本,需要借助于Kube-proxy。并且Kube-proxy通过IPVS的模式,可以让Service与Pod之间实现负载均衡。Pod既是工作节点中的主要成分,也是Kubernetes的最小单位,它的生命周期取决于其内部容器的状态[14]。
1.2 Fabric8
Fabric8是一个基于Docker、Kubernetes和Jenkins的开源微服务平台。通过Continuous Delivery管道可以很方便地创建、编译、部署和测试微服务,并且通过Continuous Improvement和ChatOps可以对这些微服务进行运行和管理[15]。
在该项目中,会通过Fabric8调用Kubernetes的功能接口,使用Java语言实现可视化界面中后端接口的开发。
1.3 React
React是一个用于构建页面UI的库,它以组件化的思想开发网站。开发者从功能的角度出发,把UI拆分为不同的组件,各组件只负责自己部分的UI和逻辑,彼此互相独立,不同的组件可通过组合或嵌套的方式和其他组件一起使用[16]。
该文通过React技术,将Kubernetes中每个应用拆分为各个组件。可以在菜单栏中,选择想要操作的功能,进入相应的组件。通过各个功能的结合,可以达到在网页中,直接操作Kubernetes的目的。
2 平台设计
2.1 总体设计
Kubernetes容器云管理平台分为四层架构(见图2),分别为:资源层、容器层、平台层和管理层。
图2 层次架构
资源层是平台的最下面一层,它为容器层提供容器镜像和一些系统配置文件。研发人员可以直接对其进行修改配置,也可以通过管理层中的应用对其进行管理。
容器层是Kubernetes集成平台的基础,由开发人员自身创建的私有镜像库提供。可以根据实际需求,自由组装平台需要的运行环境。
平台层是系统的核心,其他各层都是为其服务或者对其进行配置。其中最重要的是Docker和Kubernetes这两个组件。Docker为容器提供了运行环境,Kubernetes则负责统一编排和调度Docker。
管理层主要是配置平台层中的应用,InfluDB加上Grafana可以对平台的状态进行监控,而Harbor会被用来管理私有镜像库。
2.2 平台架构描述
使用React作为前端开发框架,使用Axios用于前后端接口的交互,并且使用React生态圈的新特性React Hook进行开发。借助React Hook可以把所有的组件都定义为函数,而不使用原来继承类的形式,这样可以使得组件的复用性得到很大的增强。
借助React Router来保持UI与URL间的同步,并且使得向应用中添加视图和数据流更加便捷。Axios向后端端口请求到的数据,会在页面跳转后,被渲染到对应的UI组件中。
项目后台由Spring和Spring Boot框架开发而成(见图3),该层使用RequestMapping来完成请求地址的映射,使用框架Fabric8完成与云集成平台的交互,从而可以通过前端页面来完成对于Kubernetes集成平台的管理。
图3 前端各框架的关联
2.3 功能模块描述
平台主要是为了使得原本的命令行管理方式,变得所见即所得。所以要把原本的功能,通过页面的形式给复现出来。如图4所示,主要包括以下几种功能:
图4 功能模块
(1)物理节点。
需要知道部署在云平台上的主机节点和从属节点的IP地址。
(2)命名空间。
为了解决在集群下管理对象时的复杂性问题,Kubernetes使用命名空间的概念。实际使用的时候,需要做到查看和创建命名空间的功能。
(3)Service管理。
Service是Kubernetes中的核心资源对象,它将运行在一组Pods上的应用程序公开为网络服务的抽象方法。所以,既要获取所有的Service服务名称,也要知道每个Service下的具体信息。并且,也需要根据需求,添加或删除相应的Service。
(4)Replication Controller管理。
RC(Replication Controller)的主要作用是:确保容器应用的副本数,始终保持在用户定义的数量。它可以根据情况,创建或回收Pod。在该模块中,要实现对于所有RC的查询,并且可以查询每个RC的详细信息。除此之外,还可以根据需要,手动增加或删除相应的RC,也可以设置容器应用中的副本数。
(5)Pod节点操作。
Pod是Kubernetes中能够创建和部署的最小单位,里面包含一个或多个容器。所以,需要清楚地知道里面的各种属性。
(6)中间件。
这里的中间件,主要是实现了对于MyCat的配置和查询。可以通过前端页面,直接配置相应的MyCat文件,而不需要在服务器端进行配置。
(7)资源监控。
该功能采用InfluDB(时序数据库)加上Grafana的形式。InfluDB是一种开源分布式时序、时间和指标数据库,可以按照时间维度索引数据。Grafana是一款美观、强大的可视化监控指标展示工具,可以很好地展示InfluDB监控到的数据。通过InfluDB将Kubernetes集群平台的资源使用情况记录下来,再通过Grafana进行图形化展示,可以很好地监控集群平台的状态。
(8)镜像管理。
使用Harbor作为Docker私有镜像仓库。Harbor提供了友好的Web UI界面,也可以进行用户权限管理等功能。将Harbor集成到该平台之中,可以很方便地对镜像进行操作。
(9)日志模块。
平台中的日志模块,主要实现了对于操作的记录,以方便日后的还原和查询。与此同时,也包含一些配置文件的读取和操作。
3 实现细节
3.1 前端组件实现
前端组件的组合,得益于React Router的作用。React Router使得组件之间可以借助统一资源定位符,完成嵌套和地址的映射。这些组件中,有负责导航的类,比如:NsIndex、AdminIndex、ServiceIndex等。也有负责添加、删除、展示的类,比如:NodeShow、ServiceShow、AddService等。它们借助于React Hook中的生命周期函数和Axios框架,可以实现与后端程序的交互。
3.2 后台端口实现
后台通过RequestMapping完成请求地址的映射,前台的请求会首先在自身创建的SysGeneratorControlle类中进行处理,然后调用对应的业务逻辑类。在进行业务逻辑处理的时候,会使用到一些自定义的类,比如:nodeSelf、podSelf、serviceSelf,这些类全部继承自Fabric8框架中的原有类。该文在原来的基础上,定义了一些公共方法,来完成一些特定的功能,比如:选择性展示、添加、删除、搜索等。
4 结束语
主要阐述了Kubernetes可视化管理平台的构建方式。主要是通过React框架来完成前台页面的渲染,通过Fabric8进行Kubernetes接口的调用,通过Axios框架实现前后端数据的交互。相比于通过指令控制的方式,这种方式更加简便,对操作人员的要求也更低。
该文构建的可视化管理界面,实现了一些核心功能,但也存在着一些不足和缺漏。在此基础上,可以进一步完成功能上的开发,也可以进行安全上的完善。