文章目录

  • OpenStack节点类型
    • 1、控制节点
    • 2、网络节点
    • 3、计算节点
    • 4、存储节点
  • 详解
    • 1、云平台调用过程
    • 2、身份认证服务Keystone
    • 3、控制台Dashboard
    • 4、镜像模块Glance
      • Glance主要组件
      • 镜像的格式
    • 5、计算模块Nova
    • 6、块存储Cinder
    • 7、网络模块Neutron

OpenStack节点类型

1、控制节点

顾名思义就是OpenStack中实现数据中心控制的节点,管理OpenStack的所有组件,不管所有组件接在哪里,都需要控制节点完成类似的注册工作
控制节点必须安装三种类型的软件
第一种:
在控制节点上必须安装的是一些底层软件,所谓的底层软件就是相对于OpenStack服务来说的,这些底层的软件需要为OpenStack组件来提供服务,所以为底层,这些软件有DB软件、消息队列软件、Memorycache和Etcd等
第二种:
除了底层软件之外,控制节点上次序安装三个OpenStack的核心组件,Keystone和Glance是完整的安装在控制节点上的,Nova安装了一部分,Nova的安装时为了管理计算节点上的计算服务
Glance服务是可以从控制节点上剥离的,一般Glance占用的资源小大家都是安装在控制节点上的
控制节点上可以安装Nove-computed服务,主要用在实验环境,生产环境一般不使用
第三种:
除了底层服务软件和核心组件之外,因为OpenStack还支持其他可选的组件,需要安装其他组件对应的服务组件

2、网络节点

网络节点上只有Neutron组件,网络节点的Neutron安装Core Plugin(MI2)和Service Plugin(L3 Service),具体的Service Plugin可根据需求选择

3、计算节点

包含Nova部分组件和Neutron部分组件,Nova-compute、Neutura-agent

4、存储节点

安装存储组件的节点,一般有代表性的Cinder(块存储)和Swift(对象存储)

详解

1、云平台调用过程

OpenStack由多种服务组成,每种服务具有独立的命名。在整个OpenStack架构中,Keyston提供认证服务,接收来自用户和服务的认证请求,并对其身份进行认证。各个服务之间通过公用的API接口进行交互。大部分服务均包含一个API进程,用于侦听API请求,根据服务的性质选择处理请求或转发请求。服务进程之间的通讯通过消息队列实现,如AMQP。
在部署完成的云系统平台上,用户通过Dashboard或RestAPI方式经KeyStone模块认证授权后,可执行创建虚拟机服务。通过Nova模块创建虚拟机实例,Nova调用Glance模块提供的镜像服务,然后调用Neutron模块提供网络服务。根据需要可以选择给虚拟机增加存储卷,卷功能由Cinde模块提供服务,整个过程在Ceilometer模块的资源监控下完成。同时Cinder提供的Volume和Glance提供的镜像可以通过Swift对象存储机制进行保存。

通过以上分析可以看到OpenStack云平台服务的提供主要依靠Nova、Glance、Cinder和Neutron四个核心模块完成,四个辅助模块Horizon、Ceilometer、Keystone、Swift提供对的访问、监控、权限和对象存储功能。

2、身份认证服务Keystone

