码迷,mamicode.com
首页 > 其他好文 > 详细

openstack HAVANA部署controller控制端

时间:2014-10-29 19:51:00      阅读:350      评论:0      收藏:0      [点我收藏+]

标签:openstack controller cloud computing node

openstack install

system version:centos6.5_64

openstack controller:192.168.1.123 openstack centos6.5_64(具体实施环境中要修改为openstackcontroller端的IP地址)

openstack controller:192.168.1.124 node centos6.5_64(具体实施环境中要修改为openstackcomputing node端的IP地址)

ntp server:210.72.145.44

Vmware Workstation 10.0.2 build-1744117 CPU引擎开启VT支持(虚拟化引擎首选模式:自动,虚拟化Intel VT-x/EPT或者AMD-V/RVI(V)打开)

双网卡选择桥接,VMnet0为桥接默认网络

CentOs6.5_64+Openstack+Kvm云平台部署 Havana(Nova-Network版)

controller install:

1.基础配置

(1).导入第三方安装源:

1.rpm -Uvhhttp://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

2.rpm -Uvh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el6.rf.x86_64.rpm

3.yum installhttps://repos.fedorapeople.org/repos/openstack/openstack-havana/rdo-release-havana-7.noarch.rpm

(2).配置/etc/hosts主机名:

添加controller openstack和compute node节点主机名:

192.168.1.123 openstack

192.168.1.124 node

(3).配置网络eth0和eth1:

vi /etc/sysconfig/network-scripts/ifcfg-eth0:

DEVICE=eth0

HWADDR=00:0C:29:FD:0B:DE

TYPE=Ethernet

ONBOOT=yes

BOOTPROTO=none

IPADDR=192.168.1.123

NETMASK=255.255.255.0

GATEWAY=192.168.1.1

DNS1=202.106.46.151

DNS2=202.106.195.68

vi /etc/sysconfig/network-scripts/ifcfg-eth1

DEVICE=eth1

TYPE=Ethernet

ONBOOT=yes

BOOTPROTO=none

重启网络服务:service network restart

(4).关闭selinux:

vi /etc/sysconfig/selinux:

SELINUX=disabled

setenforce 0临时关闭selinux

使用getenforce查看:

Disabled

(5).修改/etc/sysctl.conf参数:

net.ipv4.ip_forward=1

sysctl -p使配置参数生效。

2.安装配置NTP服务:

(1).安装NTP服务:

yum install ntp

(2).配置NTP服务:

[root@openstack network-scripts]# more /etc/ntp.conf

driftfile /var/lib/ntp/drift

restrict default kod nomodify notrap nopeer noquery

restrict 127.0.0.1

restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

server 210.72.145.44

keys /etc/ntp/keys

(3).启动NTP服务,设置开机自启动:

service ntpd start

chkconfig ntpd on

3.配置安装MYSQL:

(1).安装MySQL服务:yum -y install mysqlmysql-server MySQL-python

(2).修改MySQL配置文件:

vi /etc/my.cnf

bind-address=0.0.0.0

(3).启动MySQL服务,设置开机自启动:

service mysqld start

chkconfig mysqld on

(4).修改MySQL密码为passwd:

mysqladmin -uroot password ‘passwd‘

4.安装配置qpid服务:

(1).安装qpid服务:

yum install qpid-cpp-server memcached

(2).修改/etc/qpidd.conf配置文件,将auth设置为no:

auth=no

(3)启动qpid服务,设置开机启动:

service qpidd start

chkconfig  qpidd on

(4).安装openstack工具包:

yum install openstack-utils

5.安装配置keystone

5.1.初始化keystone

(1).安装keystone服务:

yum -y install openstack-keystone 

(2).创建keystone数据库,修改配置文件中的数据库链接:

openstack-db --init --service keystone

(3).修改配置文件中的数据库链接:

openstack-config --set /etc/keystone/keystone.conf  sql connectionmysql://keystone:keystone@localhost/keystone

(4).使用OpenSSL随机生成一个令牌,将其存储在配置文件中:

export SERVICE_TOKEN=$(openssl rand -hex 10)   //随机生成SERVICE_TOKEN值,请牢记 

export SERVICE_ENDPOINT=http://127.0.0.1:35357/v2.0

