查看原文
其他

OpenStack Train版本新特性大全及快速安装|万字长文

祝祥 翻译整理 新钛云服 2023-07-25

前言


概述

SUSE ,OpenStack基金会 的白金会员,可能已经离开了开源的基础架构即服务(IaaS) OpenStack云,但是该项目将随着即将发布的第20版OpenStack:Train,继续向前发展。


这是因为尽管SUSE可能不再发现OpenStack 有利可图,但其他人发现它对他们和他们的客户依然很友好。OpenStack基金会首席运营官Mark Collier在一份声明中说:“ OpenStack是市场上用于私有云中的容器,VM和裸机的开源基础架构的领先选择。”


“展望2022年,像451 Research 这样的市场观察家将会看到OpenStack产品和服务的新兴市场为77亿美元,应用容器的市场为43亿美元,” Collier继续说道。“随着整个开源云市场继续朝着八位数的收入及更高的方向前进,很明显,OpenStack和应用容器市场正在齐头并进。”


不仅仅是在黑暗中吹口哨的科利尔。尽管有些人认为OpenStack 作为Kubernetes 的重要组成部分正在逐渐被Kubernetes 取代,但两者实际上可以很好地协同工作。OpenStack 最近的用户调查 发现:“ Kubernetes仍然是用于管理OpenStack应用程序的容器和PaaS工具中的顶级框架。OpenStack和Kubernetes越来越多地作为补充技术部署,尤其是在多云场景中。”


这是有道理的。Kubernetes通常在虚拟机(VM)上运行,而OpenStack是最受欢迎的面向VM的IaaS。


OpenStack用户还重视不受公共云供应商锁定的影响。它有83%的用户转向它,因为它使他们摆脱了对单个公共云的过多依赖。实际上,OpenStack用户经常依赖于公共云,例如Amazon Web Services(AWS)(44%),Microsoft Azure(28%)或Google Compute Engine(GCP)(24%)。平均用户说他们的基础架构中有58%是由OpenStack驱动的。


此外,某些用户可能看不到OpenStack的影响力的一个原因是,至少有一半的OpenStack部署在中国。那里,华为 (占28%)和EasyStack (占22%)占部署的50%。在其市场之外,占20%的Red Hat ,占16%的Canonical 5%的Mirantis 是主导者。SUSE(3%)与其他多个捆绑在一起。


因此,OpenStack继续向前发展,估计年增长率为20%。它目前为超过75个公共云数据中心和数千个私有云提供动力,规模超过1000万个计算核心。


核心新特性

为了保持这种进步,最广泛部署的开源云基础架构软件的第20版Train将在10月16日发布。它具有三个方面的改进:


增强的安全性和数据保护 

●支持软件RAID:具有Ironic 裸机服务可保护服务免受磁盘故障的影响。欧洲核研究组织欧洲核子研究组织(CERN)领导了此功能的上游开发,并且已经将该功能在超过1000个节点上投入生产。
●基于硬件的加密:
Nova 是OpenStack的计算功能, 其新框架支持对guest存储器进行基于硬件的加密,以保护用户免遭攻击者或流氓管理员在使用libvirt计算驱动程序时窥探其工作负载。此功能对于多租户环境和具有可公开访问的硬件的环境很有用。
●数据保护流程:
Karbor 为检查,还原,计划和触发操作添加了事件通知。此功能允许用户使用位于根磁盘上的新添加的数据备份映像引导服务器。


增加了对AI /机器学习的加速器支持

  • 加速器生命周期管理:在Cyborg(以前是Nomad) 项目中,Cyborg-Nova交互规范创建了一个蓝图,用于使用GPU等加速器启动和管理VM。


改进的资源管理和跟踪

  • Train版本完成了Placement功能到独立服务的过渡。这使您能够更快地启动Apache,nginx或其他支持Web服务器网关接口的Web服务器。在Train中,服务响应时间比早期Stein版本的16.9秒降低了0.7秒。


综上所述,很明显,OpenStack仍然存在,良好且仍在不断完善。


代码贡献

当前Train版本的代码贡献度图如下:

这只代表了当前2019年10月16日的代码贡献图,具体请见链接:

https://www.stackalytics.com/?project_type=all。


Train版本发布新特性大全


Blazar-资源预订服务