主要涉及到以下几个概念:
(1)用户–user
在OpenStack中,用户是使用OpenStack云服务的人、系统或服务。用户可以登录或使用指定的token访问云中的资源,并可以被指派到指定的项目或角色。认证服务通过对用户身份的确认,来判断一个请求是否被允许。用户通过认证信息如密码、API Keys等进行验证
(2)项目–project
项目是各个服务中的一些可以访问的资源集合,用来分组或隔离资源或身份对象。不同服务中,项目所涉及的资源不同。在Nova服务中项目可以是云主机,在Swift和Glance中项目可以是镜像存储,在Neutron中项目可以是网络资源。默认情况下,用户总是被绑定到项目中。一个项目中可以有多个用户,一个用户可以属于一个或者多个项目。
(3)角色–role
角色是一组用户可以访问的资源权限集合,这些资源包含虚拟机、镜像、存储资源等。用户既可以被添加到全局的角色,也可以被添加到指定项目内的角色中。其区别是,全局的角色适用于所有项目中的资源权限,而项目内的角色只适用于某个项目内的资源权限。
(4)服务–service
用户使用云中的资源是通过访问服务的方式实现,OpenStack中包含许多服务,如提供计算服务的Nova、提供镜像服务的Glance以及提供对象存储的Swift。一个服务可以确认当前用户是否具有访问其资源的权限。但是当一个用户尝试访问其项目内的service时,该用户必须知道这个服务是否存在以及如何访问这个服务。
(5)令牌–token
是一串数字字符串,用于访问OpenStack服务的API以及资源,一个令牌可以在特定的时间内生效,并可以在任意时间释放,在keystone中主要是引入令牌机制来保护用户对资源的访问
(6)端点–endpoint
所谓端点,是指用于访问某个服务的网络地址或URL。如需要访问一个服务,则必须知道该服务的端点。在keystone中包含一个端点模板,这个模板提供了所有已存在的服务的端点信息。一个端点模板包含一个URL列表,列表中的每个URL都对应一个服务实例的访问地址,并且具有public、private和admin这三种权限。其中public类型的端点可以被全局访问,private类型的端点只能被OpenStack内部服务访问,admin类型的端点只能被管理员访问。
OpenStack身份认证服务将管理认证、授权以及服务目录整合为一个访问点,同时也是用户需要和OpenStack进行交互的第一个服务。一旦认证通过,终端用户使用其身份访问OpenStack其它服务。同样的,其它服务也将利用身份认证服务确认来访用户身份是否合法以及是否具备相应的权限,此外,OpenStack身份认证服务可以集成其它的身份认证管理系统,如LDAP等

身份认证服务包含以下组件:

  • 服务器:一个中心化的服务器使用RESTful接口来提供认证和授权服务
  • 驱动:驱动或服务后端被整合到集中式服务器中。它们被用来访问OpenStack外部仓库的身份信息,并且它们可能已经存在于OpenStack被部署在基础设置(如SQL数据库或LDAP服务)中
  • 模块:模块运行使用身份认证服务的OpenStack组件的地址空间中这些模块拦截服务请求,获取用户凭证,并将它们送入中央服务器以寻求授权。使用Python Web服务器网关接口,可以实现中间件模块和OpenStack组件间的整合
3、控制台Dashboard

Dashboard(项目名称为horizon)是一个web接口,使得云平台管理员以及用户可以管理不同的OpenStack资源以及服务。Dashboard通过Apache的mod_uwgis搭建,并通过Python模块实现和不同的OpenStack API进行交互,从而实现管理目的。Dashboard是一个用以管理、控制OpenStack服务的Web控制面板,通过他可以实现绝大多数的OpenStack的管理任务。如实例、镜像、密钥对、卷等。通过Dashboard,管理员无需记忆繁琐复杂的OpenStack命令。除此之外,用户还可以在控制面板中使用终端VNC直接访问实例控制台。Dashboard可以实现以下管理任务

  • 实例管理:创建、删除实例,查看终端日志,远程连接实例,管理卷等;
  • 访问与安全管理:创建安全组,管理密钥对,设置浮动IP等;
  • 偏好设定:对虚拟硬件模板可以进行不同程度的偏好设定;
  • 镜像管理:导入、编辑或删除镜像;
  • 用户管理:创建用户、管理用户、设置配额、查看服务目录等;
  • 卷管理:管理卷和快照;
  • 对象存储处理:创建、删除容器和对象;
4、镜像模块Glance

镜像服务允许用户发现、注册和获取虚拟机镜像。它提供了一个REST API,允许查询虚拟机镜像的元数据,并获取一个现存的镜像。可以将虚拟机镜像存放到各种位置,从简单的文件系统到对象存储系统,如OpenStack Swift项目,默认是存储在本地文件系统上的。其实在生产环境中这个模块本身不存储大量的数据,需要挂载后台存储swift来存放实际的镜像数据。
在OpenStack环境中,镜像是用于在计算节点生成虚拟机。脱离了镜像服务,就无法创建虚拟机,所以镜像服务是OpenStack的一个核心服务

Glance主要组件

