微信公众号:运维开发故事,作者: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-novncproxynova-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/

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