Blazar的目标是在OpenStack中为虚拟(实例,卷等)和物理(主机,存储等)的不同资源类型提供资源预留的能力。


Note:

  • 增加了对全局请求ID的支持,该ID可用于跨多个OpenStack服务跟踪请求。

  • 向v1 API添加了对微版本的支持。

  • 完成了Stein中作为预览引入的浮动IP保留功能的实现。


Cinder-块存储服务

Cinder是openstack中提供块存储服务的组件,主要是为虚拟机实例提供虚拟磁盘。


Note:

  • 许多驱动程序增加了对新功能的支持,例如 multi-attach和consistency groups。

  • 将qcow2镜像上传到Glance后,现在可以进行压缩了。

  • 团队致力于进行大量错误修复和可用性改进。

  • Cinder现在具有升级检查,可在升级到Train时运行升级检查,以检查是否存在兼容性问题。


Cloudkitty-计费服务

CloudKitty是OpenStack的计费组件。其目标是处理来自不同监控指标后端的数据并进行计费规则创建。它的作用是将OpenStack的原始指标与提供商的计费系统之间进行调整以达到费用核算目的。


Note:

  • 引入了v2 API,以及五个新的endpoint。现在标记为EXPERIMENTAL。它的endpoint支持时区,旨在比v1端点更通用,更高效。

  • Prometheus提取方式已添加。它允许从Prometheus进行动态发现,并打算与Prometheus一起使用。

  • 处理器的容错性和性能已得到改善。现在,每个处理器都会产生多个工作进程,如果出现故障,则会重新启动这些工作进程。

  • 引入了适用于Elasticsearch的v2存储驱动程序。现在标记为EXPERIMENTAL。


Cyborg-硬件加速生命周期管理

Cyborg提供加速器的通用管理框架(FPGA,GPU,SoC,NVMe SSD,DPDK / SPDK,eBPF / XDP…)


Note:

  • 合并了Cyborg-Nova交互规范,最终目标蓝图是采用加速器启动和管理VMs。。< https://github.com/openstack/nova-specs/blob/master/specs/train/approved/nova-cyborg-interaction.rst >

  • Cyborg API更新为版本v2,其中包括对Nova交互的支持。用户最终可以使用v2 API创建/删除设备配置文件,以及创建/绑定/取消绑定/删除加速器请求(ARQ)。

  • 添加了新的Cyborg驱动程序(Ascend),并改进了现有驱动程序(Intel FPGA,GPU)。

  • 创建了tempest CI框架,该框架可与当今的模拟驱动程序一起使用,并与将来的真实硬件一起使用。

  • 启用了Python 3测试并修复了问题,以支持Train。


Designate-DNS服务

Designate提供了DNSaaS(DNS即服务)的功能,其目标就是要赋予OpenStack提供这种云域名系统的能力,云服务商可以使用Designate就能够很容易建造一个云域名管理系统来托管租户的公有域名。


Note:

  • 删除旧的不推荐使用的代码,例如Pool Manager和旧的Power DNS驱动程序,以确保使用者的复杂性降低。(在Train版本中已删除了所有弃用警告的95%)

  • 删除了V1 API代码。(以前默认情况下已禁用)

  • 对API控制平面和DNS数据平面的完全IPv6支持。

  • 审核日志以确保日志消息和日志的数量合理。

  • 添加了100多个测试,并且代码覆盖率提高了5-6%。

  • 到目前为止,这是最新版本中最活跃的项目,在该版本项目周期中,更改363个文件,插入12894(+),删除9564(-)。

  • 周期MVP-Erik Olof Gunnar Andersson < eandersson@blizzard.com  > 178个提交中的66个。

  • 是具有Python 2.7支持的最新版本。


Glance-镜像服务

Glance提供服务和相关的库来存储,浏览,共享,分发和管理可引导磁盘映像。同时也保存与之相关联的元数据。


Note:

  • Images API v2.9已升级为最新版本,并以2.7和2.8标记为SUPPORTED。仅当配置了多存储时,2.8才会显示在版本列表中。

  • Glance多后端镜像存储功能已稳定。

  • glance-cache-manage不再依赖于glance-regstry,而是直接与glance-api通信。

  • 现在,无须添加cron定时任务,通过glance-api就可以将缓存预取作为定期任务来完成。

  • 在glance,glance_store和python-glanceclient中完成的各种错误修复。