(1)glance-api
glance-api用于接收镜像API的调用,诸如镜像发现、恢复以及存储等。作为一个后台进程,glance-api对外提供REST API接口,响应用户发起的镜像查询、获取和存储的调用。
(2)glance-registry
glance-registry用于存储、处理和恢复镜像的元数据,元数据包括镜像的大小和类型等属性,registry是一个内部服务接口,不建议暴露给普通用户
(3)database
database用于存放镜像的元数据,可以根据需要选择数据库,如MySQL、SQLite等
(4)storage repository for image files
一般情况下,glance并不需要存储任何镜像,而是将镜像存储在后端仓库中。glance支持多种repository。主要包括对象存储swift、块存储cinder、VMware的ESX/ESXi或者vCenter、亚马逊的S3、HTTP可用服务器、Ceph等

镜像的格式

glance支持多种镜像格式,包括磁盘格式和容器格式。OpenStack中可以支持多种虚拟化的技术,如KVM、XenServer、Hyper-V和VMware等。在用户上传镜像时,需要指定上传镜像文件的格式。除了磁盘格式,在glance中还有容器的格式。一般在上传镜像时只需指定容器格式为bare,即为空。因为glance中并没有真正使用到容器格式。容器格式用来表示虚拟机镜像文件是否包含了元数据,例如OVF格式,下面列出了glance中常见的几种镜像文件格式。
(1)RAW
RAW是一种没有格式或裸格式的磁盘文件类型,RAW对数据不做任何修饰和处理,直接保存最原始的状态,所在性能方面非常出色。由于RAW格式保存原始数据、因此更容易和其它镜像进行转换
(2)QCOW2
QCOW2是QCOW的升级版本,其主要的特性是磁盘文件大小可以动态按需增长,并且不会占用所有的实际磁盘空间大小
(3)VHD
VHD是微软公司产品使用的磁盘格式
(4)VMDK
VMDK是VMware公司产品使用的磁盘格式
(5)VDI
VDI是oracle公司的virtualBox虚拟软件所使用的格式
(6)ISO
ISO是指一种存档数据文件在光盘上的格式
(7)AKI、ARI、AMI
Amazon公司的AWS所使用的的镜像格式

5、计算模块Nova

Nova是负责提供计算资源的模块,也是OpenStack中的核心模块,其主要功能是负责虚拟机实例的生命周期管理、网络管理、存储卷管理、用户管理以及其他的相关云平台管理功能。OpenStack使用计算服务来托管和管理云计算系统。OpenStack计算服务是基础设施服务(IaaS)系统的主要组成部分,模块主要由Python实现。
OpenStack极端组件请求OpenStack identity服务进行验证,请求OpenStack image服务提供磁盘镜像,为OpenStack dashboard提供用户和管理接口。磁盘镜像访问限制在项目与用户上;配额以每个项目进行设定,例如,每个项目下可以创建多少实例。OpenStack组件可以在标准硬件上横向大规模扩展,并且下载磁盘镜像启动虚拟机实例。OpenStack计算服务的主要组件如下。
(1)nova-api服务
接收和响应来自终端用户的计算API请求,对外提供一个与云基础设施交互的接口,也是外部可用于管理基础设施的唯一组件。
(2)nova-api-metadata服务
接收来自虚拟机发送的元数据请求。nova-api-metadata服务一般在安装nova-network服务的多种主机模式下使用。
(3)nova-compute服务
一个持续工作的守护进程,通过hypervisor对的API来创建和销毁虚拟机实例。
(4)nova-placement-api服务
nova-placement-api用于追踪记录资源提供者和资源使用情况,这些资源包括计算、存储以及IP地址池等。
(5)nova-conductor模块
nova-conductor模块作用于nova-compute服务与数据之间,避免了由nova-compute服务对云数据的直接访问。它可以横向扩展。但是,不要将它部署在运行nova-compute服务的主节点上。
(6)nova-scheduler服务
主要从消息队列截取创建实例请求,根据配置从计算节点群集中选取最优节点,并将请求转发到该节点,最终将虚拟机运行在该节点上。
nova-scheduler负责nova主机选择、提供决策功能
计算模块装在计算节点和控制节点上

6、块存储Cinder

