基于容器虚拟化的领域概念知识点自动问答系统设计与实现

作者: 张巧燕 裴栋

基于容器虚拟化的领域概念知识点自动问答系统设计与实现0

摘要:文章设计的基于容器虚拟化技术的领域概念知识点自动问答系统,不仅能够准确地回答学生所提出的问题,帮助学生加深对概念及专业术语的理解,还能帮助教师节省答疑时间。同时,该系统结合了Docker容器与K8S集群的优点,利用Docker+K8S相结合的容器虚拟化技术实现负载均衡,根据实时访问用户数量对系统进行动态伸缩扩容,从而满足不同数量用户的访问需求。

关键词:容器虚拟化;自动问答系统;Docker;K8S;负载均衡

中图分类号:TP311 文献标识码:A

文章编号:1009-3044(2024)27-0034-04

0 引言

自动问答系统(Automatic Question and AnsweringSystem,简称QA) ,也称为人机对话系统(Humanmachineconversation, HMC) ,是指用户输入自然语言形式描述的问题,机器系统从大量数据中查找出准确、简洁、人性化的回答并反馈给用户。例如,当用户输入“中国共产党哪一年成立?”,问答系统会回答“1921年”。

在现今的“互联网+”时代,随着互联网技术与人工智能的飞速发展,问答系统在人工智能和自然语言处理领域有广泛的应用前景和研究价值[1]。这种系统能够给所提出的问题提供准确的回答,并可应用于各个领域。国外开发的限定领域问答系统如:2015年,Caner Derici专门为高中生提供教育支持的封闭领域QA系统[2]。2018年,Karpagam等人设了基于移动领域的自动问答系统,为用户提供计算机、软硬件、书评等方面的知识[3]。

国内研究的限定领域自动问答系统如:2018年,史梦飞设计了一种结合基于语义依存分析的剪枝算法及自动化模板的问答方法,设计开发了一套基于特定领域的中文知识库问答系统[4]。2019年,张楚婷将传统的FAQ问答模型和基于知识图谱的问答模型相结合,并基于BiLSTM-CRF的细粒度知识图谱问答模型,设计了以广西为例的旅游行业问答系统[5]。2021 年,文献[6]设计并实现了信息安全领域的自动问答系统。2022年,范钰程设计并实现了高考自动问答系统,对问答系统的算法进行研究,分为实体识别任务和问答匹配任务,收集了3 000余所院校信息构建高校招生知识图谱,可以满足用户获取高校专业信息的需求[7]。2023年,涂凌将知识图谱中的结构化信息和问答与知识库中常见问题和答案相结合,设计并实现了面向蚕桑领域的自动问答系统,从而提供更加全面和高效的问答服务[8]。

以上系统大多是基于本地实现,用户承载量有限,一旦访问用户量增多,就会出现查询缓慢等问题。本文设计的基于容器虚拟化技术的领域概念知识点自动问答系统,不仅能够准确回答学生所提出的问题,帮助学生加深对概念及专业术语的理解,还能帮助教师节省答疑时间。同时,该系统结合了Docker容器与K8S集群的优点,利用Docker+K8S相结合的容器虚拟化技术实现负载均衡,根据实时访问用户数量对系统进行动态伸缩扩容,从而满足不同数量用户的访问需求。

1 相关工作

1.1 Docker 容器

Docker容器于2013年作为开源项目推出,是基于经典的C/S架构并使用Go语言编写的应用程序。它利用了cgroups和命名空间等容器计算概念。Docker 镜像提供了一个轻量的、可执行的软件包,包含执行程序所需的全部条件:代码运行和系统库等。其优点包括能够与其他容器共享主机OS内核,允许在单个服务器(或虚拟机)上部署多个容器,仅需维护一个操作系统即可实现快速扩展和部署。

相比于单纯的Linux内核容器技术,Docker提供了完整的应用/服务器运行时环境打包,采用了分层镜像构建存储等特性,以服务和应用为核心。Docker 的核心模块包括Docker Client、rootfs和Docker Regis⁃try。Docker Registry是Docker的镜像仓库(类似于Git的代码仓库)。Images指Docker服务器从镜像仓库中拉取的镜像,而Containers指通过这些拉取的镜像实例化并运行的多个容器实体。所有操作请求均从Docker客户端发出。

1.2 K8S 集群

K8S是一种基于容器技术的分布式解决方案,起初是在谷歌公司内部运营了十几年的一个开源项目——Borg(博格)。2014年9月,谷歌公司将其开源,并命名为Kubernetes。2015年7月,发布了第一个正式版本。截至目前,最新版本为1.30.0。K8S的架构如图2所示。

K8S(Kubernetes) 架构图通常包含多个组件和节点,这些组件和节点共同协作,以实现容器的编排、管理和自动化部署。K8S架构图主要包含以下组件:

1) Master 节点。这是Kubernetes 集群的控制中心,主要负责API服务、集群状态管理和决策等。Mas⁃ter节点主要包括以下组件:

① kube-apiserver:Kubernetes API 的服务器,提供RESTful API接口,是所有组件交互的枢纽。

②etcd:分布式键值存储,用于保存集群的所有数据。

③kube-scheduler:负责Pod的调度,根据预定的调度策略将Pod调度到相应的Node上。

④ kube-controllermanager:负责维护集群的状态,如故障检测、自动扩展和滚动更新等。

2) Node 节点。这是Kubernetes集群的工作节点,用于运行容器化应用。Node 节点主要包括以下组件:

① kubelet:在每个Node上运行,负责维持容器的生命周期,同时负责Volume(CVI) 和网络(CNI) 的管理。

