作者:独笔孤行@TaoCloud
本文档主要基于OpenStack官方文档,对官方文档加以更加详细的说明和解读,更适合新手部署学习OpenStack。
官方文档中主要为英文,只有M版和L版有中文版,但存在部分翻译错误,不建议新手使用。在此提供官方文档链接:https://docs.openstack.org/newton/install/

若在虚拟机中部署OpenStack,网络要选择vxlan模式,vlan模式只能在物理机中使用。

1.基础环境
1.1 最低硬件配置:
• 控制节点: 1 处理器, 4 GB 内存, 5 GB 磁盘
• 计算节点: 1 处理器, 2 GB 内存, 10 GB 磁盘
• 存储节点: 1 处理器, 2 GB 内存, 10 GB 磁盘+10G数据盘

节点 主机名 网卡1(eth0) 网卡2(eth1)
控制节点 controller 10.0.0.10 192.168.20.10
计算节点 compute 10.0.0.11 192.168.20.11
存储节点 storage 10.0.0.12 192.168.20.12

eth0用途1:eth0为管理网络,是openstack环境里各个模块之间交互,连接数据库,连接Message Queue的网络,即openstack本身用的IP网段。

eth0用途2:eth0为隧道网络tunnel,openstack里使用vxlan模式,需要有隧道网络;隧道网络采用了点到点通信协议代替了交换连接,tunnel用于虚拟机走网络数据流量。

eth1用途 : eth1用于是链接外网,用户访问openstack虚拟机,必须有个网段是连外网的,用户通过这个网络能访问到虚拟机。

注解
标准的生产环境中,OpenStack需要管理网、外网、隧道网络共3个网段,本次主要遵循官方文档,将管理网络与隧道网络合并用eth0网卡。如果只是测试环境,可以将3个网络合并为一个网卡。

1.2 操作系统
CentOS-7-x86_64-Minimal-1511.iso
1.3 CPU虚拟化
本手册采用VMware WorkStation创建虚拟机搭建OpenStack Newton。按照如下内容打开CPU虚拟化功能。物理服务器需要进入BIOS,打开CPU虚拟化功能。打开完成后,在操作系统中执行:egrep -c '(vmx|svm)' /proc/cpuinfo 命令检测是否打开成功。返回值大于1说明完成。

1.4 网卡配置
本次测试采用每台服务器2个物理网卡,环境无法满足时同样可以只配置1个网卡,OpenStack所有网络都走同一网卡。CentOS7.2安装完成后,默认网卡名称是eno16777736,需要把eno16777736改成eth0.也可以不改使用默认名称。
更改网卡名称为eth0

[root@controller ~]# cd /etc/sysconfig/network-scripts/
[root@controller network-scripts]# mv ifcfg-eno16777736 ifcfg-eth0

编辑网卡配置文件,将NAME和DEVICE内容改为eth0.
编辑 /etc/default/grub。在GRUB_CMDLINE_LINUX中添加net.ifnames=0 biosdevname=0内容。

GRUB_TIMEOUT=5
GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)"
GRUB_DEFAULT=saved
GRUB_DISABLE_SUBMENU=true
GRUB_TERMINAL_OUTPUT="console"
GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root net.ifnames=0 biosdevname=0 rd.lvm.lv=centos/swap rhgb quiet"
GRUB_DISABLE_RECOVERY="true"

运行命令grub2-mkconfig -o /boot/grub2/grub.cfg 来重新生成GRUB配置并更新内核参数,完成后执行reboot命令重启服务器。按照同样的操作将其他网卡改成类似的形式。

详细介绍可参考链接:https://jingyan.baidu.com/article/17bd8e524c76a285ab2bb8ff.html

1.5 安全设置
关闭并禁用NetworkManager:

[root@controller ~]# systemctl stop NetworkManager
[root@controller ~]# systemctl disable NetworkManager

关闭并禁用防火墙:

[root@controller ~]# systemctl stop firewall
[root@controller ~]# systemctl disable firewall

1.6 域名解析
配置hosts域名解析,不改变原有内容,添加如下内容:

10.0.0.10   controller
10.0.0.11   compute
10.0.0.12   storage

1.7 yum源配置
OpenStack Newton的yum源有两种配置方式。即网络源和本地源。网络源需要OpenStack服务器能访问互联网。本地源需要把Newton.tar.gz压缩包拷贝到服务器制作本地源。
1.配置OpenStack-Newton网络源

cat /etc/yum.repos.d/OpenStack-Newton.repo
[OpenStack-Newtron]
name=OpenStack-Newtron
baseurl=http://vault.centos.org/7.2.1511/cloud/x86_64/openstack-newton/
gpgcheck=0
enabled=1

安装kvm源

rpm -ivh http://mirrors.163.com/centos/7.4.1708/virt/x86_64/kvm-common/centos-release-qemu-ev-1.0-1.el7.noarch.rpm

2.配置本地yum源
解压缩Newton.tar.gz压缩包到root目录下,并安装createrepo。

[root@compute ~]# cd Newton
[root@compute Newton]# yum localinstall  createrepo-0.9.9-28.el7.noarch.rpm\
python-deltarpm-3.6-3.el7.x86_64.rpm  deltarpm-3.6-3.el7.x86_64.rpm \
libxml2-python-2.9.1-6.el7_2.3.x86_64.rpm  libxml2-2.9.1-6.el7_2.3.x86_64.rpm

创建Newton本地源。

[root@compute ~]# createrepo /root/Newton
Spawning worker 0 with 568 pkgs
Workers Finished
Saving Primary metadata
Saving file lists metadata
Saving other metadata
Generating sqlite DBs
Sqlite DBs complete

编辑yum源配置文件

[root@controller ~]# cat /etc/yum.repos.d/OpenStack-Newton.repo 
[OpenStack-Newton]
name=OpenStack-Newton
baseurl=file:///root/Newton
enabled=1
gpgcheck=0

选择以上任意一种方式配置好yum源后,生成yum源缓存。

[root@controller ~]# yum clean all;yum makecache

2.OpenStack环境
2.1概况

2.2密码安全
用户名称 密码名称 描述
root 数据库密码(不能使用变量) 数据库的root密码
admin ADMIN_PASS admin 用户密码
cinder CINDER_DBPASS 块设备存储服务的数据库密码
cinder CINDER_PASS 块设备存储服务的 cinder 密码
admin DASH_DBPASS Database password for the dashboard
demo DEMO_PASS demo 用户的密码
glance GLANCE_DBPASS 镜像服务的数据库密码
glance GLANCE_PASS 镜像服务的 glance 用户密码
keystone KEYSTONE_DBPASS 认证服务的数据库密码
neutron NEUTRON_DBPASS 网络服务的数据库密码
neutron NEUTRON_PASS 网络服务的 neutron 用户密码
nova NOVA_DBPASS 计算服务的数据库密码
nova NOVA_PASS 计算服务中nova用户的密码
openstack RABBIT_PASS RabbitMQ的guest用户密码
2.3 网络时间协议(NTP)
Controller控制节点
1.安装软件包

# yum install chrony –y

2.编辑 /etc/chrony.conf 文件,按照你环境的要求,对下面的键进行添加,修改或者删除:

server controller iburst
  1. 为允许其他节点可以连接到控制节点的 chrony 后台进程,在/etc/chrony.conf 文件添加下面的键值:
    allow 10.0.0.0/24

    如有必要,将10.0.0.0/24替换成你子网的相应描述。

  2. 启动 NTP 服务并将其配置为随系统启动::
    # systemctl enable chronyd.service
    # systemctl start chronyd.service

    在控制节点上运行监测命令: chronyc sources。包含controller内容即可。

其他节点
1.安装软件包

# yum install chrony –y

2.编辑 /etc/chrony.conf 文件,按照你环境的要求,对下面的键进行添加,且只保留controller节点的时间同步,删除其他时间同步:

server controller iburst

3.启动 NTP 服务并将其配置为随系统启动::

# systemctl enable chronyd.service
# systemctl start chronyd.service

验证操作
建议在继续进一步的操作之前验证 NTP 的同步。有些节点,特别是哪些引用了控制节点的,需要花费一些时间去同步。
1.在控制节点上执行这个命令:

[root@controller ~]# chronyc sources
210 Number of sources = 5
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^+ 85.199.214.100                1   6   237    35  -8610us[-8610us] +/-  153ms
^- ntp1.ams1.nl.leaseweb.net     2   6   377    38    +40ms[  +40ms] +/-  343ms
^+ biisoni.miuku.net             2   6   377   102   +572us[-2150us] +/-  110ms
^* cn.ntp.faelix.net             2   6   377    40  +1358us[-1762us] +/-   87ms
^- controller                    3   6   377    33  -6501ns[-6501ns] +/-   87ms

在 Name/IP address 列的内容应显示NTP服务器的主机名或者IP地址。在 S 列的内容应该在NTP服务目前同步的上游服务器前显示 *。红色标记部分出现既可。
2.在所有其他节点执行相同命令:

[root@compute ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample               
===============================================================================
^* controller                    3   6   377    27  +5882us[+6188us] +/-   90ms

在 Name/IP address 列的内容应显示控制节点的主机名。
2.4 OpenStack包
所有节点
1.安装 OpenStack 客户端:

# yum install python-openstackclient

2.CentOS 默认启用了SELinux。安装openstack-selinux软件包以便自动管理OpenStack 服务的安全策略:

# yum install openstack-selinux

2.5 SQL数据库
大多数 OpenStack 服务使用 SQL 数据库来存储信息。 典型地,数据库运行在控制节点上。以下内容只在控制节点上操作。
Controller控制节点
1.安装软件包:

# yum install mariadb mariadb-server python2-PyMySQL

2.创建并编辑 /etc/my.cnf.d/openstack.cnf 文件,完成如下操作:
创建 [mysqld] 部分,设置 bind-address 的值为controller控制节点的管理网ip地址。以使得其它节点可以通过管理网络访问数据库,设置其他键值来启用有用的选项和 UTF-8 字符集:

[mysqld]
bind-address = 10.0.0.10

default-storage-engine = innodb
innodb_file_per_table
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8

3.启动数据库服务并设置开机自启动:

# systemctl enable mariadb.service
# systemctl start mariadb.service
  1. 为了保证数据库服务的安全性,运行mysql_secure_installation脚本。特别需要说明的是,为数据库的root用户设置一个适当的密码。
    # mysql_secure_installation

    2.6 消息队列
    Controller控制节点
    OpenStack使用message queue协调操作和各服务的状态信息。消息队列服务一般运行在控制节点上。OpenStack支持好几种消息队列服务包括RabbitMQ, Qpid, and ZeroMQ. 不过,大多数发行版本的OpenStack包支持特定的消息队列服务。本指南安装 RabbitMQ 消息队列服务,因为大部分发行版本都支持它。如果你想安装不同的消息队列服务,查询与之相关的文档。
    消息队列运行在 controller控制节点上。

  2. 安装软件包:
    # yum install rabbitmq-server -y
  3. 启动消息队列服务并设置开机自启动:
    # systemctl enable rabbitmq-server.service
    # systemctl start rabbitmq-server.service
  4. 添加 openstack 用户:(用户名openstack,密码RABBIT_PASS)
    # rabbitmqctl add_user openstack RABBIT_PASS
    Creating user "openstack" ...

    用合适的密码替换 RABBIT_PASS

  5. 为 openstack 用户配置写和读的权限:
    # rabbitmqctl set_permissions openstack ".*" ".*" ".*"
    Setting permissions for user "openstack" in vhost "/" ...

    2.7 Memcached
    Controller控制节点
    认证服务认证缓存使用Memcached缓存令牌。缓存服务memecached运行在controller控制节点。在生产部署中,我们推荐联合启用防火墙、认证和加密保证它的安全。
    1.安装软件包:

    # yum install memcached python-memcached

    2.为了允许其他节点通过管理网络访问,编辑 /etc/sysconfig/memcached 文件,配置服务使用controller控制节点管理ip地址:

    10.0.0.10

    注解
    替换原有有内容"127.0.0.1"或" "

配置完成后查看/etc/sysconfig/memcached文件内容为:

[root@controller ~]# cat /etc/sysconfig/memcached 
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="10.0.0.10"

3.启动Memcached 服务并设置开机自启动:

# systemctl enable memcached.service
# systemctl start memcached.service

3.认证服务
本节描述如何在控制器节点上安装和配置OpenStack认证服务,即Keystone。考虑到可扩展性,此配置部署了Fernet令牌和Apache HTTP服务器来处理请求。
Controller控制节点
3.1安装和配置
在安装和配置OpenStack认证服务之前,一定要创建数据库和管理员令牌。
1.创建数据库,完成如下操作:
用数据库客户端以root用户连接到数据库服务器:

$ mysql -u root -p

创建 keystone 数据库:

mysql> CREATE DATABASE keystone;

对keystone数据库赋予合适的权限:

mysql> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \
IDENTIFIED BY 'KEYSTONE_DBPASS';
mysql> GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \
IDENTIFIED BY 'KEYSTONE_DBPASS';

可用合适的密码替换 KEYSTONE_DBPASS。
退出数据库连接。

注解
默认配置文件因分布不同而不同。您可能需要添加这些部分和选项,而不是修改现有的部分和选项。此外,配置片段中的省略号(…),表示应该保留的原有的默认配置。

注解
本指南使用带有mod_wsgi的Apache HTTP服务器,响应端口5000和35357上的认证服务请求。默认情况下,keystone服务仍然侦听这些端口。因此,该指南手动禁用keystone服务。

2运行如下命令安装软件包:

# yum install openstack-keystone httpd mod_wsgi

3.编辑/etc/keystone/keystone.conf 文件完成如下操作:
在 [database]部分,配置数据库访问:

[database]
...
connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone

可用keystone 认证服务数据库设置的密码替换KEYSTONE_DBPASS

注解
注释或者移除[database]部分的其他任何connection选项

在 [token] 部分,配置Fernet 令牌提供者:

[token]
...
provider = fernet

4.同步认证服务数据库:

# su -s /bin/sh -c "keystone-manage db_sync" keystone

5.初始化Fernet 存储库:

# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
# keystone-manage credential_setup --keystone-user keystone --keystone-group keystone

6.引导认证服务:

# keystone-manage bootstrap --bootstrap-password ADMIN_PASS \
  --bootstrap-admin-url http://controller:35357/v3/ \
  --bootstrap-internal-url http://controller:35357/v3/ \
  --bootstrap-public-url http://controller:5000/v3/ \
  --bootstrap-region-id RegionOne

用合适的管理员用户密码替换 ADMIN_PASS。
7.配置Apache http服务,编辑/etc/httpd/conf/httpd.conf 文件,配置ServerName 选项 为控制节点:

ServerName controller

8.创建指向 /usr/share/keystone/wsgi-keystone.conf 文件的链接:

# ln -s /usr/share/keystone/wsgi-keystone.conf /etc/httpd/conf.d/

9.启动Apache HTTP服务并设置开机自启动:

# systemctl enable httpd.service
# systemctl start httpd.service

10.配置管理员账户

$ export OS_USERNAME=admin
$ export OS_PASSWORD=ADMIN_PASS
$ export OS_PROJECT_NAME=admin
$ export OS_USER_DOMAIN_NAME=Default
$ export OS_PROJECT_DOMAIN_NAME=Default
$ export OS_AUTH_URL=http://controller:35357/v3
$ export OS_IDENTITY_API_VERSION=3

可用在“安装和配置”部分使用keystone-manage bootstrap 命令设置的密码替换 ADMIN_PASS
3.2创建域、项目、用户和角色
身份认证服务为每个OpenStack服务提供认证服务。认证服务使用 domains, projects, users, 和 roles的组合。
1.本指南使用一个服务项目,该服务项目为添加到环境中的每个服务包含唯一的用户。创建service项目

$ openstack project create --domain default \
 --description "Service Project" service
+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Service Project                  |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 24ac7f19cd944f4cba1d77469b2a73ed |
| is_domain   | False                            |
| name        | service                          |
| parent_id   | default                          |
+-------------+----------------------------------+

2.常规(非管理)任务应该使用非特权项目和用户。作为一个例子,这个指南创建demo项目和用户。
创建 demo 项目:

$ openstack project create --domain default \
  --description "Demo Project" demo
    +-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | Demo Project                     |
| domain_id   | default                          |
| enabled     | True                             |
| id          | 231ad6e7ebba47d6a1e57e1cc07ae446 |
| is_domain   | False                            |
| name        | demo                             |
| parent_id   | default                          |
+-------------+----------------------------------+

注解
在为该项目创建额外用户时,不要重复此步骤。

创建 demo 用户:

$ openstack user create --domain default \
  --password-prompt demo
    User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | aeda23aa78f44e859900e22c24817832 |
| name                | demo                             |
| password_expires_at | None                             |
+---------------------+----------------------------------+

创建 user 角色:

$ openstack role create user
 +-----------+----------------------------------+
| Field     | Value                            |
+-----------+----------------------------------+
| domain_id | None                             |
| id        | 997ce8d05fc143ac97d83fdfb5998552 |
| name      | user                             |
+-----------+----------------------------------+

添加 user 角色到demo 项目和用户:

$ openstack role add --project demo --user demo user

注解
此命令没有输出

注解
可以重复此步骤创建更多项目和用户

3.3验证操作
在安装其他服务之前,验证身份认证服务的操作。

注解
在控制节点上执行这些命令

1.考虑安全因素,关闭临时认证令牌机制:
编辑 /etc/keystone/keystone-paste.ini 文件,从 [pipeline:public_api], [pipeline:admin_api], 和 [pipeline:api_v3] 这3个部分移除admin_token_auth。
2.重置 OS_AUTH_URL 和 OS_PASSWORD 临时环境变量:

$ unset OS_AUTH_URL OS_PASSWORD

3.作为 admin 用户,请求令牌认证:

$ openstack --os-auth-url http://controller:35357/v3 \
  --os-project-domain-name Default --os-user-domain-name Default \
  --os-project-name admin --os-username admin token issue

Password:
+------------+-----------------------------------------------------------------+
| Field      | Value                                                           |
+------------+-----------------------------------------------------------------+
| expires    | 2016-02-12T20:14:07.056119Z                                     |
| id         | gAAAAABWvi7_B8kKQD9wdXac8MoZiQldmjEO643d-e_j-XXq9AmIegIbA7UHGPv |
|            | atnN21qtOMjCFWX7BReJEQnVOAj3nclRQgAYRsfSU_MrsuWb4EDtnjU7HEpoBb4 |
|            | o6ozsA_NmFWEpLeKy0uNn_WeKbAhYygrsmQGA49dclHVnz-OMVLiyM9ws       |
| project_id | 343d245e850143a096806dfaefa9afdc                                |
| user_id    | ac3377633149401296f6c0d92d79dc16                                |
+------------+-----------------------------------------------------------------+

注解
这个命令使用admin 用户的密码。

4.作为 demo 用户,请求令牌认证:

$ openstack --os-auth-url http://controller:5000/v3 \
  --os-project-domain-name Default --os-user-domain-name Default \
  --os-project-name demo --os-username demo token issue

Password:

+------------+---------------------------------------------------------+
| Field      | Value                                                   |
+------------+---------------------------------------------------------+
| expires    | 2018-06-22 10:14:31+00:00                               |
| id         | gAAAAABbLL33VlBkLLD_fu0KXR97qbk0GKzjeDgmQVokSHfHnys9AUv |
|            | n0SXPJHxbh0inyMUWQFQTYbwjOLztN0UERzb9Lohrm1QPtJfrO1YYej |
|            | 4YBqnPpwjbaQvWLg9g7MBVcaZZK1A771Yl2BEUKxttAOhNemItP0Nfy |
|            | rIQOsPnCprKuycPQcA                                      |
| project_id | 31eb23991654472f986b104f31c0eafe                        |
| user_id    | 0ef27ca68eb84bd396cee85e142d52c5                        |
+------------+---------------------------------------------------------+

注解
这个命令使用demo用户密码和API端口5000,这样只会允许对身份认证服务API的常规(非管理)访问。

3.4创建 OpenStack 客户端环境脚本
前一节中使用环境变量和命令选项的组合,通过openstack客户端与身份认证服务交互。为了提升客户端操作的效率,OpenStack支持简单的客户端环境变量脚本即OpenRC 文件。这些脚本通常包含客户端所有常见的选项,当然也支持唯一选项。
为 admin 和 demo 项目和用户创建客户端项目脚本,本指南的接下来的部分会引用这些脚本,为客户端操作加载合适的的凭证。本指南的接下来的部分会引用这些脚本,为客户端操作加载合适的的凭证。

  1. 编辑 admin-openrc 文件添加如下内容:
    export OS_PROJECT_DOMAIN_NAME=Default
    export OS_USER_DOMAIN_NAME=Default
    export OS_PROJECT_NAME=admin
    export OS_USERNAME=admin
    export OS_PASSWORD=ADMIN_PASS
    export OS_AUTH_URL=http://controller:35357/v3
    export OS_IDENTITY_API_VERSION=3
    export OS_IMAGE_API_VERSION=2

    用在认证服务中设置的 admin 用户的密码替换 ADMIN_PASS。

  2. 编辑 demo-openrc 文件添加如下内容:
    export OS_PROJECT_DOMAIN_NAME=Default
    export OS_USER_DOMAIN_NAME=Default
    export OS_PROJECT_NAME=demo
    export OS_USERNAME=demo
    export OS_PASSWORD=DEMO_PASS
    export OS_AUTH_URL=http://controller:5000/v3
    export OS_IDENTITY_API_VERSION=3
    export OS_IMAGE_API_VERSION=2

    用在认证服务中设置的 demo用户的密码替换DEMO_PASS。
    使用特定租户和用户运行客户端,你可以在运行之前简单地加载相关客户端脚本。例如:

  3. 加载 admin-openrc 文件以满足身份认证服务的环境变量,和 admin 项目和用户认证:

    $ . admin-openrc
  4. 请求认证令牌:
    $ openstack token issue
    +------------+---------------------------------------------------------+
    | Field      | Value                                                   |
    +------------+---------------------------------------------------------+
    | expires    | 2018-06-22 10:20:16+00:00                               |
    | id         | gAAAAABbLL9QK8flVesG1iK83v-VUpbbx4UaNul_DpltZsU6fmeSwgg |
    |            | 4P2EwUx3IlVvViAeX8esAIW3FQhTX3iEuT4P5ZMhb4eEr0o9X6v4YAV |
    |            | qNKBnTVhtY20TwK5AW7TfQGE6qDk1qeZRtHb8G2j5KaxgnFzoazwGeu |
    |            | v9trkukOfzxQ8wJzfA                                      |
    | project_id | 257966dab33148b9843b7e86efde84e8                        |
    | user_id    | 73dcdee1cc954a598a67d095211bf582                        |
    +------------+---------------------------------------------------------+

4.镜像服务
Controller控制节点
4.1安装前准备
这个部分描述如何在控制节点上安装和配置镜像服务,即 glance。简单来说,这个配置将镜像保存在本地文件系统中。
安装和配置镜像服务之前,你必须创建创建一个数据库、服务凭证和API端点。

  1. 创建数据库并完成以下步骤:
    用数据库连接客户端以 root 用户连接到数据库服务器:
    $ mysql -u root -p

    创建 glance 数据库:

    mysql> CREATE DATABASE glance;

    对 glance 数据库赋予合适的权限:

    mysql> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' \
    IDENTIFIED BY 'GLANCE_DBPASS';
    mysql> GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' \
    IDENTIFIED BY 'GLANCE_DBPASS';

    可用合适的密码替换GLANCE_DBPASS。

  2. 获得 admin 凭证来获取只有管理员能执行的命令的访问权限:
    $ . admin-openrc
  3. 要创建服务证书,完成这些步骤:
    创建 glance 用户:
$ openstack user create --domain default --password-prompt glance

User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 3f4e777c4062483ab8d9edd7dff829df |
| name                | glance                           |
| password_expires_at | None                             |
+---------------------+----------------------------------+

添加 admin 角色到 glance 用户和 service 项目:

$ openstack role add --project service --user glance admin

注解
此命令没有输出。

创建 glance 服务实体:

$ openstack service create --name glance \
  --description "OpenStack Image" image

+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Image                  |
| enabled     | True                             |
| id          | 8c2c7f1b9b5049ea9e63757b5533e6d2 |
| name        | glance                           |
| type        | image                            |
+-------------+----------------------------------+

4.创建镜像服务的API端点:

$ openstack endpoint create --region RegionOne \
  image public http://controller:9292

+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 340be3625e9b4239a6415d034e98aace |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 8c2c7f1b9b5049ea9e63757b5533e6d2 |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+

$ openstack endpoint create --region RegionOne \
  image internal http://controller:9292

+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | a6e4b153c2ae4c919eccfdbb7dceb5d2 |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 8c2c7f1b9b5049ea9e63757b5533e6d2 |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+

$ openstack endpoint create --region RegionOne \
  image admin http://controller:9292

+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 0c37ed58103f4300a84ff125a539032d |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | 8c2c7f1b9b5049ea9e63757b5533e6d2 |
| service_name | glance                           |
| service_type | image                            |
| url          | http://controller:9292           |
+--------------+----------------------------------+

4.2安装配置组件

注解
默认配置文件在各发行版本中可能不同。你可能需要添加这些部分和选项,而不是修改已经存在的部分和选项。另外,在配置片段中的省略号(...)表示默认的配置选项应该保留。

  1. 安装软件包:
# yum install openstack-glance
  1. 编辑 /etc/glance/glance-api.conf 文件完成如下步骤:
    在 [database] 部分,配置数据库访问:
    [database]
    ...
    connection = mysql+pymysql://glance:GLANCE_DBPASS@controller/glance

    可用在 glance 镜像服务数据库设置的密码替换 GLANCE_DBPASS。
    在 [keystone_authtoken] 和 [paste_deploy] 部分,配置认证服务访问:

[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 = glance
password = GLANCE_PASS

[paste_deploy]
...
flavor = keystone

将 GLANCE_PASS 替换为在认证服务中为 glance 用户设置的密码。

注解
注释或删除 [keystone_authtoken] 中的其它选项。

在 [glance_store] 部分,配置本地文件系统商店和本地镜像文件:

[glance_store]
...
stores = file,http
default_store = file
filesystem_store_datadir = /var/lib/glance/images/
  1. 编辑 /etc/glance/glance-registry.conf 文件完成如下内容:
    在 [database] 部分,配置数据库访问:
    [database]
    ...
    connection = mysql+pymysql://glance:GLANCE_DBPASS@controller/glance

    可用在glance镜像服务数据库设置的密码替换 GLANCE_DBPASS。
    在 [keystone_authtoken] 和 [paste_deploy] 部分,配置身份认证服务访问:

[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 = glance
password = GLANCE_PASS

[paste_deploy]
...
flavor = keystone

可用在身份认证服务创建 glance 用户的密码替换GLANCE_PASS。

注解
注释或者删除 [keystone_authtoken] 部分的其它选项。

  1. 同步镜像服务数据库:
    # su -s /bin/sh -c "glance-manage db_sync" glance

    注解
    忽略任何输出。

5.启动镜像服务并设置开机自启动:

# systemctl enable openstack-glance-api.service \
  openstack-glance-registry.service
# systemctl start openstack-glance-api.service \
  openstack-glance-registry.service

4.3验证操作
CirrOS是一个小型的Linux镜像,使用 CirrOS对镜像服务进行验证,可以用来测试 OpenStack部署。

注解
在控制节点执行如下命令。

  1. 获得 admin 凭证来获取只有管理员能执行的命令的访问权限:
    $ . admin-openrc
  2. 下载镜像:

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

    注解
    如果没有wget 命令请安装它:yum install wget -y

  3. 使用 QCOW2 磁盘格式, bare 容器格式上传镜像到镜像服务并设置公共可见,这样所有的项目都可以访问它:
$ openstack image create "cirros" \
  --file cirros-0.3.4-x86_64-disk.img \
  --disk-format qcow2 --container-format bare \
  --public

+------------------+------------------------------------------------------+
| Field            | Value                                                |
+------------------+------------------------------------------------------+
| checksum         | 133eae9fb1c98f45894a4e60d8736619                     |
| container_format | bare                                                 |
| created_at       | 2015-03-26T16:52:10Z                                 |
| disk_format      | qcow2                                                |
| file             | /v2/images/cc5c6982-4910-471e-b864-1098015901b5/file |
| id               | cc5c6982-4910-471e-b864-1098015901b5                 |
| min_disk         | 0                                                    |
| min_ram          | 0                                                    |
| name             | cirros                                               |
| owner            | ae7a98326b9c455588edd2656d723b9d                     |
| protected        | False                                                |
| schema           | /v2/schemas/image                                    |
| size             | 13200896                                             |
| status           | active                                               |
| tags             |                                                      |
| updated_at       | 2015-03-26T16:52:10Z                                 |
| virtual_size     | None                                                 |
| visibility       | public                                               |
+------------------+------------------------------------------------------+

注解
OpenStack 是动态生成 ID 的,因此您看到的输出会与示例中的命令行输出不相同。

  1. 确认镜像的上传并验证属性:
$ openstack image list

+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| 38047887-61a7-41ea-9b49-27987d5e8bb9 | cirros | active |
+--------------------------------------+--------+--------+

5.计算服务
Controller控制节点
这个部分将描述如何在控制节点上安装和配置 Compute 服务,即 nova。
5.1安装前准备
在安装和配置 Compute 服务前,你必须创建数据库服务的凭据以及 API endpoints。

  1. 创建数据库,完成如下步骤:
    用数据库连接客户端以 root 用户连接到数据库服务器:
    $ mysql -u root -p

    创建 nova_api 和 nova 数据库:

    mysql> CREATE DATABASE nova_api;
    mysql> CREATE DATABASE nova;

    给nova_api 和 nova 数据库赋予合适的权限:

    mysql> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' \
    IDENTIFIED BY 'NOVA_DBPASS';
    mysql> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' \
    IDENTIFIED BY 'NOVA_DBPASS';
    mysql> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' \
    IDENTIFIED BY 'NOVA_DBPASS';
    mysql> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \
    IDENTIFIED BY 'NOVA_DBPASS';

    可用合适的密码替换 NOVA_DBPASS。
    退出数据库连接。

  2. 获得 admin 凭证来获取只有管理员能执行的命令的访问权限:
    $ . admin-openrc
  3. 要创建服务证书,完成如下步骤:
    创建 nova 用户:
$ openstack user create --domain default \
  --password-prompt nova

User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 8a7dbf5279404537b1c7b86c033620fe |
| name                | nova                             |
| password_expires_at | None                             |
+---------------------+----------------------------------+

添加 admin 角色到 nova 用户:

$ openstack role add --project service --user nova admin

注解
此命令没有输出。

创建 nova 服务实体:

$ openstack service create --name nova \
  --description "OpenStack Compute" compute

+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Compute                |
| enabled     | True                             |
| id          | 060d59eac51b4594815603d75a00aba2 |
| name        | nova                             |
| type        | compute                          |
+-------------+----------------------------------+

3.创建Compute服务API端点:

$ openstack endpoint create --region RegionOne \
  compute public http://controller:8774/v2.1/%\(tenant_id\)s

+--------------+-------------------------------------------+
| Field        | Value                                     |
+--------------+-------------------------------------------+
| enabled      | True                                      |
| id           | 3c1caa473bfe4390a11e7177894bcc7b          |
| interface    | public                                    |
| region       | RegionOne                                 |
| region_id    | RegionOne                                 |
| service_id   | 060d59eac51b4594815603d75a00aba2          |
| service_name | nova                                      |
| service_type | compute                                   |
| url          | http://controller:8774/v2.1/%(tenant_id)s |
+--------------+-------------------------------------------+

$ openstack endpoint create --region RegionOne \
  compute internal http://controller:8774/v2.1/%\(tenant_id\)s

+--------------+-------------------------------------------+
| Field        | Value                                     |
+--------------+-------------------------------------------+
| enabled      | True                                      |
| id           | e3c918de680746a586eac1f2d9bc10ab          |
| interface    | internal                                  |
| region       | RegionOne                                 |
| region_id    | RegionOne                                 |
| service_id   | 060d59eac51b4594815603d75a00aba2          |
| service_name | nova                                      |
| service_type | compute                                   |
| url          | http://controller:8774/v2.1/%(tenant_id)s |
+--------------+-------------------------------------------+

$ openstack endpoint create --region RegionOne \
  compute admin http://controller:8774/v2.1/%\(tenant_id\)s

+--------------+-------------------------------------------+
| Field        | Value                                     |
+--------------+-------------------------------------------+
| enabled      | True                                      |
| id           | 38f7af91666a47cfb97b4dc790b94424          |
| interface    | admin                                     |
| region       | RegionOne                                 |
| region_id    | RegionOne                                 |
| service_id   | 060d59eac51b4594815603d75a00aba2          |
| service_name | nova                                      |
| service_type | compute                                   |
| url          | http://controller:8774/v2.1/%(tenant_id)s |
+--------------+-------------------------------------------+

5.2安装配置组件

注解
默认配置文件在各发行版本中可能不同。你可能需要添加这些部分,选项而不是修改已经存在的部分和选项。另外,在配置片段中的省略号(...)表示默认的配置选项你应该保留。

  1. 安装软件包:
    # yum install openstack-nova-api openstack-nova-conductor \
    openstack-nova-console openstack-nova-novncproxy \
    openstack-nova-scheduler
  2. 编辑 /etc/nova/nova.conf 文件,完成如下操作:
    在 [DEFAULT] 部分,只启用计算和元数据API:
[DEFAULT]
...
enabled_apis = osapi_compute,metadata

在 [api_database] 和 [database] 部分,配置数据库访问:

[api_database]
...
connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova_api

[database]
...
connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova

可用在nova和nova_api计算服务数据库设置的密码替换 NOVA_DBPASS。
在 [DEFAULT] 部分,配置 RabbitMQ 消息队列访问:

[DEFAULT]
...
transport_url = rabbit://openstack:RABBIT_PASS@controller

可用在RabbitMQ消息队列设置的openstack账户密码替换 RABBIT_PASS。
在 [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 = nova
password = NOVA_PASS

可用在认证服务中设置的 nova 用户密码替换 NOVA_PASS。

注解
注释或者删除 [keystone_authtoken] 部分的其它选项。

在 [DEFAULT] 部分,配置 my_ip 选项使用控制节点的管理网:

[DEFAULT]
...
my_ip = 10.0.0.10

在 [DEFAULT] 部分,允许使用网络服务:

[DEFAULT]
...
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver

注解
默认情况下,计算服务使用内置的防火墙服务。由于网络服务包含了防火墙服务,你必须使用 nova.virt.firewall.NoopFirewallDriver 防火墙服务来禁用掉计算服务内置的防火墙服务

在 [vnc] 部分,配置配置VNC代理使用控制节点的管理接口IP地址:

[vnc]
...
vncserver_listen = $my_ip
vncserver_proxyclient_address = $my_ip

在 [glance] 部分,配置本地镜像服务API:

[glance]
...
api_servers = http://controller:9292

在 [oslo_concurrency] 部分,配置锁路径:

[oslo_concurrency]
...
lock_path = /var/lib/nova/tmp

3.同步计算服务数据库:

# su -s /bin/sh -c "nova-manage api_db sync" nova
# su -s /bin/sh -c "nova-manage db sync" nova

注解
忽略任何信息输出。

4.启动计算服务并设置开机自启动:

# systemctl enable openstack-nova-api.service \
  openstack-nova-consoleauth.service openstack-nova-scheduler.service \
  openstack-nova-conductor.service openstack-nova-novncproxy.service
# systemctl start openstack-nova-api.service \
  openstack-nova-consoleauth.service openstack-nova-scheduler.service \
  openstack-nova-conductor.service openstack-nova-novncproxy.service

Compute计算节点
安装并配置计算节点。这部分描述如何在计算节点上安装并配置计算服务。计算服务支持多种hypervisors 虚拟化方式部署 instances 或 VMs. 简而言之,本次配置使用KVM计算节点扩展的QEMU虚拟机管理程序,支持对虚拟化的硬件加速。对于传统的硬件,本配置使用QEMU虚拟化。可以根据这些说明进行细微的调整,或者使用额外的计算节点来横向扩展环境。

注解
假设已经按照之前的向导配置好了第一个计算节点。如果想要配置更多的计算节点,以类似配置第一个计算节点的方式准备好其它节点。每个额外的计算节点都需要一个唯一的IP地址。

6.5.3安装配置组件

注解
默认配置文件在各发行版本中可能不同。你可能需要添加这些部分选项,而不是修改已经存在的部分和选项。此外,在配置片段中的省略号(...)表示默认的配置选项你应该保留。

  1. 安装软件包:
    # yum install openstack-nova-compute
  2. 编辑 /etc/nova/nova.conf 文件完成如下步骤:
    在 [DEFAULT] 部分,只启用计算和元数据API:
    [DEFAULT]
    ...
    enabled_apis = osapi_compute,metadata

    在 [DEFAULT] 部分,配置 RabbitMQ 消息队列访问:

    [DEFAULT]
    ...
    transport_url = rabbit://openstack:RABBIT_PASS@controller

    可用在RabbitMQ 消息队列中设置openstack 用户的密码替换 RABBIT_PASS。
    在 [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 = nova
password = NOVA_PASS

可用在认证服务中设置的 nova 用户密码替换 NOVA_PASS。

注解
注释或者删除 [keystone_authtoken] 部分的其它选项。

在 [DEFAULT] 部分,配置 my_ip 选项:

[DEFAULT]
...
my_ip = 10.0.0.11

可用在compute计算节点的管理网ip地址替换 10.0.0.11。
在 [DEFAULT] 部分,启用网络服务:

[DEFAULT]
...
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver

注解
缺省情况下,Compute 使用内置的防火墙服务。由于 Networking 包含了防火墙服务,所以你必须通过使用 nova.virt.firewall.NoopFirewallDriver来禁用Compute内置的防火墙服务。

在 [vnc] 部分,启用并配置远程控制台访问:

[vnc]
...
enabled = True
vncserver_listen = 0.0.0.0
vncserver_proxyclient_address = $my_ip
novncproxy_base_url = http://10.0.0.10:6080/vnc_auto.html

服务器组件监听所有的 IP 地址,而代理组件仅仅监听计算节点管理网络接口的 IP 地址。基本的 URL 表示可以使用 web 浏览器访问位于该计算节点上实例的远程控制台位置。

注解
10.0.0.10 是控制节点管理网的ip地址,可用使用控制节点管理网的ip地址替换10.0.0.10,尽量使用控制节点管理网的ip地址而不是域名,使用域名可能出现无法解析的情况。

在 [glance] 部分,配置镜像服务 API 的位置:

[glance]
...
api_servers = http://controller:9292
在 [oslo_concurrency] 部分,配置锁路径:
[oslo_concurrency]
...
lock_path = /var/lib/nova/tmp
  1. 检查计算节点是否支持虚拟机的硬件加速:
    $ egrep -c '(vmx|svm)' /proc/cpuinfo

    如果这个命令返回值大于等于1,说明计算节点支持硬件加速且不需要其它配置。
    如果这个命令返回值是0,说明计算节点不支持硬件加速。必须配置 libvirt 来使用 QEMU 代替 KVM。或者打开CPU虚拟化使其支持虚拟化硬件加速。
    返回值是0时,编辑 /etc/nova/nova.conf 文件的 [libvirt] 部分为如下内容:

    [libvirt]
    ...
    virt_type = qemu
  2. 启动计算服务及其依赖,并将其配置为开机自动启动:
    # systemctl enable libvirtd.service openstack-nova-compute.service
    # systemctl start libvirtd.service openstack-nova-compute.service

    注解
    如果 nova-compute 服务启动失败,检查日志 /var/log/nova/nova-compute.log. 类似报错消息如 AMQP server on controller:5672 is unreachable,说明控制节点的防火墙阻止访问5672端口。

5.4验证操作

注解
在控制节点上执行如下命令,验证计算服务操作。

  1. 获得 admin 凭证来获取只有管理员能执行的命令的访问权限:
    $ . admin-openrc
  2. 列出服务组件,以验证是否成功启动并注册了每个进程:
$ openstack compute service list

+----+--------------------+------------+----------+---------+-------+----------------------------+
| Id | Binary             | Host       | Zone     | Status  | State | Updated At                 |
+----+--------------------+------------+----------+---------+-------+----------------------------+
|  1 | nova-consoleauth   | controller | internal | enabled | up    | 2016-02-09T23:11:15.000000 |
|  2 | nova-scheduler     | controller | internal | enabled | up    | 2016-02-09T23:11:15.000000 |
|  3 | nova-conductor     | controller | internal | enabled | up    | 2016-02-09T23:11:16.000000 |
|  4 | nova-compute       | compute1   | nova     | enabled | up    | 2016-02-09T23:11:20.000000 |
+----+--------------------+------------+----------+---------+-------+----------------------------+

注解
输出应该显示三个服务组件在控制节点上启用,一个服务组件在计算节点上启用。

6.网络服务
Controller控制节点
6.1安装前准备
在配置OpenStack的neutron网络服务之前,需要创建neutron数据库、服务凭证和API端点。
1.创建数据库完成如下步骤:
用数据库连接客户端以 root 用户连接到数据库服务器:

$ mysql -u root -p

创建 neutron 数据库:

mysql> CREATE DATABASE neutron;

对 neutron 数据库赋予合适的权限:

mysql> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' \
  IDENTIFIED BY 'NEUTRON_DBPASS';
mysql> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' \
  IDENTIFIED BY 'NEUTRON_DBPASS';

可用合适的密码替换NEUTRON_DBPASS。
退出数据库连接。
1.获得 admin 凭证来获取只有管理员能执行的命令的访问权限:

$ . admin-openrc

2.创建服务证书,完成如下步骤:
创建 neutron 用户:

$ openstack user create --domain default --password-prompt neutron

User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 319f34694728440eb8ffcb27b6dd8b8a |
| name                | neutron                          |
| password_expires_at | None                             |
+---------------------+----------------------------------+

添加 admin 角色到neutron 用户:

$ openstack role add --project service --user neutron admin

注解
此命令没有输出。

创建 neutron 服务实体:

$ openstack service create --name neutron \
  --description "OpenStack Networking" network

+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Networking             |
| enabled     | True                             |
| id          | f71529314dab4a4d8eca427e701d209e |
| name        | neutron                          |
| type        | network                          |
+-------------+----------------------------------+

3.创建网络服务API端点:

$ openstack endpoint create --region RegionOne \
  network public http://controller:9696

+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 85d80a6d02fc4b7683f611d7fc1493a3 |
| interface    | public                           |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | f71529314dab4a4d8eca427e701d209e |
| service_name | neutron                          |
| service_type | network                          |
| url          | http://controller:9696           |
+--------------+----------------------------------+

$ openstack endpoint create --region RegionOne \
  network internal http://controller:9696

+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 09753b537ac74422a68d2d791cf3714f |
| interface    | internal                         |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | f71529314dab4a4d8eca427e701d209e |
| service_name | neutron                          |
| service_type | network                          |
| url          | http://controller:9696           |
+--------------+----------------------------------+

$ openstack endpoint create --region RegionOne \
  network admin http://controller:9696

+--------------+----------------------------------+
| Field        | Value                            |
+--------------+----------------------------------+
| enabled      | True                             |
| id           | 1ee14289c9374dffb5db92a5c112fc4e |
| interface    | admin                            |
| region       | RegionOne                        |
| region_id    | RegionOne                        |
| service_id   | f71529314dab4a4d8eca427e701d209e |
| service_name | neutron                          |
| service_type | network                          |
| url          | http://controller:9696           |
+--------------+----------------------------------+

6.2配置网络服务
OpenStack有公共网络和私有网络两种网络架构。在物理机中部署OpenStack时,两种网络可以选择其中一种部署,公共网络配置简单,私有网络配置复杂。但在虚拟机中部署OpenStack时,不支持公共网络部署,只支持私有网络vxlan模式部署,因此本次配置选择私有网络vxlan模式部署。
私有网络在公共网络的基础上多了layer-3服务,增加了私有网络、路由器以及浮动IP地址等内容。支持实例连接到私有网络。demo或者其他没有特权的用户可以管理自己的私有网络,包含连接公网和私网的路由器。另外,浮动IP地址可以让实例使用私有网络连接到外部网络,例如互联网。
典型的私有网络一般使用覆盖网络。覆盖网络,例如VXLAN包含了额外的数据头,这些数据头增加了开销,减少了有效内容和用户数据的可用空间。在不了解虚拟网络架构的情况下,实例尝试用以太网最大传输单元 (MTU) 1500字节发送数据包。网络服务会自动给实例提供正确的MTU的值通过DHCP的方式。但是,一些云镜像并没有使用DHCP或者忽视了DHCP MTU选项,要求使用元数据或者脚本来进行配置

注解
私有网络支持实例连接到公共网络。在控制节点安装并配置网络组件。

1.安装组件

# yum install openstack-neutron openstack-neutron-ml2 \
  openstack-neutron-linuxbridge ebtables

2.配置服务组件
编辑 /etc/neutron/neutron.conf 文件,完成如下操作:
在数据库 [database] 部分,配置数据库访问:

[database]
...
connection = mysql+pymysql://neutron:NEUTRON_DBPASS@controller/neutron

可用创建neutron数据库设置的密码替换 NEUTRON_DBPASS。

注解
注释或者删除[database] 部分的其他 connection 选项。

在 [DEFAULT] 部分,启用Modular Layer 2 (ML2)插件,路由服务和重叠的IP地址:

[DEFAULT]
...
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True

在 [DEFAULT] 部分,配置 RabbitMQ 消息队列访问:

[DEFAULT]
...
transport_url = rabbit://openstack:RABBIT_PASS@controller

可用在RabbitMQ 消息队列中设置openstack 用户的密码替换 RABBIT_PASS。
在 [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_PASS

可用在身份认证服务中设置的neutron 用户的密码替换 NEUTRON_PASS。

注解
注释或者删除[keystone_authtoken] 部分的其他选项。

在 [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_PASS

可用在身份认证服务中设置的nova 用户的密码替换 NOVA_PASS。
在 [oslo_concurrency] 部分,配置锁路径:

[oslo_concurrency]
...
lock_path = /var/lib/neutron/tmp

3.配置 Modular Layer 2 (ML2) 插件
ML2插件使用Linuxbridge机制,为实例创建layer-2虚拟网络基础设施
编辑 /etc/neutron/plugins/ml2/ml2_conf.ini 文件,完成如下内容:
在 [ml2] 部分,启用flat、VLAN和VXLAN网络:

[ml2]
...
type_drivers = flat,vlan,vxlan

在 [ml2] 部分,配置VXLAN私有网络:

[ml2]
...
tenant_network_types = vxlan

在 [ml2] 部分,启用Linuxbridge和layer-2机制:

[ml2]
...
mechanism_drivers = linuxbridge,l2population

警告
在你配置完ML2插件之后,删除可能导致数据库不一致的 type_drivers 项的值。

注解
Linuxbridge代理只支持VXLAN覆盖网络。

在 [ml2] 部分,启用端口安全扩展驱动:

[ml2]
...
extension_drivers = port_security

在 [ml2_type_flat] 部分,配置公共虚拟网络为flat网络:

[ml2_type_flat]
...
flat_networks = provider

在 [ml2_type_vxlan] 部分,配置私有网络VXLAN识别的网络范围:

[ml2_type_vxlan]
...
vni_ranges = 1:1000

在 [securitygroup] 部分,启用 ipset 增加安全组规则的高效性:

[securitygroup]
...
enable_ipset = True

4.配置Linuxbridge代理
Linuxbridge代理为实例建立layer-2虚拟网络并且处理安全组规则。
编辑 /etc/neutron/plugins/ml2/linuxbridge_agent.ini 文件完成如下步骤:
在 [linux_bridge] 部分,将 provider 虚拟网络和 provider 物理网络接口对应起来:

[linux_bridge]
physical_interface_mappings = provider:eth1

可用provider物理网络接口的名字替换 eth1。
在 [vxlan] 部分,启用VXLAN覆盖网络,配置覆盖网络的物理网络接口的IP地址,启用layer-2 population:

[vxlan]
enable_vxlan = True
local_ip = 10.0.0.10
l2_population = True

可用处理覆盖网络的底层物理网络接口的IP地址替换 10.0.0.10。本次环境搭建使用管理网络接口与其他节点建立流量隧道。因此,将10.0.0.10替换为控制节点的管理网络的IP地址。
在 [securitygroup] 部分,启用安全组并配置Linux桥接防火墙驱动:

[securitygroup]
...
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

5.配置layer-3代理
Layer-3代理为私有虚拟网络提供路由和NAT服务
编辑/etc/neutron/l3_agent.ini 文件并完成以下操作:
在 [DEFAULT] 部分,配置Linux网桥接口驱动和外部网络桥接:

[DEFAULT]
...
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver

6.配置DHCP代理
DHCP代理提供虚拟网络DHCP服务。
编辑/etc/neutron/dhcp_agent.ini 文件并完成以下操作:
在 [DEFAULT] 部分,配置Linuxbridge驱动接口,DHCP驱动并启用隔离元数据,这样在provider网络上的实例就可以通过网络来访问元数据:

[DEFAULT]
...
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = True

7.配置元数据代理
元数据代理负责提供配置信息,例如:访问实例的凭证。
编辑 /etc/neutron/metadata_agent.ini 文件完成如下操作:
在 [DEFAULT] 部分,配置元数据主机以及共享密码

[DEFAULT]
...
nova_metadata_ip = controller
metadata_proxy_shared_secret = METADATA_SECRET

可用合适的元数据代理密码替换METADATA_SECRET。
8.配置计算服务使用网络

注解
此处为controller控制节点的计算服务,而非compute计算节点。

编辑/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_PASS
service_metadata_proxy = True
metadata_proxy_shared_secret = METADATA_SECRET

可用在认证服务中设置的 neutron 用户密码替换 NEUTRON_PASS。
可用在元数据代理中设置的密码替换METADATA_SECRET。
9.完成安装

  1. 网络服务初始化脚本需要/etc/neutron/plugin.ini文件,该文件是指向ML2插件配置文件/etc/neutron/plugins/ml2/ml2_conf.ini 的超链接。如果超链接不存在,使用下面的命令创建:
    # ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini
  2. 同步数据库:

    # 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

    注解
    网络配置完成之后进行数据库同步,因为脚本需要完成服务器和插件的配置文件。

  3. 重启计算API服务:
    # systemctl restart openstack-nova-api.service
  4. 启动网络服务并设置开机自启动。
    # systemctl enable neutron-server.service \
    neutron-linuxbridge-agent.service neutron-dhcp-agent.service \
    neutron-metadata-agent.service
    # systemctl start neutron-server.service \
    neutron-linuxbridge-agent.service neutron-dhcp-agent.service \
    neutron-metadata-agent.service

    启动layer-3服务并设置开机自启动:

    # systemctl enable neutron-l3-agent.service
    # systemctl start neutron-l3-agent.service

Compute计算节点
6.3.安装组件

# yum install openstack-neutron-linuxbridge ebtables ipset

6.4.配置通用组件
网络通用组件的配置包括认证机制、消息队列和插件。

注解
默认配置文件因分布不同而不同。您可能需要添加这些部分和选项,而不是修改现有的部分和选项。此外,配置片段中的省略号(…),表示应该保留的原有的默认配置。

编辑 /etc/neutron/neutron.conf 文件完成如下操作:

在 [database] 部分,注释所有 connection项,因为计算节点不直接访问数据库。
在 [DEFAULT] 部分,配置 RabbitMQ 消息队列访问:

 [DEFAULT]
 ...
transport_url = rabbit://openstack:RABBIT_PASS@controller

可用在RabbitMQ消息队列设置的openstack账户密码替换 RABBIT_PASS。
在 [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_PASS

可用在身份认证服务中设置的neutron 用户的密码替换 NEUTRON_PASS。

注解
在 [keystone_authtoken] 中注释或者删除其他选项。

在 [oslo_concurrency] 部分,配置锁路径:

[oslo_concurrency]
...
lock_path = /var/lib/neutron/tmp

6.5.配置Linuxbridge代理
Linuxbridge代理为实例建立layer-2虚拟网络并且处理安全组规则。
编辑 /etc/neutron/plugins/ml2/linuxbridge_agent.ini 文件完成如下步骤:
在 [linux_bridge] 部分,将 provider 虚拟网络和 provider 物理网络接口对应起来:

[linux_bridge]
physical_interface_mappings = provider:eth1

可用provider物理网络接口的名字替换 eth1。
在 [vxlan] 部分,启用VXLAN覆盖网络,配置覆盖网络的物理网络接口的IP地址,启用layer-2 population:

[vxlan]
enable_vxlan = True
local_ip = 10.0.0.11
l2_population = True

可用处理覆盖网络的底层物理网络接口的IP地址替换 10.0.0.11。本次环境搭建使用管理网络接口与其他节点建立流量隧道。因此,将10.0.0.11替换为控制节点的管理网络的IP地址。
在 [securitygroup] 部分,启用安全组并配置Linux桥接防火墙驱动:

[securitygroup]
...
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

6.6.配置计算服务使用网络
编辑/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_PASS

可用在认证服务中设置的 neutron 用户密码替换 NEUTRON_PASS。
6.7.完成安装
重启计算服务:

# systemctl restart openstack-nova-compute.service

启动网络代理服务并设置开机自启动。

# systemctl enable neutron-linuxbridge-agent.service
# systemctl start neutron-linuxbridge-agent.service

验证操作

注解
在控制节点执行这些命令。

  1. 获得 admin 凭证来获取只有管理员能执行的命令的访问权限::
    $ . admin-openrc
  2. 列出加载的扩展来验证 neutron-server 进程是否正常启动:
$ neutron ext-list

+---------------------------+-----------------------------------------------+
| alias                     | name                                          |
+---------------------------+-----------------------------------------------+
| default-subnetpools       | Default Subnetpools                           |
| network-ip-availability   | Network IP Availability                       |
| network_availability_zone | Network Availability Zone                     |
| auto-allocated-topology   | Auto Allocated Topology Services              |
| ext-gw-mode               | Neutron L3 Configurable external gateway mode |
| binding                   | Port Binding                                  |
| agent                     | agent                                         |
| subnet_allocation         | Subnet Allocation                             |
| l3_agent_scheduler        | L3 Agent Scheduler                            |
| tag                       | Tag support                                   |
| external-net              | Neutron external network                      |
| net-mtu                   | Network MTU                                   |
| availability_zone         | Availability Zone                             |
| quotas                    | Quota management support                      |
| l3-ha                     | HA Router extension                           |
| flavors                   | Neutron Service Flavors                       |
| provider                  | Provider Network                              |
| multi-provider            | Multi Provider Network                        |
| address-scope             | Address scope                                 |
| extraroute                | Neutron Extra Route                           |
| timestamp_core            | Time Stamp Fields addition for core resources |
| router                    | Neutron L3 Router                             |
| extra_dhcp_opt            | Neutron Extra DHCP opts                       |
| dns-integration           | DNS Integration                               |
| security-group            | security-group                                |
| dhcp_agent_scheduler      | DHCP Agent Scheduler                          |
| router_availability_zone  | Router Availability Zone                      |
| rbac-policies             | RBAC Policies                                 |
| standard-attr-description | standard-attr-description                     |
| port-security             | Port Security                                 |
| allowed-address-pairs     | Allowed Address Pairs                         |
| dvr                       | Distributed Virtual Router                    |
+---------------------------+-----------------------------------------------+

注解
实际的输出结果也许与本例有细微的差异。

列出代理以验证启动 neutron 代理是否成功::

$ openstack network agent list

+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
| ID                                   | Agent Type         | Host       | Availability Zone | Alive | State | Binary                    |
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+
| f49a4b81-afd6-4b3d-b923-66c8f0517099 | Metadata agent     | controller | None              | True  | UP    | neutron-metadata-agent    |
| 27eee952-a748-467b-bf71-941e89846a92 | Linux bridge agent | controller | None              | True  | UP    | neutron-linuxbridge-agent |
| 08905043-5010-4b87-bba5-aedb1956e27a | Linux bridge agent | compute1   | None              | True  | UP    | neutron-linuxbridge-agent |
| 830344ff-dc36-4956-84f4-067af667a0dc | L3 agent           | controller | nova              | True  | UP    | neutron-l3-agent          |
| dd3644c9-1a3a-435a-9282-eb306b4b0391 | DHCP agent         | controller | nova              | True  | UP    | neutron-dhcp-agent        |
+--------------------------------------+--------------------+------------+-------------------+-------+-------+---------------------------+

输出结果应该包括控制节点上的四个代理和每个计算节点上的一个代理。
7.Dashboard
Dashboard(horizon)是一个web接口,使得云平台管理员以及用户可以管理不同的Openstack资源以及服务。本次署示例使用的是 Apache Web 服务器。描述如何在控制节点上安装和配置仪表盘。
Keystone身份认证服务是Dashboard所需的核心服务,可以结合图像、网络、计算等其它服务使用Dashboard。也可以在具有独立服务(如对象存储)的环境中使用Dashboard。
Controller节点
7.1安装配置组件

注解
默认配置文件在各发行版本中可能不同。你可能需要添加这些部分选项,而不是修改已经存在的部分和选项。此外,在配置片段中的省略号(...)表示默认的配置选项你应该保留。

  1. 安装软件包:
    # yum install openstack-dashboard
  2. 编辑 /etc/openstack-dashboard/local_settings 文件完成如下步骤:
    在 controller 节点上配置仪表盘使用OpenStack服务:
    OPENSTACK_HOST = "controller"

    允许所有主机访问仪表板:

    ALLOWED_HOSTS = ['*', ]

    配置 memcached会话存储服务:

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

CACHES = {
    'default': {
         'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
         'LOCATION': 'controller:11211',
    }
}

注解
注释其他的会话存储服务配置

启用第3版认证API:

OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST

启用对域的支持:

OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True

配置API版本:

OPENSTACK_API_VERSIONS = {
    "identity": 3,
    "image": 2,
    "volume": 2,
}

通过仪表盘创建用户时的默认域配置为 default:

OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "default"

通过仪表盘创建的用户默认角色配置为 user:

OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"

vxlan模式默认支持layer-3网络服务,保持原有默认配置文件即可,主要有以下内容:

OPENSTACK_NEUTRON_NETWORK = {
    ...
    'enable_router': True,
    'enable_quotas': True,
    'enable_distributed_router': False,
    'enable_ha_router': False,
    'enable_lb': True,
    'enable_firewall': True,
    'enable_***': True,
'enable_fip_topology_check': True,
}

可以选择性的配置时区:

TIME_ZONE = "Asia/Shanghai"

使用恰当的时区标识替换Asia/Shanghai。

  1. 重启web服务器以及会话存储服务:
    # systemctl restart httpd.service memcached.service

    注解
    如果当前的服务当前没有运行,用 systemctl start 来启动每个服务。

7.2验证操作
验证仪表盘的操作。在浏览器中输入http://controller/dashboard访问仪表盘。验证使用 admin或者demo用户凭证和default域凭证。如果域名controller无法解析,可用controller节点管理网ip地址10.0.0.10替换,即在浏览器中输入http://10.0.0.10/dashboard。
8.块存储服务
Controller控制节点
块存储服务(cinder)为实例提供块存储。存储的分配和消耗是由块存储驱动器,或者多后端配置的驱动器决定的。还有很多驱动程序可用:NAS/SAN,NFS,ISCSI,Ceph等。典型情况下,块服务API和调度器服务运行在控制节点上。取决于使用的驱动,卷服务器可以运行在控制节点、计算节点或单独的存储节点。
本节内容讲述如何在控制节点上安装和配置块存储服务,即cinder。在控制节点,cinder服务至少需要一个额外的磁盘为实例提供卷。
8.1安装前准备
在你安装和配置块存储服务之前,你必须创建数据库、服务证书和API端点
1.创建数据库,完成以下步骤:
用数据库连接客户端以 root 用户连接到数据库服务器:

$ mysql -u root -p

创建 cinder 数据库:

mysql> CREATE DATABASE cinder;

对 cinder 数据库赋予合适的权限:

mysql> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' \
  IDENTIFIED BY 'CINDER_DBPASS';
mysql> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' \
  IDENTIFIED BY 'CINDER_DBPASS';

可用合适的密码替换 CINDER_DBPASS。
退出数据库连接。

  1. 获得 admin 凭证来获取只有管理员能执行的命令的访问权限:
    $ . admin-openrc
  2. 创建服务证书,完成如下步骤:
    创建 cinder 用户:
$ openstack user create --domain default --password-prompt cinder

User Password:
Repeat User Password:
+---------------------+----------------------------------+
| Field               | Value                            |
+---------------------+----------------------------------+
| domain_id           | default                          |
| enabled             | True                             |
| id                  | 0dbcdd0968dd4c948eacf9eb60d82b46 |
| name                | cinder                           |
| password_expires_at | None                             |
+---------------------+----------------------------------+

添加 admin 角色到 cinder 用户:

$ openstack role add --project service --user cinder admin

注解
此命令没有输出。

创建 cinder 和 cinderv2 服务实体:

$ openstack service create --name cinder \
  --description "OpenStack Block Storage" volume

+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Block Storage          |
| enabled     | True                             |
| id          | ab3bbbef780845a1a283490d281e7fda |
| name        | cinder                           |
| type        | volume                           |
+-------------+----------------------------------+
$ openstack service create --name cinderv2 \
  --description "OpenStack Block Storage" volumev2

+-------------+----------------------------------+
| Field       | Value                            |
+-------------+----------------------------------+
| description | OpenStack Block Storage          |
| enabled     | True                             |
| id          | eb9fd245bdbc414695952e93f29fe3ac |
| name        | cinderv2                         |
| type        | volumev2                         |
+-------------+----------------------------------+

注解
块存储服务需要两个服务实体

4.创建块设备存储服务的 API 入口点:

$ openstack endpoint create --region RegionOne \
  volume public http://controller:8776/v1/%\(tenant_id\)s

  +--------------+-----------------------------------------+
  | Field        | Value                                   |
  +--------------+-----------------------------------------+
  | enabled      | True                                    |
  | id           | 03fa2c90153546c295bf30ca86b1344b        |
  | interface    | public                                  |
  | region       | RegionOne                               |
  | region_id    | RegionOne                               |
  | service_id   | ab3bbbef780845a1a283490d281e7fda        |
  | service_name | cinder                                  |
  | service_type | volume                                  |
  | url          | http://controller:8776/v1/%(tenant_id)s |
  +--------------+-----------------------------------------+

$ openstack endpoint create --region RegionOne \
  volume internal http://controller:8776/v1/%\(tenant_id\)s

  +--------------+-----------------------------------------+
  | Field        | Value                                   |
  +--------------+-----------------------------------------+
  | enabled      | True                                    |
  | id           | 94f684395d1b41068c70e4ecb11364b2        |
  | interface    | internal                                |
  | region       | RegionOne                               |
  | region_id    | RegionOne                               |
  | service_id   | ab3bbbef780845a1a283490d281e7fda        |
  | service_name | cinder                                  |
  | service_type | volume                                  |
  | url          | http://controller:8776/v1/%(tenant_id)s |
  +--------------+-----------------------------------------+

$ openstack endpoint create --region RegionOne \
  volume admin http://controller:8776/v1/%\(tenant_id\)s

  +--------------+-----------------------------------------+
  | Field        | Value                                   |
  +--------------+-----------------------------------------+
  | enabled      | True                                    |
  | id           | 4511c28a0f9840c78bacb25f10f62c98        |
  | interface    | admin                                   |
  | region       | RegionOne                               |
  | region_id    | RegionOne                               |
  | service_id   | ab3bbbef780845a1a283490d281e7fda        |
  | service_name | cinder                                  |
  | service_type | volume                                  |
  | url          | http://controller:8776/v1/%(tenant_id)s |
  +--------------+-----------------------------------------+

$ openstack endpoint create --region RegionOne \
  volumev2 public http://controller:8776/v2/%\(tenant_id\)s

+--------------+-----------------------------------------+
| Field        | Value                                   |
+--------------+-----------------------------------------+
| enabled      | True                                    |
| id           | 513e73819e14460fb904163f41ef3759        |
| interface    | public                                  |
| region       | RegionOne                               |
| region_id    | RegionOne                               |
| service_id   | eb9fd245bdbc414695952e93f29fe3ac        |
| service_name | cinderv2                                |
| service_type | volumev2                                |
| url          | http://controller:8776/v2/%(tenant_id)s |
+--------------+-----------------------------------------+

$ openstack endpoint create --region RegionOne \
  volumev2 internal http://controller:8776/v2/%\(tenant_id\)s

+--------------+-----------------------------------------+
| Field        | Value                                   |
+--------------+-----------------------------------------+
| enabled      | True                                    |
| id           | 6436a8a23d014cfdb69c586eff146a32        |
| interface    | internal                                |
| region       | RegionOne                               |
| region_id    | RegionOne                               |
| service_id   | eb9fd245bdbc414695952e93f29fe3ac        |
| service_name | cinderv2                                |
| service_type | volumev2                                |
| url          | http://controller:8776/v2/%(tenant_id)s |
+--------------+-----------------------------------------+

$ openstack endpoint create --region RegionOne \
  volumev2 admin http://controller:8776/v2/%\(tenant_id\)s

+--------------+-----------------------------------------+
| Field        | Value                                   |
+--------------+-----------------------------------------+
| enabled      | True                                    |
| id           | e652cf84dd334f359ae9b045a2c91d96        |
| interface    | admin                                   |
| region       | RegionOne                               |
| region_id    | RegionOne                               |
| service_id   | eb9fd245bdbc414695952e93f29fe3ac        |
| service_name | cinderv2                                |
| service_type | volumev2                                |
| url          | http://controller:8776/v2/%(tenant_id)s |
+--------------+-----------------------------------------+

注解
块设备存储服务每个服务实体都需要端点。

8.2安装配置组件
1.安装软件包:

# yum install openstack-cinder

2.编辑 /etc/cinder/cinder.conf 文件并完成以下步骤:
在 [database] 部分,配置数据库访问:

[database]
...
connection = mysql+pymysql://cinder:CINDER_DBPASS@controller/cinder

可用在创建 cinder 数据库时设置的密码替换 CINDER_DBPASS。
在 [DEFAULT] 部分,配置 RabbitMQ 消息队列访问:

[DEFAULT]
...
transport_url = rabbit://openstack:RABBIT_PASS@controller

可用在RabbitMQ消息队列设置的openstack账户密码替换 RABBIT_PASS
在 [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 = cinder
password = CINDER_PASS

可用在认证服务中设置的 cinder 用户密码替换 CINDER_PASS。

注解
注释或者删除 [keystone_authtoken] 部分的其它选项。

在 [DEFAULT] 部分,使用controller控制节点管理网ip地址配置 my_ip 选项:

[DEFAULT]
...
my_ip = 10.0.0.10

在 [oslo_concurrency] 部分,配置锁路径:

[oslo_concurrency]
...
lock_path = /var/lib/cinder/tmp

3.同步块存储数据库:

# su -s /bin/sh -c "cinder-manage db sync" cinder

注解
忽略输出中任何不推荐使用的信息。

4.配置计算服务使用块存储
编辑 /etc/nova/nova.conf 文件为如下内容:

[cinder]
os_region_name = RegionOne

注解
此处为controller控制节点的计算服务,而非compute计算节点。compute计算节点不需要做任何关于使用cinder的配置。

5.重启计算API服务:

# systemctl restart openstack-nova-api.service

6.启动块存储服务并设置开机自启动:

# systemctl enable openstack-cinder-api.service openstack-cinder-scheduler.service
# systemctl start openstack-cinder-api.service openstack-cinder-scheduler.service

Cinder存储节点
本节描述如何为块存储服务安装并配置存储节点。简而言之,在存储节点配有一个空的本地磁盘设备 /dev/sdb,可以根据需求替换成不同的值。cinder服务在/dev/sdb设备上使用LVM提供逻辑卷,并通过iSCSI协议映射给实例使用。同样可以根据这些修改指导,添加额外的存储节点来增加存储环境规模。
8.3安装前准备
在安装和配置块存储服务之前,必须准备好存储设备。

注解
在Cinder存储节点实施这些步骤。

1.安装支持的工具包:
安装 LVM 包:

# yum install lvm2

启动LVM服务并且设置该服务随系统启动:

# systemctl enable lvm2-lvmetad.service
# systemctl start lvm2-lvmetad.service

2.创建LVM 物理卷 /dev/sdb:

# pvcreate /dev/sdb
Physical volume "/dev/sdb" successfully created

3.创建 LVM 卷组 cinder-volumes:

# vgcreate cinder-volumes /dev/sdb
Volume group "cinder-volumes" successfully created

块存储服务会在这个卷组中创建逻辑卷。

  1. 只有实例可以访问块存储卷组。而底层的操作系统管理设备与卷关联。默认情况下,LVM卷扫描工具会默认扫描 /dev 目录,查找包含卷的块存储设备。如果系统有其它任务和lVM使用同一块设备,扫描工具检测到这些卷时会尝试配置缓存,可能会在底层操作系统和卷上产生各种问题。所以,必须重新配置LVM,让它只扫描包含cinder-volume卷组的设备。编辑/etc/lvm/lvm.conf文件并完成下面的操作:
    在devices 部分,添加一个过滤器,只接受 /dev/sdb 设备,拒绝其他所有设备:
    devices {
    ...
    filter = [ "a/sdb/", "r/.*/"]

    每个过滤器组中的元素都以 a 开头,即为accept,或以 r 开头,即为reject,并且包括一个设备名称的正则表达式规则。过滤器组必须以 r/.*/ 结束,过滤所有保留设备。可以使用vgs –vvvv命令来测试过滤器。

警告
如果您的存储节点在操作系统磁盘上使用了 LVM,您还必需添加相关的设备到过滤器中。例如,如果 /dev/sda 设备包含操作系统:
filter = [ "a/sda/", "a/sdb/", "r/.*/"]
类似地,如果您的计算节点在操作系统磁盘上使用了 LVM,您也必需修改这些节点上 /etc/lvm/lvm.conf 文件中的过滤器,将操作系统磁盘包含到过滤器中。例如,如果/dev/sda 设备包含操作系统:
filter = [ "a/sda/", "r/.*/"]

8.4安装配置组件
1.安装软件包:

# yum install openstack-cinder targetcli python-keystone

2.编辑 /etc/cinder/cinder.conf 文件并完成以下步骤:
在 [database] 部分,配置数据库访问:

[database]
...
connection = mysql+pymysql://cinder:CINDER_DBPASS@controller/cinder

可用在创建 cinder 数据库时设置的密码替换 CINDER_DBPASS。
在 [DEFAULT] 部分,配置 RabbitMQ 消息队列访问:

[DEFAULT]
...
transport_url = rabbit://openstack:RABBIT_PASS@controller

可用在RabbitMQ消息队列设置的openstack账户密码替换 RABBIT_PASS
在 [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 = cinder
password = CINDER_PASS

可用在认证服务中设置的 cinder 用户密码替换 CINDER_PASS。

注解
注释或者删除 [keystone_authtoken] 部分的其它选项。

在 [DEFAULT] 部分,配置 my_ip 选项:

[DEFAULT]
...
my_ip = 10.0.0.12

可用cinder存储节点的管理网ip地址替换 10.0.0.12。
在 [lvm] 部分,配置LVM后端包括:LVM驱动、cinder-volumes卷组、iSCSI 协议和正确的 iSCSI服务。如果 [lvm] 部分不存在,需要在文件末尾创建,内容如下:

[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
iscsi_protocol = iscsi
iscsi_helper = lioadm

在 [DEFAULT] 部分,启用 LVM 后端:

[DEFAULT]
enabled_backends = lvm

注解
后端名字是任意的。比如,本教程使用驱动的名字作为后端的名字。

在 [DEFAULT] 部分,配置镜像服务 API:

[DEFAULT]
glance_api_servers = http://controller:9292

在 [oslo_concurrency] 部分,配置锁路径:

[oslo_concurrency]
lock_path = /var/lib/cinder/tmp

3.启动块存储卷服务及其依赖的服务,并将其配置为随系统启动:

# systemctl enable openstack-cinder-volume.service target.service
# systemctl start openstack-cinder-volume.service target.service

8.5验证操作

注解
在控制节点上执行如下命令,验证块存储服务操作。

  1. 获得 admin 凭证来获取只有管理员能执行的命令的访问权限:
    $ . admin-openrc
  2. 列出服务组件以验证是否每个进程都成功启动:
$ openstack volume service list

+------------------+------------+------+---------+-------+----------------------------+
| Binary           | Host       | Zone | Status  | State | Updated_at                 |
+------------------+------------+------+---------+-------+----------------------------+
| cinder-scheduler | controller | nova | enabled | up    | 2016-09-30T02:27:41.000000 |
| cinder-volume    | block@lvm  | nova | enabled | up    | 2016-09-30T02:27:46.000000 |
+------------------+------------+------+---------+-------+----------------------------+

9.启动虚拟机
Controller节点
9.1创建虚拟网络
由于使用vxlan网络模式,因此需要创建private私有网络和provider外网。
9.1.1创建provider公网

1.在控制节点,获得 admin 凭证来获取只有管理员能执行的命令的访问权限:

$ . admin-openrc

2.创建provider外网:

$ openstack network create  --share --external \
  --provider-physical-network provider \
  --provider-network-type flat provider

Created a new network:

+---------------------------+--------------------------------------+
| Field                     | Value                                |
+---------------------------+--------------------------------------+
| admin_state_up            | UP                                   |
| availability_zone_hints   |                                      |
| availability_zones        |                                      |
| created_at                | 2016-11-02T20:36:18Z                 |
| description               |                                      |
| headers                   |                                      |
| id                        | 9793a02d-4f05-40d2-a280-407c48db0161 |
| ipv4_address_scope        | None                                 |
| ipv6_address_scope        | None                                 |
| mtu                       | 1500                                 |
| name                      | provider                             |
| port_security_enabled     | True                                 |
| project_id                | 7e188c33604d4b02ae0a99b5da68cae0     |
| provider:network_type     | flat                                 |
| provider:physical_network | provider                             |
| provider:segmentation_id  | None                                 |
| revision_number           | 3                                    |
| router:external           | External                             |
| shared                    | True                                 |
| status                    | ACTIVE                               |
| subnets                   |                                      |
| tags                      | []                                   |
| updated_at                | 2016-11-02T20:36:18Z                 |
+---------------------------+--------------------------------------+

--share 项允许所有项目使用provider虚拟网络
--external 项定义虚拟网络为外网。如果要创建内部网络,可以使用 --internal 代替,默认值也是 internal.
--provider-physical-network provider 和 --provider-network-type flat 项将flat虚拟网络连接到使用eth1网卡的flat物理网络,检查主机的以下配置信息:

ml2_conf.ini:
[ml2_type_flat]
flat_networks = provider
linuxbridge_agent.ini:
[linux_bridge]
physical_interface_mappings = provider:eth1

3.创建provider网络的子网:

$ openstack subnet create --network provider \  
--allocation-pool start=START_IP_ADDRESS,end=END_IP_ADDRESS \
--dns-nameserver DNS_RESOLVER --gateway PROVIDER_NETWORK_GATEWAY \
--subnet-range PROVIDER_NETWORK_CIDR provider

使用provider物理网络的子网CIDR标记替换 PROVIDER_NETWORK_CIDR。
使用准备分配给实例的子网网段的起始和结束ip地址替换 START_IP_ADDRESS 和 END_IP_ADDRESS。这个范围不能包括任何已经使用的ip地址。
用DNS解析服务的ip地址替换 DNS_RESOLVER。一般情况,可从主机文件/etc/resolv.conf 获取。
可用provider网关ip地址替换 PROVIDER_NETWORK_GATEWAY,一般的网关IP地址以 ”.1” 结尾。

例如
Provider公网网络203.0.113.0/24的网关为203.0.113.1。DHCP 服务从203.0.113.101 到 203.0.113.250中为每个实例分配ip地址。所有实例使用 8.8.4.4 配置DNS 解析。

$ openstack subnet create --network provider \
  --allocation-pool start=203.0.113.101,end=203.0.113.250 \
  --dns-nameserver 8.8.4.4 --gateway 203.0.113.1 \
  --subnet-range 203.0.113.0/24 provider

Created a new subnet:
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| allocation_pools  | 203.0.113.101-203.0.113.250          |
| cidr              | 203.0.113.0/24                       |
| created_at        | 2016-11-02T20:45:04Z                 |
| description       |                                      |
| dns_nameservers   | 8.8.4.4                              |
| enable_dhcp       | True                                 |
| gateway_ip        | 203.0.113.1                          |
| headers           |                                      |
| host_routes       |                                      |
| id                | 2c65ef8c-a5f3-4f51-94c1-4df0daaaab5c |
| ip_version        | 4                                    |
| ipv6_address_mode | None                                 |
| ipv6_ra_mode      | None                                 |
| name              | provider                             |
| network_id        | 9793a02d-4f05-40d2-a280-407c48db0161 |
| project_id        | 7e188c33604d4b02ae0a99b5da68cae0     |
| revision_number   | 2                                    |
| service_types     | []                                   |
| subnetpool_id     | None                                 |
| updated_at        | 2016-11-02T20:45:04Z                 |
+-------------------+--------------------------------------+

9.1.2创建selfservice私有网络

5.获得 demo 凭证来获取只有管理员能执行的命令的访问权限:

$ . demo-openrc

6.创建selfservice私有网络:

$ openstack network create selfservice

Created a new network:
+-------------------------+--------------------------------------+
| Field                   | Value                                |
+-------------------------+--------------------------------------+
| admin_state_up          | UP                                   |
| availability_zone_hints |                                      |
| availability_zones      |                                      |
| created_at              | 2016-11-04T18:20:59Z                 |
| description             |                                      |
| headers                 |                                      |
| id                      | 7c6f9b37-76b4-463e-98d8-27e5686ed083 |
| ipv4_address_scope      | None                                 |
| ipv6_address_scope      | None                                 |
| mtu                     | 1450                                 |
| name                    | selfservice                          |
| port_security_enabled   | True                                 |
| project_id              | 3828e7c22c5546e585f27b9eb5453788     |
| project_id              | 3828e7c22c5546e585f27b9eb5453788     |
| revision_number         | 3                                    |
| router:external         | Internal                             |
| shared                  | False                                |
| status                  | ACTIVE                               |
| subnets                 |                                      |
| tags                    | []                                   |
| updated_at              | 2016-11-04T18:20:59Z                 |
+-------------------------+--------------------------------------+

非特权用户一般不能在这个命令制定更多参数。服务会自动从下面的文件中的信息选择参数:

ml2_conf.ini:
[ml2]
tenant_network_types = vxlan

[ml2_type_vxlan]
vni_ranges = 1:1000

7.创建网络子网:

$ openstack subnet create --network selfservice \
  --dns-nameserver DNS_RESOLVER --gateway SELFSERVICE_NETWORK_GATEWAY \
  --subnet-range SELFSERVICE_NETWORK_CIDR selfservice

用DNS解析服务的ip地址替换 DNS_RESOLVER。一般情况,可从主机文件/etc/resolv.conf 获取。
用selfservice网关ip地址替换 SELFSERVICE_NETWORK_GATEWAY,一般的网关IP地址以 ”.1” 结尾。
用selfservice网络的子网替换 SELFSERVICE_NETWORK_CIDR。 可以使用任意值。
例如
Selfservice私有网络172.16.1.0/24的网关为172.16.1.1。DHCP 服务从172.16.1.2 到 172.16.1.254中为每个实例分配ip地址。所有实例使用 8.8.4.4 配置DNS 解析。

$ openstack subnet create --network selfservice \
  --dns-nameserver 8.8.4.4 --gateway 172.16.1.1 \
  --subnet-range 172.16.1.0/24 selfservice

Created a new subnet:
+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| allocation_pools  | 172.16.1.2-172.16.1.254              |
| cidr              | 172.16.1.0/24                        |
| created_at        | 2016-11-04T18:30:54Z                 |
| description       |                                      |
| dns_nameservers   | 8.8.4.4                              |
| enable_dhcp       | True                                 |
| gateway_ip        | 172.16.1.1                           |
| headers           |                                      |
| host_routes       |                                      |
| id                | 5c37348e-e7da-439b-8c23-2af47d93aee5 |
| ip_version        | 4                                    |
| ipv6_address_mode | None                                 |
| ipv6_ra_mode      | None                                 |
| name              | selfservice                          |
| network_id        | b9273876-5946-4f02-a4da-838224a144e7 |
| project_id        | 3828e7c22c5546e585f27b9eb5453788     |
| project_id        | 3828e7c22c5546e585f27b9eb5453788     |
| revision_number   | 2                                    |
| service_types     | []                                   |
| subnetpool_id     | None                                 |
| updated_at        | 2016-11-04T18:30:54Z                 |
+-------------------+--------------------------------------+

9.1.3创建路由
selfservice私有网络通过虚拟路由连接到provider公有网络,以双向NAT最为典型。每个路由包含至少一个私有网络接口和一个连接到公有网络网关的接口
provider公有提供网络必须包括router:external选项,以便使路由连接到外部网络,如互联网。admin 或者其他权限用户在网络创建时必须包括这个选项,或创建完成后添加。在这个环境里,创建provider网络时,router:external项由--external参数设置。
1.获得 admin 凭证来获取只有管理员能执行的命令的访问权限::

$ . admin-openrc
  1. 获得 demo 凭证来获取只有管理员能执行的命令的访问权限:
    $ . demo-openrc

    3.创建路由:

$ openstack router create router

Created a new router:
+-------------------------+--------------------------------------+
| Field                   | Value                                |
+-------------------------+--------------------------------------+
| admin_state_up          | UP                                   |
| availability_zone_hints |                                      |
| availability_zones      |                                      |
| created_at              | 2016-11-04T18:32:56Z                 |
| description             |                                      |
| external_gateway_info   | null                                 |
| flavor_id               | None                                 |
| headers                 |                                      |
| id                      | 67324374-396a-4db6-9443-c70be167a42b |
| name                    | router                               |
| project_id              | 3828e7c22c5546e585f27b9eb5453788     |
| project_id              | 3828e7c22c5546e585f27b9eb5453788     |
| revision_number         | 2                                    |
| routes                  |                                      |
| status                  | ACTIVE                               |
| updated_at              | 2016-11-04T18:32:56Z                 |
+-------------------------+--------------------------------------+

4.添加selfservice私有网络子网作为路由接口:

$ neutron router-interface-add router selfservice

Added interface bff6605d-824c-41f9-b744-21d128fc86e1 to router router.

5.在router路由上设置 provider 公网的网关:

$ neutron router-gateway-set router provider

Set gateway for router router

9.1.4验证操作
在继续操作前检查是否存在问题,以下步骤将使用网络和子网创建示例中的IP地址。
1.在控制节点上,获得 admin 凭证来获取只有管理员能执行的命令的访问权限:

$ . admin-openrc

2.查看列出网络命名空间,正常应该看到一个 qrouter 命名空间和两个 qdhcp 命名空间。

$ ip netns

qrouter-89dd2083-a160-4d75-ab3a-14239f01ea0b
qdhcp-7c6f9b37-76b4-463e-98d8-27e5686ed083
qdhcp-0e62efcd-8cee-46c7-b163-d8df05c3c5ad
  1. 列出路由器上的端口来确定公网网关的IP 地址:
$ neutron router-port-list router

+--------------------------------------+------+-------------------+------------------------------------------+
| id                                   | name | mac_address       | fixed_ips                                |
+--------------------------------------+------+-------------------+------------------------------------------+
| bff6605d-824c-41f9-b744-21d128fc86e1 |      | fa:16:3e:2f:34:9b | {"subnet_id":                            |
|                                      |      |                   | "3482f524-8bff-4871-80d4-5774c2730728",  |
|                                      |      |                   | "ip_address": "172.16.1.1"}              |
| d6fe98db-ae01-42b0-a860-37b1661f5950 |      | fa:16:3e:e8:c1:41 | {"subnet_id":                            |
|                                      |      |                   | "5cc70da8-4ee7-4565-be53-b9c011fca011",  |
|                                      |      |                   | "ip_address": "203.0.113.102"}           |
+--------------------------------------+------+-------------------+------------------------------------------+

4.从控制节点或任意公共物理网络上的节点Ping这个IP地址:

$ ping -c 4 203.0.113.102

PING 203.0.113.102 (203.0.113.102) 56(84) bytes of data.
64 bytes from 203.0.113.102: icmp_req=1 ttl=64 time=0.619 ms
64 bytes from 203.0.113.102: icmp_req=2 ttl=64 time=0.189 ms
64 bytes from 203.0.113.102: icmp_req=3 ttl=64 time=0.165 ms
64 bytes from 203.0.113.102: icmp_req=4 ttl=64 time=0.216 ms

--- 203.0.113.102 ping statistics ---
rtt min/avg/max/mdev = 0.165/0.297/0.619/0.187 ms

9.2 创建 m1.nano 实例类型
默认的最小规格的主机需要512 MB内存。对于环境中计算节点内存不足4 GB的,建议创建只需要64 MB的m1.nano规格的主机。如果只是测试,一般用m1.nano规格的主机来加载CirrOS镜像

$ openstack flavor create --id 0 --vcpus 1 --ram 64 --disk 1 m1.nano

+----------------------------+---------+
| Field                      | Value   |
+----------------------------+---------+
| OS-FLV-DISABLED:disabled   | False   |
| OS-FLV-EXT-DATA:ephemeral  | 0       |
| disk                       | 1       |
| id                         | 0       |
| name                       | m1.nano |
| os-flavor-access:is_public | True    |
| ram                        | 64      |
| rxtx_factor                | 1.0     |
| swap                       |         |
| vcpus                      | 1       |
+----------------------------+---------+

9.3生成键值对
大多数云镜像支持公共密钥认证而不是传统的密码认证。在启动实例前,需要添加公共密钥到计算服务。
1.获取 demo 项目认证:

$ . demo-openrc

2.生成并添加密钥对:

$ ssh-keygen -q -N ""
$ openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey

+-------------+-------------------------------------------------+
| Field       | Value                                           |
+-------------+-------------------------------------------------+
| fingerprint | ee:3d:2e:97:d4:e2:6a:54:6d:0d:ce:43:39:2c:ba:4d |
| name        | mykey                                           |
| user_id     | 58126687cbcc4888bfa9ab73a2256f27                |
+-------------+-------------------------------------------------+

注解
可以跳过执行ssh-keygen 命令直接使用现存的公共密钥。

3.验证添加的密钥对:

$ openstack keypair list

+-------+-------------------------------------------------+
| Name  | Fingerprint                                     |
+-------+-------------------------------------------------+
| mykey | ee:3d:2e:97:d4:e2:6a:54:6d:0d:ce:43:39:2c:ba:4d |
+-------+-------------------------------------------------+

9.4增加安全组规则
默认情况下,default安全组适用于所有实例并且包括拒绝远程访问实例的防火墙规则。对CirrOS的Linux镜像,建议至少允许ICMP(ping)和shell(SSH)访问。
• 添加规则至 default 安全组:
o 允许 ICMP (ping):

$ openstack security group rule create --proto icmp default

+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| created_at        | 2016-10-05T09:52:31Z                 |
| description       |                                      |
| direction         | ingress                              |
| ethertype         | IPv4                                 |
| headers           |                                      |
| id                | 6ee8d630-9803-4d3d-9aea-8c795abbedc2 |
| port_range_max    | None                                 |
| port_range_min    | None                                 |
| project_id        | 77ae8d7104024123af342ffb0a6f1d88     |
| project_id        | 77ae8d7104024123af342ffb0a6f1d88     |
| protocol          | icmp                                 |
| remote_group_id   | None                                 |
| remote_ip_prefix  | 0.0.0.0/0                            |
| revision_number   | 1                                    |
| security_group_id | 4ceee3d4-d2fe-46c1-895c-382033e87b0d |
| updated_at        | 2016-10-05T09:52:31Z                 |
+-------------------+--------------------------------------+

o 允许 shell (SSH) 访问:

$ openstack security group rule create --proto tcp --dst-port 22 default

+-------------------+--------------------------------------+
| Field             | Value                                |
+-------------------+--------------------------------------+
| created_at        | 2016-10-05T09:54:50Z                 |
| description       |                                      |
| direction         | ingress                              |
| ethertype         | IPv4                                 |
| headers           |                                      |
| id                | 3cd0a406-43df-4741-ab29-b5e7dcb7469d |
| port_range_max    | 22                                   |
| port_range_min    | 22                                   |
| project_id        | 77ae8d7104024123af342ffb0a6f1d88     |
| project_id        | 77ae8d7104024123af342ffb0a6f1d88     |
| protocol          | tcp                                  |
| remote_group_id   | None                                 |
| remote_ip_prefix  | 0.0.0.0/0                            |
| revision_number   | 1                                    |
| security_group_id | 4ceee3d4-d2fe-46c1-895c-382033e87b0d |
| updated_at        | 2016-10-05T09:54:50Z                 |
+-------------------+--------------------------------------+

9.5启动实例
网络配置包括provider公网和selfservice私网两个网络,分别介绍在以下两种网络模式下启动实例。
9.5.1在provider公网启动实例
9.5.1.1检查实例选项
启动实例前,一定要指定实例类型、镜像名称、网络、安全组、键值和实例名称。
1.在控制节点,获得 demo 凭证来获取只有管理员能执行的命令的访问权限:

$ . demo-openrc

2.实例类型包括分配虚拟资源策略,比如处理器、内存、存储等。
查看可使用的实例类型:

$ openstack flavor list

+----+---------+-----+------+-----------+-------+-----------+
| ID | Name    | RAM | Disk | Ephemeral | VCPUs | Is Public |
+----+---------+-----+------+-----------+-------+-----------+
| 0  | m1.nano |  64 |    1 |         0 |     1 | True      |
+----+---------+-----+------+-----------+-------+-----------+

注解
可以用ID引用实例类型

3.查看可用镜像:

$ openstack image list

+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| 390eb5f7-8d49-41ec-95b7-68c0d5d54b34 | cirros | active |
+--------------------------------------+--------+--------+

实例使用 cirros 镜像。
4.查看可用网络:

$ openstack network list

+--------------------------------------+--------------+--------------------------------------+
| ID                                   | Name         | Subnets                              |
+--------------------------------------+--------------+--------------------------------------+
| 4716ddfe-6e60-40e7-b2a8-42e57bf3c31c | selfservice  | 2112d5eb-f9d6-45fd-906e-7cabd38b7c7c |
| b5b6993c-ddf9-40e7-91d0-86806a42edb8 | provider     | 310911f6-acf0-4a47-824e-3032916582ff |
+--------------------------------------+--------------+--------------------------------------+

实例使用 provider 公网。注意要参考网络使用的ID而非网络名称。
5.列出可用安全组:

$ openstack security group list

+--------------------------------------+---------+------------------------+----------------------------------+
| ID                                   | Name    | Description            | Project                          |
+--------------------------------------+---------+------------------------+----------------------------------+
| dd2b614c-3dad-48ed-958b-b155a3b38515 | default | Default security group | a516b957032844328896baa01e0f906c |
+--------------------------------------+---------+------------------------+----------------------------------+

9.5.1.2创建实例
1.启动实例:
用 provider 网络ID替换 PROVIDER_NET_ID。

$ openstack server create --flavor m1.nano --image cirros \
  --nic net-id=PROVIDER_NET_ID --security-group default \
  --key-name mykey provider-instance

+--------------------------------------+-----------------------------------------------+
| Property                             | Value                                         |
+--------------------------------------+-----------------------------------------------+
| OS-DCF:diskConfig                    | MANUAL                                        |
| OS-EXT-AZ:availability_zone          | nova                                          |
| OS-EXT-STS:power_state               | 0                                             |
| OS-EXT-STS:task_state                | scheduling                                    |
| OS-EXT-STS:vm_state                  | building                                      |
| OS-SRV-USG:launched_at               | -                                             |
| OS-SRV-USG:terminated_at             | -                                             |
| accessIPv4                           |                                               |
| accessIPv6                           |                                               |
| adminPass                            | hdF4LMQqC5PB                                  |
| config_drive                         |                                               |
| created                              | 2015-09-17T21:58:18Z                          |
| flavor                               | m1.nano                                       |
| hostId                               |                                               |
| id                                   | 181c52ba-aebc-4c32-a97d-2e8e82e4eaaf          |
| image                                | cirros (38047887-61a7-41ea-9b49-27987d5e8bb9) |
| key_name                             | mykey                                         |
| metadata                             | {}                                            |
| name                                 | provider-instance                             |
| os-extended-volumes:volumes_attached | []                                            |
| progress                             | 0                                             |
| security_groups                      | default                                       |
| status                               | BUILD                                         |
| tenant_id                            | f5b2ccaa75ac413591f12fcaa096aa5c              |
| updated                              | 2015-09-17T21:58:18Z                          |
| user_id                              | 684286a9079845359882afc3aa5011fb              |
+--------------------------------------+-----------------------------------------------+

2.检查实例状态:

$ openstack server list

+--------------------------------------+-------------------+--------+------------------------+------------+
| ID                                   | Name              | Status | Networks               | Image Name |
+--------------------------------------+-------------------+--------+------------------------+------------+
| 181c52ba-aebc-4c32-a97d-2e8e82e4eaaf | provider-instance | ACTIVE | provider=203.0.113.103 | cirros     |
+--------------------------------------+-------------------+--------+------------------------+------------+

创建成功后,实例状态会由 BUILD 变成 ACTIVE。
9.5.1.3使用虚拟控制台访问实例
1.获取VNC会话URL,以便于通过WEB浏览器访问实例:

$ openstack console url show provider-instance

+-------+---------------------------------------------------------------------------------+
| Field | Value                                                                           |
+-------+---------------------------------------------------------------------------------+
| type  | novnc                                                                           |
| url   | http://controller:6080/vnc_auto.html?token=5eeccb47-525c-4918-ac2a-3ad1e9f1f493 |
+-------+---------------------------------------------------------------------------------+

注解
如果WEB浏览器所允许的主机不能解析 controller 主机名称,可以用controller节点管理网的ip地址10.0.0.10替换 controller。即浏览器输入:http://10.0.0.10:6080/vnc_auto.html?token=5eeccb47-525c-4918-ac2a-3ad1e9f1f493
CirrOS 镜像包括传统的用户名/密码认证方式,并需要在登录提示中提供这些认证。登录到CirrOS后,建议用命令 ping 验证网络是否互通。

2.检验是否可连接到provider物理网络网关:

$ ping -c 4 203.0.113.1

PING 203.0.113.1 (203.0.113.1) 56(84) bytes of data.
64 bytes from 203.0.113.1: icmp_req=1 ttl=64 time=0.357 ms
64 bytes from 203.0.113.1: icmp_req=2 ttl=64 time=0.473 ms
64 bytes from 203.0.113.1: icmp_req=3 ttl=64 time=0.504 ms
64 bytes from 203.0.113.1: icmp_req=4 ttl=64 time=0.470 ms

--- 203.0.113.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2998ms
rtt min/avg/max/mdev = 0.357/0.451/0.504/0.055 ms

3.检查是否可连接到互联网:

$ ping -c 4 openstack.org

PING openstack.org (174.143.194.225) 56(84) bytes of data.
64 bytes from 174.143.194.225: icmp_req=1 ttl=53 time=17.4 ms
64 bytes from 174.143.194.225: icmp_req=2 ttl=53 time=17.5 ms
64 bytes from 174.143.194.225: icmp_req=3 ttl=53 time=17.7 ms
64 bytes from 174.143.194.225: icmp_req=4 ttl=53 time=17.5 ms

--- openstack.org ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 17.431/17.575/17.734/0.143 ms

9.5.1.4远程访问实例

  1. 验证控制节点或者其他provider公网上的主机能否ping通实例:
$ ping -c 4 203.0.113.103

PING 203.0.113.103 (203.0.113.103) 56(84) bytes of data.
64 bytes from 203.0.113.103: icmp_req=1 ttl=63 time=3.18 ms
64 bytes from 203.0.113.103: icmp_req=2 ttl=63 time=0.981 ms
64 bytes from 203.0.113.103: icmp_req=3 ttl=63 time=1.06 ms
64 bytes from 203.0.113.103: icmp_req=4 ttl=63 time=0.929 ms

--- 203.0.113.103 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 0.929/1.539/3.183/0.951 ms
  1. 验证控制节点或者其他provider公网上的主机能否通过SSH访问实例:
$ ssh cirros@203.0.113.103

The authenticity of host '203.0.113.102 (203.0.113.102)' can't be established.
RSA key fingerprint is ed:05:e9:e7:52:a0:ff:83:68:94:c7:d1:f2:f8:e2:e9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '203.0.113.102' (RSA) to the list of known hosts.

9.5.2在selfservice私网启动实例
9.5.2.1检查实例选项
启动实例前,一定要指定实例类型、镜像名称、网络、安全组、键值和实例名称。
1.在控制节点,获得 demo 凭证来获取只有管理员能执行的命令的访问权限:

$ . demo-openrc

2.实例类型包括分配虚拟资源策略,比如处理器、内存、存储等。
查看可使用的实例类型:

$ openstack flavor list

+----+---------+-----+------+-----------+-------+-----------+
| ID | Name    | RAM | Disk | Ephemeral | VCPUs | Is Public |
+----+---------+-----+------+-----------+-------+-----------+
| 0  | m1.nano |  64 |    1 |         0 |     1 | True      |
+----+---------+-----+------+-----------+-------+-----------+

注解
可以用ID引用实例类型

3.查看可用镜像:

$ openstack image list

+--------------------------------------+--------+--------+
| ID                                   | Name   | Status |
+--------------------------------------+--------+--------+
| 390eb5f7-8d49-41ec-95b7-68c0d5d54b34 | cirros | active |
+--------------------------------------+--------+--------+

实例使用 cirros 镜像。
4.查看可用网络:

$ openstack network list

+--------------------------------------+-------------+--------------------------------------+
| ID                                   | Name        | Subnets                              |
+--------------------------------------+-------------+--------------------------------------+
| 4716ddfe-6e60-40e7-b2a8-42e57bf3c31c | selfservice | 2112d5eb-f9d6-45fd-906e-7cabd38b7c7c |
| b5b6993c-ddf9-40e7-91d0-86806a42edb8 | provider    | 310911f6-acf0-4a47-824e-3032916582ff |
+--------------------------------------+-------------+--------------------------------------+

实例使用 selfservice 私网。注意要参考网络使用的ID而非网络名称。
5.查看可用安全组:

$ openstack security group list

+--------------------------------------+---------+------------------------+
| ID                                   | Name    | Description            |
+--------------------------------------+---------+------------------------+
| dd2b614c-3dad-48ed-958b-b155a3b38515 | default | Default security group |
+--------------------------------------+---------+------------------------+

实例使用 default 默认安全组。
9.5.2.2创建实例
1.启动实例
使用selfservice私网ID替换 SELFSERVICE_NET_ID。

$ openstack server create --flavor m1.nano --image cirros \
  --nic net-id=SELFSERVICE_NET_ID --security-group default \
  --key-name mykey selfservice-instance

+--------------------------------------+---------------------------------------+
| Field                                | Value                                 |
+--------------------------------------+---------------------------------------+
| OS-DCF:diskConfig                    | MANUAL                                |
| OS-EXT-AZ:availability_zone          |                                       |
| OS-EXT-STS:power_state               | 0                                     |
| OS-EXT-STS:task_state                | scheduling                           |
| OS-EXT-STS:vm_state                  | building                              |
| OS-SRV-USG:launched_at               | None                                  |
| OS-SRV-USG:terminated_at             | None                                 |
| accessIPv4                           |                                       |
| accessIPv6                           |                                       |
| addresses                            |                                       |
| adminPass                            | 7KTBYHSjEz7E                          |
| config_drive                         |                                       |
| created                              | 2016-02-26T14:52:37Z                  |
| flavor                               | m1.nano                               |
| hostId                               |                                       |
| id                                   | 113c5892-e58e-4093-88c7-e33f502eaaa4|
| image                                | cirros (390eb5f7-8d49-41ec-95b7-68c0d |
|                                      | 5d54b34)                              |
| key_name                             | mykey                                 |
| name                                 | selfservice-instance                  |
| os-extended-volumes:volumes_attached | []                                  |
| progress                             | 0                                     |
| project_id                           | ed0b60bf607743088218b0a533d5943f    |
| properties                           |                                       |
| security_groups                      | [{u'name': u'default'}]               |
| status                               | BUILD                                 |
| updated                              | 2016-02-26T14:52:38Z                  |
| user_id                              | 58126687cbcc4888bfa9ab73a2256f27    |
+--------------------------------------+---------------------------------------+

2.检查实例状态:

$ openstack server list

+--------------------------------------+----------------------+--------+------------------------+
| ID                                   | Name                 | Status | Networks               |
+--------------------------------------+----------------------+--------+------------------------+
| 113c5892-e58e-4093-88c7-e33f502eaaa4 | selfservice-instance | ACTIVE | selfservice=172.16.1.3 |
| 181c52ba-aebc-4c32-a97d-2e8e82e4eaaf | provider-instance    | ACTIVE | provider=203.0.113.103 |
+--------------------------------------+----------------------+--------+------------------------+

创建成功后,实例状态会由 BUILD 变成 ACTIVE。
9.5.2.3使用虚拟控制台访问实例
1.获取VNC会话URL,以便于通过WEB浏览器访问实例:

$ openstack console url show selfservice-instance

+-------+---------------------------------------------------------------------------------+
| Field | Value                                                                           |
+-------+---------------------------------------------------------------------------------+
| type  | novnc                                                                           |
| url   | http://controller:6080/vnc_auto.html?token=5eeccb47-525c-4918-ac2a-3ad1e9f1f493 |
+-------+---------------------------------------------------------------------------------+

注解
如果WEB浏览器所允许的主机不能解析 controller 主机名称,可以用controller节点管理网的ip地址10.0.0.10替换 controller。即浏览器输入:http://10.0.0.10:6080/vnc_auto.html?token=5eeccb47-525c-4918-ac2a-3ad1e9f1f493
CirrOS 镜像包括传统的用户名/密码认证方式,并需要在登录提示中提供这些认证。登录到CirrOS后,建议用命令 ping 验证网络是否互通。

2.检查是否可连接到selfservice私网网关:

$ ping -c 4 172.16.1.1

PING 172.16.1.1 (172.16.1.1) 56(84) bytes of data.
64 bytes from 172.16.1.1: icmp_req=1 ttl=64 time=0.357 ms
64 bytes from 172.16.1.1: icmp_req=2 ttl=64 time=0.473 ms
64 bytes from 172.16.1.1: icmp_req=3 ttl=64 time=0.504 ms
64 bytes from 172.16.1.1: icmp_req=4 ttl=64 time=0.470 ms

--- 172.16.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2998ms
rtt min/avg/max/mdev = 0.357/0.451/0.504/0.055 ms

3.检查是否可访问互联网:

$ ping -c 4 openstack.org

PING openstack.org (174.143.194.225) 56(84) bytes of data.
64 bytes from 174.143.194.225: icmp_req=1 ttl=53 time=17.4 ms
64 bytes from 174.143.194.225: icmp_req=2 ttl=53 time=17.5 ms
64 bytes from 174.143.194.225: icmp_req=3 ttl=53 time=17.7 ms
64 bytes from 174.143.194.225: icmp_req=4 ttl=53 time=17.5 ms

--- openstack.org ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 17.431/17.575/17.734/0.143 ms

9.5.2.4远程访问实例
1.在provider公网上创建浮动IP地址:

$ openstack floating ip create provider

+-------------+--------------------------------------+
| Field       | Value                                |
+-------------+--------------------------------------+
| fixed_ip    | None                                 |
| id          | 3d05a9b1-b1af-4884-be1c-833a69744449 |
| instance_id | None                                 |
| ip          | 203.0.113.104                        |
| pool        | provider                             |
+-------------+--------------------------------------+

2.给实例分配浮动IP地址:

$ openstack server add floating ip selfservice-instance 203.0.113.104

注解
此命令没有输出。
3.检查浮动IP地址状态:

$ openstack server list

+--------------------------------------+----------------------+--------+---------------------------------------+
| ID                                   | Name                 | Status | Networks                              |
+--------------------------------------+----------------------+--------+---------------------------------------+
| 113c5892-e58e-4093-88c7-e33f502eaaa4 | selfservice-instance | ACTIVE | selfservice=172.16.1.3, 203.0.113.104 |
| 181c52ba-aebc-4c32-a97d-2e8e82e4eaaf | provider-instance    | ACTIVE | provider=203.0.113.103                |
+--------------------------------------+----------------------+--------+---------------------------------------+

4.验证控制节点或者其他provider公网上的主机能否通过浮动IP地址ping通实例:

$ ping -c 4 203.0.113.104

PING 203.0.113.104 (203.0.113.104) 56(84) bytes of data.
64 bytes from 203.0.113.104: icmp_req=1 ttl=63 time=3.18 ms
64 bytes from 203.0.113.104: icmp_req=2 ttl=63 time=0.981 ms
64 bytes from 203.0.113.104: icmp_req=3 ttl=63 time=1.06 ms
64 bytes from 203.0.113.104: icmp_req=4 ttl=63 time=0.929 ms

--- 203.0.113.104 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 0.929/1.539/3.183/0.951 ms
  1. 验证控制节点或者其他provider公网上的主机能否通过SSH访问实例:
$ ssh cirros@203.0.113.104

The authenticity of host '203.0.113.104 (203.0.113.104)' can't be established.
RSA key fingerprint is ed:05:e9:e7:52:a0:ff:83:68:94:c7:d1:f2:f8:e2:e9.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '203.0.113.104' (RSA) to the list of known hosts.

OpenStack官网镜像指南:https://docs.openstack.org/image-guide/


OpenStack官网镜像指南:https://docs.openstack.org/image-guide/

如有不明之处,欢迎留言提问。