块存储服务(cinder)提供块存储。储存的分配和消耗是由块存储驱动器或者多后端配置的驱动器决定的。还有很多驱动程序可用:NSA/SAN、NFS、ISCSI、CEPH等。块存储适合性能敏感性业务场景,例如数据库存储大规模可扩展的文件系统或服务器需要访问到块级的裸设备存储。典型情况下,块服务API和调度器服务运行在控制节点上。取决于使用的驱动,卷服务器可以运行在控制节点、计算节点或单独的存储节点之上。
块存储服务为OpenStack中的实例提供持久的存储,块存储提供一个基础设施,用于管理卷以及OpenStack计算服务交互,为实例提供卷、快照、卷类型等功能。站在实例的角度,挂载的每个卷都是一块独立的硬盘。cinder提供了从创建卷到删除卷整个生命周期的管理。其具体的功能是:

  • 提供REST API接口,使用户能够查询和管理卷、卷快照以及卷类型;
  • 协调卷的创建请求,合理优化存储资源的分配;
  • 通过驱动架构支持多种后端存储方式,包括LVM、NFS、Ceph和其它诸如EMC、IBM等商业存储产品和方案

cinder服务有以下几个组件:
(1)cinder-api
cinder-api用来接收API请求,并将其路由到cinder-volume执行
(2)cinder-volume
cinder-volume用来与块存储服务和cinder-scheduler进程进行直接交互。它也可以与这些进程通过一个消息队列进行交互。cinder-volume服务响应送到块存储服务的读写请求来维持状态,它也可以和多种存储提供者在驱动架构下进行交互。当用户请求资源时,由cinder-api负责接收请求,cinder-scheduler负责调度资源,而真正执行存储任务的是cinder-volume。这样的工作机制使得存储架构非常容易拓展。当存储资源不足时,可以增加存储节点(运行cinder-volume)。当客户的请求太大调度不过来时,可以增加调度(运行cinder-scheduler)。
(3)cinder-scheduler
cinder-scheduler守护进程会选择最优存储节点来创建卷,其工作机制与nova-scheduler类似。当需要创建时,cinder-scheduler根据存储节点的资源使用情况选择一个最合适的节点来创建卷。
(4)cinder-backup守护进程
cinder-backup服务是提供任何种类备份卷到一个备份存储提供者。就像cinder-volume服务,它与多种存储提供者在驱动架构下进行交互。
(5)消息队列
消息队列作用是在块存储的进程之间路由信息。cinder各个子服务通过消息队列实现进程通信和相互协作。
以创建卷为例,cinder的工作流程如下:
(1)用户向cinder-api发送创建卷请求:“帮我创建一个卷”;
(2)cider-api对请求做一些必要处理后,向消息队列发送一条消息:“让cinder-scheduler创建一个卷”;
(3)cinder-scheduler从消息队列获取到消息,然后执行调度算法,从若干存储节点中选出节点A;
(4)cinder-scheduler向消息队列发送一条信息:“让存储节点A创建这个卷”;
(5)存储节点A的cinder-volume从消息队列中获取到信息,然后通过卷提供者的驱动创建卷。

7、网络模块Neutron

OpenStack早起的网络模块是nova-network,而neutron则是nova-network的更新换代产品,也是目前OpenStack重要组件之一。
OpenStack网络概念
(1)网络
类似于实际的物理环境中的网络,OpenStack网络用语连接云主机或路由器。除此之外,还包含子网、网关以及DHCP服务等。OpenStack网络分为内部网络和外部网络,内部网络一般用于连接虚拟机,而外部网络一般用于连接宿主机外面的网络。
(2)子网
OpenStack中的子网是一个IP地址段,用于定义实际的IP地址范围
(3)端口
端口类地于实际网络中的网络接口,用于连接终端设备或另一网络。不同的是,OpenStack中端口连接的一般都是虚拟设备接口如虚拟机的虚拟网卡或者路由器的虚拟接口等。端口还描述了相关的网络配置,例如可以在端口上配置MAC地址和IP地址。
(4)路由器
路由器用于连接OpenStack的内部网络和外部网络。类似实际路由器功能,支持NAT功能,通过绑定浮动IP地址还可以实现地址映射
neutron分别提供了二层(L2)和三层(L3)路由抽象的功能,对应于物理网络环境中的交换机和路由器。
neutron组件主要装在网络节点、控制节点(可选择)、计算节点
实验环境中会将neutron组件装到控制节点,将控制节点与网络节点合在一起
neutron有两种类型:租户网络(project network)、供应商网络(provider network)

供应商网络
供应商网络由域管理员创建,并且必须与现有的物理网络匹配
供应商网络是支持三层网络虚拟化,最大的不同是租户可以按照自己的需求创建私有网络