Horizon-图形化管理

Horizon为所有OpenStack服务提供可扩展的,基于Web的统一用户界面。


Note:

  • 现在支持cinder卷的multi-attach。

  • Horizon现在支持可选的自动生成Kubernetes配置文件的界面功能。

  • 当前版本是支持python 2.7和Django 1.11的最新版本。


Ironic-裸机服务

Ironic管理和配置物理机,并以安全和容错的方式进行。


Note:

  • 对构建软件RAID的 基本支持。

  • 支持Redfish硬件类型的虚拟介质启动。

  • 硬件sensor数据收集方面的改进。

  • 提供新工具构建ramdisk映像:python-agent-builder 。

  • 修复与改进Ansible部署脚本。


Karbor-数据保护即服务

Karbor让各个厂商的数据保护软件通过标准接口接入OpenStack,为OpenStack提供增强的备份、复制、迁移等数据保护即服务(Data Protection as a Service)能力,Karbor致力于解决虚拟机备份难、无标准备份的接口的现状。


Note:

  • 为检查,还原,计划和触发操作添加了事件通知。

  • 允许用户使用跟磁盘的数据备份镜像进行引导。


Keystone-身份认证服务

Keytone是OpenStack 框架中负责管理身份验证、服务访问规则和服务令牌功能的组件。提供租户管理,认证授权等功能。


Note:

  • 现在,所有的API在其默认策略中都使用默认的reader,member和admin角色。这意味着与以前的默认策略相比,现在可以创建对keystone API具有更细粒度访问权限的用户。例如,可以创建一个只能访问Keystone的GET API的“auditor”用户。请注意,根据其他OpenStack服务的默认和覆盖策略,此类用户可能仍可以访问其他服务的不安全或破坏性API。

  • 现在,所有适用的Keystone API都将系统范围作为策略目标来支持。这意味着现在可以在keystone.conf中设置[oslo_policy]/enforce_scope为true。使用默认策略,它将允许keystone区分特定项目的请求和全局操作的请求。这样可以安全地授予管理员对特定Keystone项目的访问权限,而无需授予管理员对Keystone所有API的访问权限,但是请注意,根据其他OpenStack服务的默认策略和覆盖策略,在项目范围之外的其他服务,项目管理员可能仍具有管理员级别的特权。

  • 现在可以使用用户提供的ID创建Keystone域,从而可以预测在该域内创建的用户的所有ID。由于不再需要明确同步域和用户ID,这使得跨多个站点扩展云部署变得更加容易。

  • 现在,应用程序凭据支持访问规则,这是用户提供的OpenStack API请求列表,允许使用应用程序凭据。此级别的访问控制是对通过策略规则管理的传统基于角色的访问控制的补充。

  • 现在可以使Keystone role,projects和domains变得不可变,这样就不会意外修改或删除某些重要资源,例如默认角色或服务项目,通过Keystone role,projects和domains的资源选项进行管理。现在,该命令允许部署者在部署时选择将其创建为不可变的默认角色,这将在将来成为默认行为。现在可以通过资源更新使运行前存在的角色不可变。使用keystone-manage bootstrap命令进行更新操作。


Kolla-容器部署服务

Kolla提供用于生产环境OpenStack云的容器化部署工具。


Note:

  • Debian和Ubuntu系统中可以使用Python 3 版本的容器镜像。

  • 介绍了高可用组件Masakari和无服务组件Qinling的容器镜像与ansible编排脚本。


Kuryr-k8s网络管理服务

Kuryr主要目标是通过该项目来整合 OpenStack Kubernetes 的网络 。该项目在 Kubernetes 中实作了原生 Neutron-based 的网络,因此使用 Kuryr-Kubernetes 可以让你的 OpenStack VM 与 Kubernetes Pods 能够选择在同一个子网上运作,并且能够使用 Neutron 的 L3 与 Security Group 来对网络进行路由,以及阻挡特定来源 Port。


Note:

  • 对Kubernetes网络策略的支持已经稳定。

  • 使用Go重写Kuryr CNI插件,以使其更易于部署。

  • 支持DPDK和SR-IOV的多项增强。

  • 支持标记由Kuryr创建的所有Neutron和Octavia资源。


Manila-共享文件系统服务