② kube-proxy:负责为Service 提供集群内部的服务发现和负载均衡。

③ Container runtime:负责镜像管理以及Pod和容器的实际运行(CRI) 。

3) 网络组件。如CNI(容器网络接口)插件,用于实现容器网络。

4) 存储组件。如CVI(容器卷接口)插件,用于实现容器存储。

5) 其他组件。如kube-dns,负责为Service 提供DNS服务,以便Pod能够相互发现和通信。

在这个架构中,Master节点和Node节点通过API 进行交互,Node节点负责运行容器,而Master节点则负责管理和调度这些容器。此外,Kubernetes还提供了丰富的API接口和插件机制,使得用户可以根据自己的需求进行定制和扩展。

1.3 资源调度与负载均衡

Kubernetes(K8S) 的资源调度与负载均衡涉及多个组件和策略,以确保集群中的资源得到高效、合理的利用,并满足应用程序的需求。

1.3.1 资源调度

K8S进行资源调度遵循以下主要策略:

1) Scheduler。Kubernetes Scheduler 负责Pod 调度。它根据一系列调度算法和约束条件,决定将Pod 放置在集群中的哪个Node上运行。

2) 资源亲和性与反亲和性。① 亲和性(Affinity) 。定义了Pod应该被调度到哪些Node上。② 反亲和性(Anti-Affinity) 。定义了Pod 不应该被调度到哪些Node上。通常用于确保高可用性,例如,避免将同一服务的多个副本都调度到同一个Node上。

3) 资源预留与限制。通过设置资源请求(re⁃quests) 和限制(limits) ,可以确保Pod 获得足够的资源,并防止单个Pod 消耗过多的资源。资源请求是Pod所需的最低资源量,而资源限制是Pod可以使用的最大资源量。

4) 优先级与抢占。Kubernetes支持根据Pod的优先级进行调度。如果高优先级的Pod需要资源,而当前Node上只有低优先级的Pod,那么低优先级的Pod 可能会被抢占(preempted) ,以便为高优先级的Pod提供资源。

1.3.2 负载均衡

负载均衡主要通过以下组件实现:

1) Service。在Kubernetes中,Service是一种抽象,用于定义Pod的逻辑集合和访问策略。当Pod需要对外提供服务时,可以通过Service进行暴露。

2) Service Load Balancer。Kubernetes支持多种类型的Service,其中LoadBalancer类型的Service会在云提供商的负载均衡器上创建一个外部负载均衡器。外部负载均衡器负责将外部流量分发到后端的Pod 上,实现负载均衡。

3) Ingress。Ingress资源用于定义集群外部的访问策略,包括负载均衡和SSL终止等。Ingress Control⁃ler是Ingress资源的实现,负责将外部流量路由到集群内部的服务。

4) 内部负载均衡。对于集群内部的Pod之间的通信,Kubernetes提供了多种内部负载均衡机制,如kube-proxy。kube-proxy可以根据Service的定义,将流量路由到后端的Pod上,实现内部负载均衡。

本文的负载均衡功能主要通过在多个Master节点之外使用负载均衡器来实现。

2 系统设计

本文中,设计的基于容器虚拟化技术的领域概念知识点自动问答系统不仅能够准确回答学生提出的问题,帮助学生加深对概念及专业术语的理解,还能帮助教师节省答疑时间。同时,该系统结合了Docker 容器与K8S集群的优点,利用Docker+K8S相结合的容器虚拟化技术实现负载均衡,根据实时访问用户数量对系统进行动态伸缩扩容,从而满足不同数量用户的访问需求。

2.1 系统实现流程

系统主要从中文维基百科中选取信息安全领域的概念。选取好概念后,采用JWPL从维基百科提取概念解释文本,对提取好的概念解释文本进行繁简转换、去停用词等操作,并以字典的形式存储到数据库中。系统主要通过TCP协议进行通信,并根据用户查询要求,从数据库中提取概念解释文本供用户使用。本地用户系统实现后,将其部署到K8S集群上,并在访问量大的时候通过资源调度算法实现系统的负载均衡,从而满足不同数量用户的访问需求。系统实现流程如图3所示。

2.2 负载均衡实现原理

本文的负载均衡功能主要通过在多个Master节点之外使用负载均衡器实现,相当于在多个Master节点之上设置了一层入口分流。外部请求首先通过负载均衡器,然后由其选择具体的Master 节点进行处理,实现基于静态Pod特性。同时,可以将后续的两个其他核心服务打包在一个静态Pod中,这种方式稳定性好且易于上手,更适合公有云环境。

此方案对公有云的良好支持也有利于项目快速从内网迁移到外网。此外,K8S控制器和K8S调度器本身是主节点的一部分,其高可用性较易部署,只需确保同一时间仅有一个组件对集群进行操作即可,可以采用Leader选举机制来实现。负载均衡的具体执行流程如图4所示。

3 实验

3.1 实验环境

本文所部署的集群节点采用一个Master和两个Node节点,配置情况如表1所示:

集群所部署的系统软件版本如表2所示:

3.2 K8S 集群搭建流程

K8S 集群搭建流程总共包括6 个步骤,如图5 所示:

1) 配置基础环境。每个节点按照要求配置免密SSH;关闭所有节点的SELinux和防火墙,进行时间同步;所有节点添加主机名解析;所有节点添加Docker 软件仓库;所有节点添加K8S软件仓库;禁用所有节点的swap;调整所有节点的系统资源限制;所有节点升级系统并重启。

上一篇 点击页面呼出菜单 下一篇