创建供应商网络,他是有不同网段的,每个网段和不同的物理网卡关联,这边分配的供应商网络,会产生多个公网IP地址段,这些地址段。统称为浮动IP地址段。他是可以分配给租户的VM实例使用

租户网络
(1)租户网络可以创建多个私有网络,同时也可以定义自己私有网络的IP地址范围
(2)project网络:特定的project的实例接入所属的project网络,可以使用
(3)vlan、GRE、VXLAN
(4)router负责连接project网络和external网络实现DNAT和SNAT

  • SNAT从公司内部方位百度新浪网站 叫SNT 因为他的源地址需要转化成公网IP地址,也就是分配的浮动地址

  • DNAT从公网访问公司内部的实例,叫DNAT,因为进来的目标地址是公网IP地址,它是不可以和内部的实例通信的,所以要转化目标地址为私网IP地址,转换后就可以和公司内部网络通信了

  • vlan网络通过VLANID进行二层网络的隔离,具有相同的VLANID的内部实例实现内部数据通信,不同的VLANID要经过三层网络协议转发,但是VLAN的个数是一个最大的弊端,最大支持4096个

  • vxlan和gre是一种网络封装协议,GRE是通过IP进行传输,vxlan是通过udp包进行的数据传输(它是不安全的),gre和vxlan数据包在流出节点之前会打上相应的tages,然后数据在进入节点内部的虚拟网络是会剥去相应的tages

  • vxlan、gre在数据流入外部网络必须有路由器才能实现,而且租户想要访问外部网络是需要路由器使内部网络和外部网络互联,通过nat技术实现,也就是为什么租户需要分配一个浮动地址的原因

组网模型
(1)local网络
local网络具有以下特点

  • 不具备vlan特性,不能对二层网络进行隔离
  • 同一个local网络的虚拟机实例会连接到相同的虚拟交换机上,instance之间可以通信
  • 虚拟交换机没有绑定任何物理网卡,无法与宿主机之外的网络通信

(2)flat网络
flat组网模型不支持vlan,属于扁平化的网络模型

  • flat网络直接连接虚拟机和外部网络
  • flat网络连接路由器和外部网络

(3)vlan网络
OpenStack通过vlan网络解决了多租户之间的网络隔离问题
vlan网络存在的缺点

  • vlan的数量限制:4096个vlan数量不能满足大规模云计算数据中心的需求;
  • 物理网络基础设施的限制,基于IP子网的区域划分限制了需要二层网络连通性的应用负载部署;
  • TOR交换机MAC表耗尽,虚拟化以及节点间过多的流量导致更多的MAC表项

(4)vxlan网络
vxlan网络使用的是隧道技术,是目前OpenStack广泛使用的网络技术。相比于vlan模型有以下改进:

  • 租户数量从4K增加到16M;
  • 租户内部通信可以跨越任意IP网络,支持虚拟机任意迁移;
  • 一般来说,每个租户逻辑上都有一个网关实例,IP地址可以在租户之间进行复用;
  • 能够结合SDN技术对流量进行优化

vxlan网络是在传统的IP网络中传输以太网数据帧。主要涉及以下几个概念:

  • VTEP(VXLANN Tunnel End Point,简称VTEP):VXLAN隧道的端点,用于VXLAN报文的封装和解封装。类似于IPsecVPN中的加密点。传统的以太网帧在发送VTEP端将封装的VXLAN、UDP、IP以及以太网头部。而接受VTEP端将数据解封装。VXLAN报文中源IP地址为本节点的VTEP地址,VXLAN报文中目的IP地址为对短接点的VTEP地址,一堆VTEP地址就对应着一个VXLAN隧道。
  • VNI(VXLAN Network Identifier,简称VNI):用来标识一个VXLAN段,在VXLAN网络中,通过VNI标识一个租户,类似vlan网络中的vlan ID。不同VXLAN段的虚拟机之间不能直接二层相互通信。VNI由24比特组成,支持多达16M的用户