Manila为多租户云环境中的共享文件系统的管理提供一套服务,类似于OpenStack通过Cinder项目提供基于块的存储管理的方式。


Note:

  • 现在可以使用多个子网创建Manila共享网络,这些子网可能位于不同的可用区域中。

  • 当DHSS = True时,NetApp后端添加了对复制的支持。

  • GlusterFS后端增加了对扩展/缩小目录的支持。

  • 添加了支持NFS和CIFS共享的Infortrend驱动程序。

  • CephFS后端现在支持IPv6和访问列表。

  • 添加了支持NFS和CIFS共享的Inspur Instorage驱动程序。

  • 添加了对修改共享类型名称,描述和/或公共访问字段的支持。


Mistral-工作流服务

Mistral即Workflow As a Service,提供一种简单的基于YAML的语言来编写工作流(任务和转换规则),并提供一种服务,该服务允许对其进行上传,修改,大规模运行并以高度可用的方式运行,管理和监视工作流执行状态以及各个任务的状态。


Note:

  • 将性能提高大约40%。(取决于工作流程)

  • 改进的事件通知机制。

  • 在“advanced publishing”上完成了剩余的工作。

  • 工作流执行报告现在包含任务的“ retry_count”。

  • 完全准备放弃py27。

  • 许多错误修正和小改进。(包括horizon)


Neutron-网络服务

Neutron主要就是用于网络虚拟化,对外提供Naas(Network as a Service)服务,可以提供多租户隔离、多2层代理支持、3层转发、负载均衡、隧道支持等功能。


Note:

  • OVN现在可以发送ICMP“Fragmention Needed”数据包,从而使租户网络上使用 jumbo frames的VM无需任何额外的配置即可访问外部网络。

  • 通过更好地调整控制器中的工作方式,提高了事件处理性能。尤其是在进行批量端口绑定时,这有很大改进。

  • 当不同的子网pool具有同一地址范围时,放宽了禁止从同一网络上的不同地址池分配子网的约束。只要子网pool关联相同的地址,当在网络上创建多个子网时,现在就可以从不同的子网pool创建子网。如果不使用地址范围,则ip_version仍必须从同一子网池中分配同一网络上具有相同子网的子网。

  • 已为Neutron路由器实现了一个新的API,即Extraroute-atomic。此扩展使用户可以向路由器路由表添加或删除单个条目,而不必将整个表作为一个整体进行更新。

  • 增加了对L3 conntrack helpers的支持。用户现在可以配置要为路由器设置的conntrack helpers目标规则。这是通过将conntrack_helper子资源与路由器相关联来实现的。


Nova-计算服务

Nova是OpenStack云中的计算组织控制器,提供对可计算资源(包括裸机,虚拟机和容器)的大规模可扩展的按需自助访问。


Note:

  • 使用libvirt计算驱动程序时,对具有 NUMA topology, pinned CPUs  和 huge pages 服务器的热迁移支持 。

  • 使用libvirt计算驱动程序时,对带有SR-IOV端口的 服务器热迁移支持 。

  • 支持冷迁移和调整大小的服务器,同时附带网络端口的 QOS  。

  • 调度程序的改进,可以更智能地过滤 Placement服务的结果 。

  • 改进的multi-cell,可以 使用Placement服务和API数据库计算配额使用情况 。

  • 一个新的框架支持对guest存储器进行基于硬件的加密,以保护用户免受使用libvirt计算驱动程序时攻击或流氓管理员监视其工作负载的侵害。当前仅对AMD SEV(安全加密虚拟化) 提供基本支持 。

  • 针对管理员/操作员和最终用户的API改进 。

  • 改进了操作工具  ,可用于存档数据库和修复Placement中的实例资源分配。

  • 在外部节点重新启动电源 ,改善了与裸机服务的协调 。

  • 使用libvirt计算驱动程序时,支持 VPMEM(虚拟持久性内存) 。与DRAM相比,它以更低的成本和更大的容量提供了整个电源循环中的数据持久性,尤其有利于HPC和内存数据库,例如redis,rocksdb,oracle,SAP HANA和Aerospike。


Octavia-负载均衡服务

Octavia通过管理一系列amphora(vm、containers, or bare metal servers)来完成负载均衡的功能。其框架结构也是一个典型的openstack项目框架。api作为项目入口,rpc来作为组内模块之间通信的中介,controller及数据库来保证数据存储及一致性,使用功能实现使用driver来保证能够实现兼容性。