mkdir /root/config

echo $SERVICE_TOKEN > /root/config/admin.txt

cat /root/config/admin.txt

openstack-config --set /etc/keystone/keystone.conf  DEFAULT admin_token $SERVICE_TOKEN

*注:将生成的SERVICE_TOKEN值写入文件中保存,以备后续使用,后面涉及到的SERVICE_TOKEN值都是在admin.txt文件中获取的。所以一旦写入文件,不要再次运行命令生成SERVICE_TOKEN,否则前后不一致会为调试带来麻烦。

(5).keystone-manage pki_setup --keystone-user keystone--keystone-group keystone

chown -R keystone:keystone /etc/keystone/*

(6).启动keystone服务,设置开机自启动: 

service openstack-keystone start

chkconfig openstack-keystone on

5.2.定义Users、Tenants and Roles

(1).修改.bash_profile文件,添加以下参数:

vi .bash_profile:

export OS_USERNAME=admin

export OS_TENANT_NAME=admin 

export OS_PASSWORD=password 

export OS_AUTH_URL=http://127.0.0.1:5000/v2.0

export SERVICE_ENDPOINT=http://127.0.0.1:35357/v2.0 

export SERVICE_TOKEN=e447701f67f53ead9bbe

source .bash_profile

(2).为管理员用户创建一个tenant,为openstack其他服务的用户创建一个tenant:

keystone tenant-create --name=admin --description=‘AdminTenant‘

keystone tenant-create --name=service --description=‘ServiceTenant‘

(3).创建一个管理员用户admin:

keystone user-create --name=admin  --pass=password --email=keystone@zcs.com

(4).创建一个管理员角色admin:

keystone role-create --name=admin

(5).将角色添加到用户:

keystone user-role-add --user=admin --tenant=admin --role=admin

5.3.定义Services 和API Endpoints

(1).为Keystone创建一个服务:

keystone service-create --name=keystone --type=identity--description="KeystoneIdentity Service"

(2).使用服务ID创建一个endpoint:

vim /root/config/keystone.sh

#! /bin/bash

my_ip=192.168.1.123

service=$(keystone service-list |awk ‘/keystone/ {print $2}‘)

keystone endpoint-create --service-id=$service--publicurl=http://$my_ip:5000/v2

.0 --internalurl=http://$my_ip:5000/v2.0 --adminurl=http://$my_ip:35357/v2.0

sh /root/config/keystone.sh

6.安装配置Glance

6.1初始化Glance

(1).安装Glance服务:

yum install openstack-glance

(2).创建Glance数据库:

openstack-db --init --service glance

(3).修改配置文件中的数据库链接:

openstack-config --set /etc/glance/glance-api.conf DEFAULTsql_connection mysql://glance:glance@localhost/glance

openstack-config --set /etc/glance/glance-registry.conf DEFAULTsql_connection mysql://glance:glance@localhost/glance

6.2创建User,定义Service和API Endpoints

(1).为Glance服务创建一个glance用户:

keystone user-create --name=glance --pass=service--email=glance@zcs.com

keystone user-role-add --user=glance --tenant=service--role=admin

(2).为Glance创建一个服务:

keystone service-create --name=glance --type=image--description="Glance ImageService"

(3).使用服务ID创建一个endpoint:

vi /root/config/glance.sh

#! /bin/bash

my_ip=192.168.1.123

service=$(keystone service-list |awk ‘/glance/ {print $2}‘)

keystone endpoint-create --service-id=$service--publicurl=http://$my_ip:9292 --internalurl=http://$my_ip:9292--adminurl=http://$my_ip:9292

sh /root/config/glance.sh

6.3配置Glance服务

(1).将keystone认证信息添加到glance配置文件中:

openstack-config --set /etc/glance/glance-api.confkeystone_authtoken auth_host 127.0.0.1

openstack-config --set /etc/glance/glance-api.confkeystone_authtoken auth_port 35357

openstack-config --set /etc/glance/glance-api.confkeystone_authtoken auth_protocol http

openstack-config --set /etc/glance/glance-api.confkeystone_authtoken admin_tenant_name service

openstack-config --set /etc/glance/glance-api.confkeystone_authtoken admin_user glance

openstack-config --set /etc/glance/glance-api.confkeystone_authtoken admin_password service

openstack-config --set /etc/glance/glance-registry.confkeystone_authtoken auth_host 127.0.0.1

openstack-config --set /etc/glance/glance-registry.confkeystone_authtoken auth_port 35357

openstack-config --set /etc/glance/glance-registry.confkeystone_authtoken auth_protocol http

openstack-config --set /etc/glance/glance-registry.confkeystone_authtoken admin_tenant_name service

openstack-config --set /etc/glance/glance-registry.confkeystone_authtoken admin_user glance

openstack-config --set /etc/glance/glance-registry.confkeystone_authtoken admin_password service

(2).修改ini文件路径,将keystone认证信息添加到ini文件中:

openstack-config --set /etc/glance/glance-api.conf paste_deployconfi_file /etc/glance/glance-api-paste.ini

openstack-config --set /etc/glance/glance-api.conf paste_deployflavor keystone

openstack-config --set /etc/glance/glance-registry.confpaste_deploy config_file /etc/glance/glance-registry-paste.ini

openstack-config --set /etc/glance/glance-registry.confpaste_deploy flavor keystone

 

cp /usr/share/glance/glance-api-dist-paste.ini/etc/glance/glance-api-paste.ini

cp /usr/share/glance/glance-registry-dist-paste.ini/etc/glance/glance-registry-paste.ini

 

chown -R root:glance /etc/glance/glance-api-paste.ini

chown -R root:glance /etc/glance/glance-registry-paste.ini

 

openstack-config --set /etc/glance/glance-api-paste.inifilter:authtoken auth_host 127.0.0.1

openstack-config --set /etc/glance/glance-api-paste.inifilter:authtoken admin_tenant_name service

openstack-config --set /etc/glance/glance-api-paste.inifilter:authtoken admin_user glance

openstack-config --set /etc/glance/glance-api-paste.inifilter:authtoken admin_password service

 

openstack-config --set /etc/glance/glance-registry-paste.inifilter:authtoken auth_host 127.0.0.1

openstack-config --set /etc/glance/glance-registry-paste.inifilter:authtoken admin_tenant_name service

openstack-config --set /etc/glance/glance-registry-paste.inifilter:authtoken admin_user glance

openstack-config --set /etc/glance/glance-registry-paste.inifilter:authtoken admin_password service

(3).修改镜像文件的存放路径(默认存放在/var/lib/glance目录下,如果不需要修改,此步骤可省略)

openstack-config --set /etc/glance/glance-api.conf DEFAULTfilesystem_store_datadir /openstack/lib/glance/images/

openstack-config --set /etc/glance/glance-api.conf DEFAULTscrubber_datadir

/openstack/lib/glance/scrubber

openstack-config --set /etc/glance/glance-api.conf DEFAULTimage_cache_dir /openstack/lib/glance/image-cache/

mkdir -p /openstack/lib

cp -r /var/lib/glance/ /openstack/lib/

chown -R glance:glance /openstack/lib/glance/

(4).启动glance服务,设置开机自启动

service openstack-glance-api start

service openstack-glance-registry start

chkconfig openstack-glance-api on

chkconfig openstack-glance-registry on

6.4Glance测试

(1).为了测试镜像服务的安装,至少下载一个虚拟机镜像,这个镜像一定要能够与OpenStack一起工作。例如,CirrOS是一个很小的测试镜像,它经常用于测试OpenStack部署。这个过程,使用了64-bit的CirrOS QCOW2镜像。

cd /openstack/lib/glance/images/

wget http://download.cirros-cloud.net/0.3.1/cirros-0.3.1-x86_64-disk.img

上传该镜像到该镜像服务中 

glance image-create --name=imageLabel --disk-format=fileFormat \

--container-format=containerFormat --is-public=accessValue < imageFile

参数说明:

imageLabel      任意的标志,该名称由用户指向镜像。

fileFormat      说明镜像文件格式,有效的文件格式包括:

qcow2,raw,vhd,vmdk,vdi,iso,aki,ari,and ami等等。

containerFormat  指定的容器格式,有效的格式包括:bare,ovf,aki,ari and ami。

                指定bare格式表明镜像文件不在文件格式里,也就是说包含有关虚拟机的元数据。虽然目前这个字段是必须的,但实际上任何其它的OpenStack服务不使用它,而且在系统运行时也没有效果。因为该值在任何地方都没有用到,为了安全,一直指定bare作为容器的格式。

accessValue      指定镜像是否能访问。

true --所有的用户都能够查看和使用该镜像。

false --只有管理员才能够查看和使用该镜像

imageFile      指定你下载的镜像文件名称

glance image-create --name="CirrOS 0.3.1"--disk-format=qcow2 --container-format=bare --is-public=true <cirros-0.3.1-x86_64-disk.img

glance image-create --name="cirros"--disk-format=qcow2 --container-format=ovf --is-public=true <cirros-0.3.1-x86_64-disk.img

查看glance数据库中的表images,就可以看到添加的镜像文件。 

再查看/openstack/lib/glance/目录下,就有一个与images表中ID号相同的文件。

(2).查看镜像:

glance image-list

7.安装配置Nova

7.1初始化Nova

(1).安装nova:

yum install openstack-nova

(2).创建nova数据库:

Openstack-db –init –service nova

7.2创建User,定义Services和API Endpoints

(1).编写脚本:

vi /root/config/nova-user.sh:

#! /bin/bash

my_ip=192.168.1.123

keystone user-create --name=nova --pass=service--email=nova@example.com

keystone user-role-add --user=nova --tenant=service--role=admin

keystone service-create --name=nova --type=compute--description="Nova Compute S

ervice"

service=$(keystone service-list |awk ‘/nova/ {print $2}‘)

keystone endpoint-create --service-id=$service--publicurl=http://$my_ip:8774/v2

/%\(tenant_id\)s--internalurl=http://$my_ip:8774/v2/%\(tenant_id\)s --adminurl=

http://$my_ip:8774/v2/%\(tenant_id\)s

(2).运行脚本,创建用户、服务及api endpoint:

sh /root/config/nova-user.sh

7.3配置nova服务:

(1).修改/etc/nova.conf配置文件:

vi /etc/nova/nova.conf:

more /etc/nova/nova.conf |grep -v "#"|grep -v"^$"

[DEFAULT]

my_ip=192.168.1.123

notify_on_state_change=vm_and_task_state

state_path=/openstack/lib/nova

network_manager=nova.network.manager.FlatDHCPManager

instance_usage_audit_period=hour

auth_strategy=keystone

allow_resize_to_same_host=true

instance_usage_audit=True

glance_api_servers=192.168.1.123:9292

public_interface=eth0

flat_network_bridge=br1

flat_interface=eth1

multi_host=True

verbose=True

notification_driver=nova.openstack.common.notifier.rpc_notifier

rpc_backend=nova.openstack.common.rpc.impl_qpid

qpid_hostname=192.168.1.123

firewall_driver=nova.virt.libvirt.firewall.IptablesFirewallDriver

libvirt_type=kvm

novncproxy_base_url=http://192.168.1.123:6080/vnc_auto.html

vncserver_listen= $my_ip

vncserver_proxyclient_address= $my_ip

vnc_enabled=true

vnc_keymap=en-us

[hyperv]

[zookeeper]

[osapi_v3]

[conductor]

[keymgr]

[cells]

[database]

[image_file_url]

[baremetal]

[rpc_notifier2]

[matchmaker_redis]

[ssl]

[trusted_computing]

[upgrade_levels]

[matchmaker_ring]

[vmware]

[spice]

[keystone_authtoken]

admin_tenant_name=service

admin_user=nova

admin_password=service

auth_host=127.0.0.1

auth_port=35357

auth_protocol=http

因上述配置文件中修改了instances实例存放的位置,还需要作一下操作:

 修改instances路径,设置目录权限:

cp -r /var/lib/nova/ /openstack/lib/

chown -R nova:nova /openstack/lib/nova/

(2).配置libvirtd服务,删除virbr0

启动libvirtd服务:

service libvirtd start

查看net-list,发现default:

virsh net-list

删除default,即virbr0:

virsh net-destroy default

virsh net-undefine default

重启libvirtd服务,设置开机自启动:

service libvirtd restart

chkconfig libvirtd on

(3).启动nova相关服务,设置开机自启动:

service messagebus start

chkconfig messagebus on

启动nova服务,采用network网络服务:

service openstack-nova-api start

service openstack-nova-cert start

service openstack-nova-consoleauth  start

service openstack-nova-scheduler  start

service openstack-nova-conductor start

service openstack-nova-novncproxy   start

service openstack-nova-compute start

service openstack-nova-network start

chkconfig openstack-nova-api on

chkconfig openstack-nova-cert on

chkconfig openstack-nova-consoleauth on

chkconfig openstack-nova-scheduler on

chkconfig openstack-nova-conductor on

chkconfig openstack-nova-novncproxy  on

chkconfig openstack-nova-compute  on

chkconfig openstack-nova-network on

7.4Nova测试:

(1).创建网络:

nova network-create VMnet0 --fixed-range-v4=192.168.1.0/24--bridge-interface=br1 --multi-host=T --dns1=202.106.46.151 --dns2=202.106.195.68

nova-manage floating create --ip_range=192.168.1.0/24

VMnet0为本地网卡桥接的网络,fixed-range为fixed_IP地址的范围,用在VM间通信,floating_IP用在对外业务上,进行NAT转换后进行业务使用。桥接接口为br1.

查看网络:

nova network-list

查看nova管理网络的信息:

nova-manage network list

(2).设置安全组:

nova secgroup-add-rule default tcp 22 22 0.0.0.0/0

nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0

openstack里的浮动ip知识点:

缺省情况下实例会被赋予固定ip,这时并不能保证实例会马上可以从外面访问到,一般来说需要配置防火墙来允许公共ip,然后建立一条NAT规则从公共ip到私有ip的映射。 

Ag引入了一个叫浮动ip的概念,浮动ip是一些可以从外部访问的ip列表,通常从isp哪里买来的。 

浮动ip缺省不会自动赋给实例,用户需要手动从地址池里抓取然后赋给实例。一旦用户抓去后,他就变成这个ip的所有者,可以随意赋给自己拥有的其他实例。如果实例死掉了的话,用户也不会失去这个浮动ip,可以随时赋给其他实例。暂时不支持为了负载均衡多实例共享一个浮动ip。 

而对于固定ip来说,实例启动后获得的ip也是自动的,不能指定某一个。所以当一个VM歇菜了,再启动也许固定ip就换了一个。 

系统管理员可以配置多个浮动ip池,这个ip池不能指定租户,每个用户都可以去抓取。多浮动ip池是为了考虑不同的isp服务提供商,免得某一个isp出故障带来麻烦。 

如果运行的是企业云,浮动ip池就是那些ag外的数据中心都能访问到的ip。 

浮动ip机制给云用户提供了很多灵活性,也给系统管理员减少了安全风险,尽量只让Ag软件去改防火墙会安全些。

浮动 IP :

要了解浮动 IP 是如何实现的,首先将一个浮动 IP 关联到此实例的固定 IP。之前所创建的这个实例的固定 IP 是 10.10.10.2。 在默认池内创建一个浮动 IP 

要在默认池内创建一个浮动 IP,请运行一下代码: 

# nova-manage floating create --ip_range=192.168.1.232/30

要从这个池分派一个浮动 IP,请运行一下代码:

 # nova floating-ip-create 

这样,就拥有一个 IP 192.168.1.233。

现在将它分配给 ID 为 8f773639-c04f-4885-9349-ac7d6a799843 的实例: 

# nova add-floating-ip 8f773639-c04f-4885-9349-ac7d6a799843 192.168.1.233 将浮动 IP 绑定到公共接口 

FLAGS.public_interface 被用来绑定浮动 IP。

在运行了 nova add-floating-ip 命令后,可以看到 public_interface 下就具有了如下的浮动 IP: # ip addr list dev wlan0 

3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP qlen 1000 link/ether 08:11:96:75:91:54 brd ff:ff:ff:ff:ff:ff 

inet 192.168.1.90/16 brd 192.168.255.255 scope global wlan0 inet 192.168.1.233/32 scope global wlan0 

    inet6 fe80::a11:96ff:fe75:9154/64 scope link  valid_lft forever preferred_lft forever NAT 表内针对浮动 IP 的规则 

在此实例获得了 nova-network 主机上的一个浮动 IP 后,这些规则适用: 

-A nova-network-OUTPUT -d 192.168.1.233/32 -j DNAT --to-destination 10.10.10.2

-A nova-network-PREROUTING -d 192.168.1.233/32 -j DNAT --to-destination 10.10.10.2

-A nova-network-float-snat -s 10.10.10.2/32 -j SNAT --to-source 192.168.1.233 

您会看到该 dNAT 规则被用来将此浮动 IP 转换成此实例的固定 IP。如果一个包到达 nova-network 主机并以浮动 IP 为目标 IP,则此目标 IP 就会被转换。然后,就会有另一项 sNAT 规则会将来自此实例的固定 IP 的流量转换到此浮动 IP。由于所有从 VM 到固定网络之外的流量均被指向网关(是由 nova-network 的 dnsmasq 进行设置),有了 sNAT 规则,出 VM 的流量就可以成功标志成来自此浮动 IP。此外,已包装的 OUTPUT 链内还有一个 dNAT 规则,允许 nova-network 上的本地过程访问具有浮动 IP 的 VM。 

使用浮动 IP 的 Ping VM:

要将 VM 与浮动 IP Ping 在一起,也需要一些规则。请记住,在此 nova-compute 主机上,针对每个实例必须有一个特定链;其内的规则只允许来自固定子集内的 IP 的流量。如果想要 ping 一个浮动 IP,流量就会被这些规则丢弃,因为 ping 包的源 IP 并不在此固定子集内。显然,需要一个规则以允许 icmp 流量。 为了添加一个允许 ping 的规则,可以使用Ag的安全组规则的概念:

# nova secgroup-add-rule default icmp -1 -1 0.0.0.0/0 之后,就可以看到在此实例的特定链下多创建了一个规则:

-A nova-compute-inst-1 -p icmp -j ACCEPT 

同样的方式,可以对具有浮动 IP 的 VM 启用 SSH。 

(3).创建虚拟机实例:

查看可用实例:

nova image-list

创建虚拟机实例:

nova flavor-list可以看到镜像的模板

nova boot --flavor 1 --image "CirrOS 0.3.1" vm01

查看虚拟机实例运行状态:

nova list

nova flavor-list可以看到镜像的模板

nova-manager service list查看所有的服务状况

8.安装配置Horizon

(1).安装Horizon

yum install openstack-dashboard

(2).修改local_settings文件,将DEBUG=Flase修改为DEBUG=True:

vi /etc/openstack-dashboard/local_settings:

DEBUG=True

(3).修改httpd.conf文件,将#ServerName www.example.com:80修改为ServerName 192.168.1.123:80

vi /etc/httpd/conf/httpd.conf:

#ServerName www.example.com:80

ServerName 192.168.1.123:80

(4).修改local_settings.py文件,将Member修改为”admin”:

vi/usr/share/openstack-dashboard/openstack_dashboard/local/local_settings.py:

OPENSTACK_KEYSTONE_DEFAULT_ROLE = "admin"

(5).启动http服务,设置开机自启动:

service httpd start

chkconfig httpd on

(6).重启nova-api服务:

service openstack-nova-api restart

(7).添加防火墙策略:

iptables -I INPUT -p tcp --dport 80 -j ACCEPT

iptables -I INPUT -p tcp -m multiport --dports 5900:6000 -jACCEPT

iptables -I INPUT -p tcp --dport 6080 -j ACCEPT

service iptables save

(8).Horizon安装完成,使用http://192.168.1.123/dashboard访问openstack web界面。

用户名:admin

密码:password

9.添加新项目

(1).为操作员用户创建一个tenant:

keystone tenant-create --name=manager --description=‘ManagerTenant‘

(2).创建操作员:

keystone user-create --name=manager --pass=password--email=manager@zcs.com

(3).创建一个管理员角色manager:

keystone role-create --name=manager

(4).将manager角色添加到用户:

keystone user-role-add --user=manager --tenant=manager--role=manager

(5).将nova角色添加到用户:

keystone user-role-add --user=nova --tenant=service--role=manager

 


本文出自 “林夕” 博客,请务必保留此出处http://lutaoxu.blog.51cto.com/4224602/1569089

openstack HAVANA部署controller控制端

标签:openstack controller cloud computing node

原文地址:http://lutaoxu.blog.51cto.com/4224602/1569089

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!