OpenStack踩坑之路(3)
慧极必伤,情深不寿,强极则辱,谦谦君子,温润如玉。——《书剑恩仇录》OpenStack计算服务搭建nova服务概述使用OpenStack Compute来托管和管理云计算系统。OpenStack Compute是基础架构即服务(IaaS)系统的重要组成部分。主要模块是用Python实现的。OpenStack Compute与OpenStack Identity进行交互以进行身份验证; 用
微信公众号:运维开发故事,作者:wanger
OpenStack计算服务搭建
nova服务概述
使用OpenStack Compute来托管和管理云计算系统。OpenStack Compute是基础架构即服务(IaaS)系统的重要组成部分。主要模块是用Python实现的。
OpenStack Compute与OpenStack Identity进行交互以进行身份验证; 用于磁盘和服务器映像的OpenStack映像服务; 和用于用户和管理界面的OpenStack Dashboard。图像访问受到项目和用户的限制; 每个项目的限额是有限的(例如,实例的数量)。OpenStack Compute可以在标准硬件上水平扩展,并下载映像以启动实例。
OpenStack Compute包含以下区域及其组件:
-
nova-api
服务接受并响应最终用户计算API调用。该服务支持OpenStack Compute API,Amazon EC2 API以及特殊用户执行管理操作的特殊管理API。它执行一些策略并启动大多数编排活动,例如运行实例。
-
nova-api-metadata
服务接受来自实例的元数据请求。
nova-api-metadata
通常在nova-network
安装多主机模式下运行时使用该服务。有关详细信息,请参阅 计算管理员指南中的元数据服务。 -
nova-compute
服务通过管理程序API创建和终止虚拟机实例的工作守护程序。例如:
处理相当复杂。基本上,守护进程接受来自队列的动作并执行一系列系统命令,例如启动KVM实例并更新其在数据库中的状态。
-
用于XenServer / XCP的XenAPI
-
KVM或QEMU的libvirt
-
适用于VMware的VMwareAPI
-
nova-placement-api
服务跟踪每个提供商的库存和使用情况。有关详情,请参阅Placement API。
-
nova-scheduler
服务从队列中获取虚拟机实例请求,并确定它在哪个计算服务器主机上运行。
-
nova-conductor
模调解
nova-compute
服务和数据库之间的交互。它消除了由nova-compute
服务直接访问云数据库的情况 。该nova-conductor
模块水平缩放。但是,请勿将其部署到nova-compute
运行服务的节点上。有关更多信息,请参阅配置选项中的conductor
部分 。 -
nova-consoleauth
守护进程为控制台代理提供的用户授权令牌。见
nova-novncproxy
和nova-xvpvncproxy
。此服务必须运行以使控制台代理正常工作。您可以在群集配置中针对单个nova-consoleauth服务运行任一类型的代理。有关信息,请参阅关于nova-consoleauth。 -
nova-novncproxy
守护进程提供通过VNC连接访问正在运行的实例的代理。支持基于浏览器的novnc客户端。
-
nova-spicehtml5proxy
守护进程提供通过SPICE连接访问正在运行的实例的代理。支持基于浏览器的HTML5客户端。
-
nova-xvpvncproxy
守护进程提供通过VNC连接访问正在运行的实例的代理。支持OpenStack特定的Java客户端。
-
队列
守护进程之间传递消息的中心集线器。通常用RabbitMQ实现 ,也可以用另一个AMQP消息队列实现,例如ZeroMQ。
-
SQL数据库
存储云基础架构的大部分构建时间和运行时状态,其中包括:
理论上,OpenStack Compute可以支持SQLAlchemy支持的任何数据库。通用数据库是用于测试和开发工作的SQLite3,MySQL,MariaDB和PostgreSQL。
-
可用的实例类型
-
正在使用的实例
-
可用的网络
-
项目
A.在控制节点安装nova服务
1.创建数据库并授权
进入数据库
[root@controller ~]# mysql -uroot -p
创建nova_api数据库
MariaDB [(none)]> CREATE DATABASE nova_api;
创建nova数据库
MariaDB [(none)]> CREATE DATABASE nova;
创建nova_ce110数据库
MariaDB [(none)]> CREATE DATABASE nova_cell0;
对nova_api数据库进行用户授权
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.*TO ‘nova’@‘localhost’ IDENTIFIED BY ‘nova’
MariaDB [mysql]> GRANT ALL PRIVILEGES ON nova_api.*TO ‘nova’@’%’ IDENTIFIED BY ‘nova’;
对nova数据库进行用户授权
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO’nova’@‘localhost’ IDENTIFIED BY ‘nova’;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO’nova’@’%’ IDENTIFIED BY ‘nova’;
对nova_ce110数据库进行用户授权
MariaDB [mysql]> GRANT ALL PRIVILEGES ON nova_ce110.*TO ‘nova’@‘localhost’ IDENTIFIED BY ‘nova’;
MariaDB [(none)]> GRANT ALL PRIVILEGES ONnova_ce110.* TO ‘nova’@’%’ IDENTIFIED BY ‘nova’;
2.加载环境变量
[root@controller ~]# . admin-openrc
3.创建计算服务凭据
创建nova用户
[root@controller ~]# openstack user create --domaindefault --password-prompt nova
将admin角色添加到nova用户
[root@controller ~]# openstack role add --projectservice --user nova admin
创建服务实体
[root@controller ~]# openstack service create --namenova --description “OpenStack Compute” compute
4. 创建计算服务API端点
[root@controller ~]# openstack endpoint create --regionRegionOne compute public http://controller:8774/v2.1
[root@controller ~]# openstack endpoint create --regionRegionOne compute internal http://controller:8774/v2.1
[root@controller ~]# openstack endpoint create --regionRegionOne compute admin http://controller:8774/v2.1
5.创建位置服务用户
[root@controller ~]# openstack user create --domaindefault --password-prompt placement
将位置用户添加到具有管理员角色的服务项目中
[root@controller ~]# openstack role add --projectservice --user placement admin
6.在服务目录中创建Placement API条目
[root@controller ~]# openstack service create --nameplacement --description “Placement API” placement
7.创建Placement API服务端点
[root@controller ~]# openstack endpoint create --regionRegionOne placement public http://controller:8778
[root@controller ~]# openstack endpoint create --regionRegionOne placement internal http://controller:8778
[root@controller ~]# openstack endpoint create --regionRegionOne placement admin http://controller:8778
8.安装并配置nova软件
安装nova相关组件
yum install openstack-nova-api openstack-nova-conductoropenstack-nova-console openstack-nova-novncproxy openstack-nova-scheduleropenstack-nova-placement-api -y
编辑/etc/nova/nova.conf文件并完成以下操作:
在该[DEFAULT]部分中,仅启用计算API和元数据API:
enable_apis = osapi_compute,metadata
在[api_database]和[database]部分中,配置数据库访问:
[api_database]
connection = mysql+pymysql://nova:nova@controller/nova_api
[database]
connection = mysql+pymysql://nova:nova@controller/nova
在该[DEFAULT]部分中,配置RabbitMQ消息队列访问
transport_url = rabbit://openstack:openstack@controller
在[api]和[keystone_authtoken]部分中,配置身份服务访问
[api]
auth_strategy = keystone
[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = nova
password = nova
在该[DEFAULT]部分中,将该my_ip选项配置为使用控制器节点的管理接口IP地址:
my_ip = 173.168.16.224
在本[DEFAULT]节中,启用对网络服务的支持:
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver
在本[vnc]节中,将VNC代理配置为使用控制器节点的管理接口IP地址:
[vnc]
enabled = true
vncserver_listen = $my_ip
vncserver_proxyclient_address = $my_ip
在该[glance]部分中,配置ImageService API的位置:
[glance]
api_servers = http://controller:9292
在该[oslo_concurrency]部分中,配置锁定路径
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
在该[placement]部分中,配置PlacementAPI:
[placement]
os_region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://controller:35357/v3
username = placement
password = placement
完整配置如下图所示:
由于软件包bug,您必须启用对PlacementAPI的访问权限,方法是将以下配置添加到 /etc/httpd/conf.d/00-nova-placement-api.conf:
<Directory /usr/bin>
= 2.4>
Require allgranted
<IfVersion< 2.4>
Orderallow,deny
Allow fromall
配置如下图所示:
重启httpd服务
[root@controller ~]#systemctl restart httpd
9.初始化nova数据库
初始化nova_api数据库
[root@controller ~]# su -s /bin/sh -c “nova-manageapi_db sync” nova
注册ce110数据库
[root@controller ~]# su -s /bin/sh -c “nova-managecell_v2 map_cell0” nova
创建ce110的单元格
[root@controller ~]# su -s /bin/sh -c “nova-managecell_v2 create_cell --name=cell1 --verbose” nova
初始化nova数据库,忽略其中的输出信息
[root@controller ~]# su -s /bin/sh -c “nova-managedb sync” nova
验证nova cell0和cell1是否正确注册
[root@controller ~]# nova-manage cell_v2 list_cells
启动计算服务并将其配置为在系统引导时启动
[root@controller ~]# systemctl enable openstack-nova-apiopenstack-nova-consoleauth openstack-nova-scheduler openstack-nova-conductoropenstack-nova-novncproxy
[root@controller ~]# systemctl start openstack-nova-apiopenstack-nova-consoleauth openstack-nova-scheduler openstack-nova-conductoropenstack-nova-novncproxy
B.在计算节点上安装和配置nova服务
1.在计算节点上安装和配置
安装软件包
yum install openstack-nova-compute
注意:这里出现一个报错缺少一个rpm包,某位大佬丢给我一个rpm包地址得以解决
rpm -ivhhttps://repos.fedorapeople.org/repos/openstack/openstack-pike/rdo-release-pike-1.noarch.rpm
编辑/etc/nova/nova.conf文件并完成以下操作:
在该[DEFAULT]部分中,仅启用计算API和元数据API和配置RabbitMQ消息队列访问::
[DEFAULT]
enabled_apis = osapi_compute,metadata
transport_url = rabbit://openstack:openstack@controller
在[api]和[keystone_authtoken]部分中,配置身份服务访问
[api]
auth_strategy = keystone
[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = nova
password = nova
在该[DEFAULT]部分中,配置my_ip选项
my_ip = 173.168.16.225
在本[DEFAULT]节中,启用对网络服务的支持:
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver
在本[vnc]节中,启用并配置远程控制台访问:
[vnc]
enabled = True
vncserver_listen = 0.0.0.0
vncserver_proxyclient_address = $my_ip
novncproxy_base_url = http://controller:6080/vnc_auto.html
在该[glance]部分中,配置ImageService API的位置:
[glance]
api_servers = http://controller:9292
在该[oslo_concurrency]部分中,配置锁定路径:
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
在该[placement]部分中,配置PlacementAPI:
[placement]
os_region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://controller:35357/v3
username = placement
password = placement
完整配置如下图所示:
2.完成安装
egrep -c ‘(vmx|svm)’ /proc/cpuinfo //检查计算节点是否支持虚拟机的硬件加速如果返回值不为0,说明支持,计算节点不支持硬件加速,您必须配置libvirt为使用QEMU而不是KVM
按如下方式编辑文件中的[libvirt]部分/etc/nova/nova.conf:
[libvirt]
virt_type = qemu
启动Compute服务(包括其依赖项)并将其配置为在系统引导时自动启动
[root@computer ~]# systemctl enable libvirtd.serviceopenstack-nova-compute.service
[root@computer ~]# systemctl start libvirtd.serviceopenstack-nova-compute.service
这里出现一个小插曲,防火墙开着,服务一直起不来
3.将计算节点添加到单元数据库¶(在控制节点运行)
加载环境变量
[root@controller ~]# . admin-openrc
确认数据库中是否有计算主机
[root@controller ~]# openstack compute service list–service nova-compute
发现计算主机
[root@controller ~]# su -s /bin/sh -c “nova-managecell_v2 discover_hosts --verbose” nova
当您添加新的计算节点时,您必须在控制器节点上运行以注册这些新的计算节点。或者可以编辑/etc/nova/nova.conf在以下位置设置适当的间隔:
4.验证computer服务的操作(控制节点运行)
加载环境变量
[root@controller ~]# . admin-openrc
列出服务组件以验证每个进程的成功启动和注册
[root@controller ~]# openstack compute service list
列出身份服务中的API端点以验证与身份服务的连接
[root@controller ~]# openstack catalog list
列出Image服务中的图像以验证与Image服务的连接性:
[root@controller ~]# openstack image list
检查cells和placement API是否成功运行:
[root@controller ~]# nova-status upgrade check
至此,nova服务部分已经安装完成了
OpenStack网络服务搭建
neutron服务概述
OpenStack Networking(neutron)允许您创建由其他OpenStack服务管理的接口设备并将其连接到网络。可以实现插件以适应不同的网络设备和软件,为OpenStack架构和部署提供灵活性。
它包含以下组件:
-
neutron-server
接受API请求并将其路由到适当的OpenStack Networking插件以便采取行动。
-
OpenStack Networking插件和代理
插拔端口,创建网络或子网,并提供IP地址。这些插件和代理根据特定云中使用的供应商和技术而有所不同。OpenStack Networking带有用于思科虚拟和物理交换机,NEC OpenFlow产品,Open vSwitch,Linux桥接和VMware NSX产品的插件和代理。
通用代理是L3(第3层),DHCP(动态主机IP寻址)和插件代理。
-
消息队列
大多数OpenStack Networking安装用于在中子服务器和各种代理之间路由信息。还充当存储特定插件的网络状态的数据库。
OpenStack Networking主要与OpenStack Compute进行交互,为其实例提供网络和连接。
A.安装并配置控制器节点
1.配置neutron数据库
进入mariadb数据库
[root@controller ~]# mysql -uroot -p
创建neutron数据库
MariaDB [(none)]> CREATE DATABASE neutron;
创建neutron的授权用户
MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.*TO ‘neutron’@‘localhost’ IDENTIFIED BY ‘neutron’;
MariaDB [(none)]> GRANT ALL PRIVILEGES ON neutron.*TO ‘neutron’@’%’ IDENTIFIED BY ‘neutron’;
2.创建服务凭据
加载环境变量
[root@controller ~]# . admin-openrc
创建neutron用户
[root@controller ~]# openstack user create --domaindefault --password-prompt neutron
将admin角色添加到neutron用户
[root@controller ~]# openstack role add --projectservice --user neutron admin
创建neutron服务实体
[root@controller ~]# openstack service create --nameneutron --description “OpenStack Networking” network
创建网络服务的api端点
[root@controller ~]# openstack endpoint create --regionRegionOne network public http://controller:9696
[root@controller ~]# openstack endpoint create --regionRegionOne network internal http://controller:9696
[root@controller ~]# openstack endpoint create --regionRegionOne network admin http://controller:9696
3.安装并配置neutron网络,这里有两种网络选项,我选择的是提供商网络
在控制节点安装neutron相关组件
[root@controller ~]# yum install openstack-neutronopenstack-neutron-ml2 openstack-neutron-linuxbridge ebtables
编辑/etc/neutron/neutron.conf文件并完成以下操作:
在该[database]部分中,配置数据库访问:
[database]
connection = mysql+pymysql://neutron:neutron@controller/neutron
在本[DEFAULT]节中,启用ModularLayer 2(ML2)插件并禁用其他插件:
core_plugin = ml2
service_plugins = //等号后面什么都不加就是禁用其他插件
在该[DEFAULT]部分中,配置RabbitMQ 消息队列访问:
transport_url = rabbit://openstack:openstack@controller
在[DEFAULT]和[keystone_authtoken]部分中,配置身份服务访问:
[DEFAULT]
auth_strategy = keystone
[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = neutron
在[DEFAULT]和[nova]部分中,配置网络以通知计算网络拓扑更改:
[DEFAULT]
notify_nova_on_port_status_changes = true
notify_nova_on_port_data_changes = true
[nova]
auth_url = http://controller:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = nova
password = nova
在该[oslo_concurrency]部分中,配置锁定路径:
[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
完整配置如下图所示
ML2插件使用Linux桥接机制为实例构建第2层(桥接和交换)虚拟网络基础结构。
编辑/etc/neutron/plugins/ml2/ml2_conf.ini文件并完成以下操作:
在本[ml2]节中,启用flat和VLAN网络:
[ml2]
type_drivers = flat,vlan
在本[ml2]节中,禁用自助服务网络:
tenant_network_types =
在本[ml2]节中,启用Linux桥接机制:
mechanism_drivers = linuxbridge
在该[ml2]部分中,启用端口安全扩展驱动程序:
extension_drivers = port_security
在本[ml2_type_flat]节中,将提供者虚拟网络配置为扁平网络:
[ml2_type_flat]
flat_networks = provider
在本[securitygroup]节中,使用ipset来提高安全组规则的效率:
[securitygroup]
enable_ipset = true
完整配置如下图所示:
Linux网桥代理为实例构建第2层(桥接和交换)虚拟网络基础架构并处理安全组。
编辑/etc/neutron/plugins/ml2/linuxbridge_agent.ini文件并完成以下操作:
在本[linux_bridge]节中,将提供者虚拟网络映射到提供者物理网络接口:
[linux_bridge]
physical_interface_mappings = provider:ens33 //将ens33替换成自己本身的网卡接口
在该[vxlan]部分中,禁用VXLAN覆盖网络:
[vxlan]
enable_vxlan = false
在本[securitygroup]节中,启用安全组并配置Linux网桥iptables防火墙驱动程序:
[securitygroup]
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
完整配置如下图所示:
DHCP代理为虚拟网络提供DHCP服务。
编辑/etc/neutron/dhcp_agent.ini文件并完成以下操作:
在本[DEFAULT]节中,配置Linux网桥接口驱动程序,Dnsmasq DHCP驱动程序,并启用隔离的元数据,以便提供商网络上的实例可以通过网络访问元数据:
[DEFAULT]
interface_driver = linuxbridge
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = true
完整配置如下图所示:
在这里,我们一共修改了四个配置文件,分别是
4.配置元数据代理
元数据代理为实例提供配置信息,例如凭据。
编辑/etc/neutron/metadata_agent.ini文件并完成以下操作:
在该[DEFAULT]部分中,配置元数据主机和共享密钥:
[DEFAULT]
nova_metadata_host = controller
metadata_proxy_shared_secret = neutron
完整配置如下图所示:
5.配置nova使用neutron服务
编辑/etc/nova/nova.conf文件并执行以下操作:
在该[neutron]部分中,配置访问参数,启用元数据代理并配置秘钥:
[neutron]
url = http://controller:9696
auth_url = http://controller:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = neutron
service_metadata_proxy = true
metadata_proxy_shared_secret = neutron
完整配置如下图所示:
6.完成控制节点的neutron安装
网络服务初始化脚本需要/etc/neutron/plugin.ini指向ML2插件配置文件的符号链接/etc/neutron/plugins/ml2/ml2_conf.ini。如果此符号链接不存在,请使用以下命令创建它:
[root@controller ~] ln -s /etc/neutron/plugins/ml2/ml2_conf.ini/etc/neutron/plugin.ini
初始化neutron数据库
[root@controller neutron]# su -s /bin/sh -c"neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file/etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron
这里我同步的时候出现了一个报错,猜想应该是配置问题,结果看了一遍又一遍配置文件没找出来错误,后来谷歌关键字得知我把[database]部分的”connection = mysql+pymysql://neutron:neutron@controller/neutron”写到了[DEFAULT]部分
[root@controller neutron]# mysql -uneutron -pneutron -e"use neutron; show tables;" //查看同步的数据库
重启计算API服务
[root@controller neutron]# systemctl restart openstack-nova-api.service
启动网络服务并将其配置为系统启动时启动
[root@controller ]# systemctl enable neutron-server.service neutron-linuxbridge-agent.serviceneutron-dhcp-agent.service neutron-metadata-agent.service
[root@controller neutron]# systemctl start neutron-server.service neutron-linuxbridge-agent.service neutron-dhcp-agent.serviceneutron-metadata-agent.service
B.在计算节点安装配置neutron
1.安装相关组件
[root@computer ~]# yum installopenstack-neutron-linuxbridge ebtables ipset
2.配置通用组件
网络通用组件配置包括认证机制,消息队列和插件。
编辑/etc/neutron/neutron.conf文件并完成以下操作:
在该[database]部分中,注释掉任何connection选项,因为计算节点不直接访问数据库。
在该[DEFAULT]部分中,配置RabbitMQ 消息队列访问:
[DEFAULT]
transport_url = rabbit://openstack:openstack@controller
在[DEFAULT]和[keystone_authtoken]部分中,配置身份服务访问:
[DEFAULT]
auth_strategy = keystone
[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = neutron
password = neutron
在该[oslo_concurrency]部分中,配置锁定路径:
[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
完整配置如下图所示:
3.配置网络选项
这里与控制器节点选择的相同网络选项,都是提供商网络
Linux网桥代理为实例构建第2层(桥接和交换)虚拟网络基础架构并处理安全组。
编辑/etc/neutron/plugins/ml2/linuxbridge_agent.ini文件并完成以下操作:
在本[linux_bridge]节中,将提供者虚拟网络映射到提供者物理网络接口:
[linux_bridge]
physical_interface_mappings = provider:ens33 //将ens33替换为自己的网卡接口
在该[vxlan]部分中,禁用VXLAN覆盖网络:
[vxlan]
enable_vxlan = false
在本[securitygroup]节中,启用安全组并配置Linux网桥iptables防火墙驱动程序:
[securitygroup]
enable_security_group = true
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
完整配置如下图所示:
4.配置计算服务已使用网络服务
编辑/etc/nova/nova.conf文件并完成以下操作:
在该[neutron]部分中,配置访问参数:
[neutron]
url = http://controller:9696
auth_url = http://controller:35357
auth_type = password
project_domain_name = default
user_domain_name = default
region_name = RegionOne
project_name = service
username = neutron
password = neutron
完整配置如下图所示:
5.完成安装
重新启动计算服务:
[root@computer ~]# systemctl restart openstack-nova-compute.service
启动Linux桥代理并将其配置为在系统引导时启动:
[root@computer ~]# systemctl enable neutron-linuxbridge-agent.service
[root@computer ~]# systemctl start neutron-linuxbridge-agent.service
6.验证操作
加载环境变量
[root@controller ~]# . admin-openrc
列出加载的扩展以验证neutron-server过程的成功启动 :
[root@controller ~]# openstack extension list --network
验证 neutron agent成功
[root@controller ~]# openstack network agent list
至此,neutron服务安装完成
参考链接:https://docs.openstack.org/nova/pike/install/
https://docs.openstack.org/neutron/pike/install/
更多推荐
所有评论(0)