Note:

  • 现在可以将访问控制列表(ACL)应用于负载平衡器侦听器。每个端口可以具有允许的源地址列表。

  • Octavia现在支持Amphora日志吐出。操作员可以为Amphora管理日志。

  • 现在可以使用Cinder卷启动Amphorae。

  • 已对Amphora镜像进行了优化,以减少镜像大小和内存消耗。


OpenStack Ansible-用于部署的Ansible的roles和playbooks

OpenStack Ansible是使用Ansible从源代码部署OpenStack,使其具有可伸缩性,同时还易于操作,升级和扩展。


Note:

  • 服务的venv默认使用Python 3。

  • 新增了murano支持。

  • 在完整的OpenStack-Ansible部署之外,项目变得更加可用。

  • 添加了uwsgi role以统一跨role的uWSGI服务配置。

  • 从rsyslog完全迁移到systemd-journald。

  • 增加了对Ironic多节点部署的支持。

  • 减少了技术复杂度。


Placement-放置服务

Placement跟踪云资源清单和使用情况,以帮助其他服务有效地管理和分配其资源。


Note:

  • Train是第一个版本,与Nova分开,独立进行部署。

  • 广泛的基准测试和性能分析已大大提高了placement服务的性能,特别是在具有大量资源提供者和高并发性的环境中。

  • 增加了对禁止聚合的支持,这允许将资源提供者组仅用于特定目的,例如为许可的工作负载保留一组计算节点。

  • 添加了一套功能,这些功能组合在一起,可以定位具有复杂树的候选提供者,这些树为NUMA布局,多个设备和网络建模,这些树需要成员之间的亲和度和分组。这些功能将有助于在云中启用NFV和其他高性能工作负载。


Senlin-集群服务

Senlin进一步优化解决OpenStack云中的资源池管理问题,以管理其他OpenStack服务公开的同类对象组。


Note:

  • 新增了对webhook v2的支持:以前,webhook API引入了microversion 1.10,以允许调用者将webbrook调用中的数据传递给主体。

  • 支持的管理员用户可以查看任何群集配置文件的详细信息。

  • 允许群集删除操作分离策略并删除要删除的群集的接收者。


Storlets-计算内部对象存储服务

Storlets扩展了Swift,能够以安全和隔离的方式在数据附近运行用户定义的计算(称为storlets)。一个storlets是一个编译和打包的代码(例如.jar文件),可以作为任何其他对象上传到Swift。一旦上传,Swift中的数据对象就可以调用storlet。


Note:

  • Python 3支持正在添加中。

  • 各种代码改进。


Swift-对象存储服务

Swift是分布式对象存储服务,Swift 构筑在比较便宜的标准硬件存储基础设施之上,无需采用 RAID(磁盘冗余阵列),通过在软件层面引入一致性散列技术和数据冗余性,牺牲一定程度的数据一致性来达到高可用性和可伸缩性,支持多租户模式、容器和对象读写操作,适合解决互联网的应用场景下非结构化数据存储问题。


Note:

  • Swift现在可以在Python 3下运行。

  • 日志格式现在更加可配置,并且包括对匿名化的支持。

  • Swift-all-in-one Docker镜像现已构建并发布到https://hub.docker.com/r/openstackswift/saio。


Tacker-NFV编排服务

Tacker网络功能虚拟化Network Function Virtualization, 主要利用通用x86硬件平台和标准的IT虚拟化技术, 来做软硬件解耦合和功能抽象。这样做可以解决运营商目前碰到的一些问题, 如: 专用设备成本高昂, 厂商锁定, 资源分配、部署、调度不够灵活。随着NFV的使用, 新业务可以快速开发和部署, 并能基于实际业务需求进行自动部署、弹性伸缩、故障隔离、并能大量节约成本和风险。


Note:

  • 添加了对强制删除VNF和网络服务实例的支持。

  • 添加了对VNF软件包的部分支持。


Trove-数据库服务

Trove是openstack为用户提供的数据库即服务(DBaaS)。所谓DBaaS,即trove既具有数据库管理的功能,又具有云计算的优势。可以"按需"获得数据库服务器,配置所获得的数据库服务器或者数据库服务器集群,对数据库服务器或者数据库服务器集群进行自动化管理,根据数据库的负载让数据库服务器集群动态伸缩。