OpenStack详解——纯理论相关推荐

  1. PID详解1(理论+整定方法)

    PID详解(理论+应用) ~~~~    最近研究智能小车这个方面,发现这个课题貌似已经被研究透了,仅仅在CSDN中就能搜索到无数的相关博文.但我查看一些博文的时候,隐隐感觉出作者君似乎也仅仅处于似懂 ...

  2. python 自动化-Python API 自动化实战详解(纯代码)

    主要讲如何在公司利用Python 搞API自动化. 1.分层设计思路 dataPool :数据池层,里面有我们需要的各种数据,包括一些公共数据等 config :基础配置 tools : 工具层 co ...

  3. openstack详解(十七)——openstack Nova其他配置

    今天继续给大家介绍Linux运维相关知识,本文主要内容是openstack Nova其他配置. 一.Nova Keystone配置 在上文openstack详解(十六)--openstack Nova ...

  4. openstack详解(十八)——Nova服务启动与服务创建

    今天继续给大家介绍Linux运维相关知识,本文主要内容是Nova服务启动与服务创建. 一.Nova服务启动 在上文openstack详解(十七)--openstack Nova其他配置中,我们完成了N ...

  5. 万字长文的Redis五种数据结构详解(理论+实战),建议收藏。

    本文脑图 前言 Redis是基于c语言编写的开源非关系型内存数据库,可以用作数据库.缓存.消息中间件,这么优秀的东西一定要一点一点的吃透它. 关于Redis的文章之前也写过三篇,阅读量和读者的反映都还 ...

  6. 大数据平台作业调度系统详解-理论篇

    大数据开发平台的核心组件之一:作业调度系统. 作业调度系统是一个相对复杂的系统,涉及的内容繁杂,针对的场景多种多样,实现的方案千差万别,是一个需要理论和实践并重的系统. 本文先从大的场景划分的角度对市 ...

  7. 【diffusion】扩散模型详解!理论+代码

    0.项目视频详解 视频教程见B站https://www.bilibili.com/video/BV1e8411a7mz 1.diffusion模型理论(推导出损失函数) 1.1.背景 随着人工智能在图 ...

  8. 云计算OpenStack详解

    一.OpenStack简介 1.OpenStack发展历程 2002年,美国著名的电商公司亚⻢逊(Amazon)干了一件"不务正业"的事.他们向客户推出了一项全新的业务--包括存储 ...

  9. 详解DNS(理论篇)

    对于 DNS(Domain Name System) 大家肯定不陌生,不就是用来将一个网站的域名转换为对应的IP吗.当我们发现可以上QQ但不能浏览网页时,我们会想到可能是域名服务器挂掉了:当我们用别人 ...

最新文章

  1. 南京超过广州!4 月程序员工资统计出炉,平均 14596 元
  2. 【Spring注解系列09】Spring初始化和销毁接口-InitializingBean与DisposableBean
  3. Storm【实践系列-如何写一个爬虫】 - ParserBolt
  4. Android 开发笔记___drawable
  5. Android-Socket的最基础实现以及遇见在2.3可用4.3不可用的解决方法
  6. 关于计算机人工智能的知识,《计算机科学导论》人工智能基础知识
  7. 模仿qq空间或朋友圈发布动态、评论动态、回复评论、删除动态或评论的功能(下)(核心部分)...
  8. Bada学习-应用模块
  9. 计算机数据计量单位换算
  10. 沙耶の唄(沙耶之歌)游戏全攻略
  11. SAS,软件使用中reg报错/gplot错误的解决方法。
  12. 【Apollo 6.0项目实战】Perception模块
  13. UDP/TCP实时传输图像
  14. prometheus监控常用告警规则
  15. kali下一句话升级metasploit
  16. 抖音小店入驻精选联盟有什么条件?精选联盟添加商品操作流程分享
  17. 如何用纯 CSS 实现优惠券效果
  18. sql not like 数据遗漏
  19. 【SpringBoot】十四、常见注解(场景及源码)
  20. PTA 盲盒包装流水线 (25 分)

热门文章

  1. hutool 解读 (一)—— 类型转换
  2. poj 1456 Supermarket (贪心, 并查集)
  3. P1847 轰炸II
  4. Ansible第一章:ansible的安装及部署
  5. PCF8591芯片以及AD学习(一)
  6. Word论文中设置正文中的引用参考文献 按住Ctrl键+单击鼠标右键 实现跳转到论文参考文献的对应位置
  7. 如何看pg数据库版本号_查看pg数据库版本
  8. java pde_使用PDE求解器求解PDE的高初始值u
  9. Apex启动提示failed to creategamewindow分辨率问题
  10. 转载:打印插件LODOP Vue中的使用