Note:

  • 在生产环境中强烈建议对Service Tenant Deployment模型进行改进。允许云管理员为trove实例定义管理资源,例如密钥对,安全组,网络等。

  • 对于云管理员或开发人员来说,使用trovestack脚本创建trove guest镜像变得容易得多。

  • 用户可以通过限制源IP地址访问数据库的方式向公众公开trove实例。


Vitrage-RCA(根本原因分析)服务

Vitrage用来组织、分析和扩展openstack的告警和事件,对问题产生的根本原因进行推导,为系统产生推导后的告警或者设置推导后的状态。


Note:

  • 为Kapacitor添加新的数据源。

  • 为Monasca添加新的数据源。

  • 添加Vitrage状态和模板版本的新API。

  • 支持使用Alembic工具升级Vitrage的数据库。


Watcher-基础结构优化服务

Watcher提供一个完整的优化循环链:从度量接收器,到优化处理器和操作计划应用程序。Watcher的目标在于提供一个强大的框架,可以实现广泛的云优化目标,包括减少数据中心运营成本,通过智能虚拟机迁移提高系统性能,提高能源效率等。此外,Watcher可供用户定制丰富的资源优化目标与策略算法。


Note:

  • 在审核中添加了“force”字段。用户可以设置–force以在启动审核时启用新选项。

  • Grafana已添加为可用于收集指标的数据源。

  • 从Placement获取数据以改善Watcher计算数据模型。

  • 添加了显示数据模型API。

  • 添加了节点资源合并策略。


Zun-容器服务

ZUN是Openstack中提供容器管理服务的组件,它在OpenStack项目中负责提供容器服务,旨在通过与Neutron、Cinder、Keystone以及其它核心OpenStack服务相集成以实现容器的快速普及。通过这种方式,OpenStack的原有网络、存储以及身份验证工具将全部适用于容器体系,从而确保容器能够满足安全与合规性要求。


Note:

  • Zun计算代理将本地资源报告给Placement API。

  • Zun调度程序会从展示位置API和声明容器分配中获取分配候选对象。


快速安装

本处以CentOS7.6 为Base镜像,通过RDO快速安装OpenStack Train版本。具体步骤如下:


1. 更新操作系统至最新版本

yum update -y


2. 安装openstack所依赖的yum源

yum install -y centos-release-openstack-train


 如果系统无法访问互联网,请跳过该步骤,然后手动配置内部openstack train版本的yum源

3. 安装rdo packstack工具

yum install -y openstack-packstack openstack-packstack-puppet


4. allinone快速安装

packstack --allinone


预计30min到60min能够安装完成,具体情况根据网速而定,安装完成后会生成packstack-answers文件以及keystonerc_admin等认证文件。


该方式仅仅用于快速测试openstack功能以及版本,Stein版本以后默认使用的是OVN,网络类型为mgre。如需要调整,可以修改answers应答文件进行安装。


本文整理参考自以下链接:

https://www.zdnet.com/article/the-openstack-train-keeps-chugging-on/

https://releases.openstack.org/train/highlights.html



 

上海技术活动

爱库存+爱乐奇+齐家网

案例+原理+实践

大神讲透混合云安全


了解新钛云服

新钛云服正式获批工信部ISP/IDC(含互联网资源协作)牌照

深耕专业,矗立鳌头,新钛云服获千万Pre-A轮融资

原电讯盈科中国区副总裁加入新钛云服「附专访」

新钛云服,打造最专业的Cloud MSP+,做企业业务和云之间的桥梁

新钛云服一周年,完成两轮融资,服务五十多家客户

上海某仓储物流电子商务公司混合云解决方案


新钛云服出品的部分精品技术干货

国内主流公有云VPC使用对比及总结

万字长文:云架构设计原则|附PDF下载

刚刚,OpenStack 第 19 个版本来了,附28项特性详细解读!

Ceph OSD故障排除|万字经验总结

如何更好的选择AWS EC2

七个用于Docker和Kubernetes防护的安全工具

运维人的终身成长,从清单管理开始|万字长文!

OpenStack与ZStack深度对比:架构、部署、计算存储与网络、运维监控等

什么是云原生?

IT混合云战略:是什么、为什么,如何构建?

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存