【声明】
欢迎转载,转载本文请注明作者和出处
https://www.zybuluo.com/ncepuwanghui/note/389373
http://blog.csdn.net/ncepuwanghui/article/details/52034515
PDF格式下载链接:OpenStack Mitaka for Ubuntu 16.04 LTS 部署指南.pdf
本文主要参考OpenStack官方文档
OpenStack Documentation for Mitaka : Installation Guide for Ubuntu 14.04 (LTS)
若只是想搭建OpenStack平台,可参考以下链接,通过脚本自动化部署
① OpenStack Training Labs : An Automated Way To Deploy OpenStack
② 深入理解OpenStack自动化部署
③ compass4nfv
git clone https://gerrit.opnfv.org/gerrit/compass4nfv
官方文档中OpenStack提供了两种网络模型架构
Provider Networks
OpenStack最简单的部署方式,主要利用二层网络服务
(Layer-2 Services)(通过网桥和交换机连接不同网络)和VLAN划分
,其本质上是将虚拟机网络
(Virtual Networks)通过桥接
到物理网络
(Physical Networks)并利用物理网络
设施提供三层网络服务
(Layer-3 Services);此外,通过DHCP
服务向虚拟网络实例提供IP地址。
注:该方式不支持私有自服务网络
(Private Self-Service Networks),如三层路由服务
(Layer-3 Routing Services)。
Self-Service Networks
该方式和Provider Networks
方式相比,通过诸如VXLAN
方式在自服务网络
中支持三层路由服务
。
本文采用Provider Networks网络模型设计
本文选择OpenStack Mitaka版本
Compute-Focused OpenStack Design
根据OpenStack官方文档,以计算服务为主的OpenStack私有云计算平台可选取以下组件:
For a compute-focused OpenStack design architecture, the following components may be present:
Identity (keystone)
Dashboard (horizon)
Compute (nova)
Object Storage (swift)
Image (glance)
Networking (neutron)
Orchestration (heat)
OpenStack服务组件选择:
注:本文选择MariaDB(MySQL的一个分支,完全兼容MySQL)开源数据库为OpenStack组件提供后端数据访问服务。
Service Name | Component Name | Brief Description |
---|---|---|
Identity Service | Keystone | 身份服务,提供单点集成方式管理身份认证、授权、服务目录服务 |
Image Service | Glance | 镜像服务 |
Compute Service | Nova | 计算服务 |
Networking Service | Neutron | 网络服务 |
Dashboard Service | Horizon | 仪表盘,访问OpenStack服务的图形化接口 |
Block Storage Service | Cinder | 块存储服务 |
Shared File Systems Service | Manila | 共享文件系统服务,用于文件存储 |
Object Storage Service | Swift | 对象存储服务,用于对象存储和检索 |
Orchestration Service | Heat | 编排服务,基于模板创建管理云资源 |
Telemetry Data Collection Service | Ceilometer | 计量服务 |
Telemetry Alarming Service | Aodh | 警报服务 |
Database Service | Trove | 数据库服务,用于云部署关系型和非关系性数据库引擎 |
Data Processing Service | Sahara | 数据处理服务,提供一个数据处理框架,如Hadoop、Spark、Storm |
OpenStack官方文档建议网络布局如下:
本文采用如下网络设计
总共3个子网:
① 互联网连接/对外出口(External)
② Openstack管理网络(Management)
③ VM虚拟机内网连接(Data)
注:此外,本文将Block Storage Node和Object Storage Node加入Management Network。
6台Ubuntu 16.04 LTS:
① Cotroller:用于整个集群的控制,高可靠性要求。承载数据库(MySQL)、队列服务器(RabbitMQ)、和最终的web入口(Apache+Memcache)。设置一块虚拟硬盘。要求网卡eth0接External Network,eth1接Management Network子网。
② Network:网络控制节点,高网络吞吐型节点。设置一块虚拟硬盘。要求3网卡,eth0接External Network,eth1接Management Network子网, eth2接Data Network子网。
③ Compute:计算节点,高内存+CPU+IO消耗型节点。设置一块虚拟硬盘。要求网卡eth0接External Network,eth1接Management Network子网,eth2接Data Network子网。
④ BlockStorage:块存储节点,提供块存储和共享文件系统服务。设置三块虚拟硬盘,一块安装操作系统,一块用于块存储服务,一块用于共享文件系统服务。要求网卡eth0接External Network,eth1接Management Network子网。
⑤ ObjectStorage:两个对象存储节点,提供对象存储服务。设置三块虚拟硬盘,一块安装操作系统,两块用于对象存储服务。要求网卡eth0接External Network,eth1接Management Network子网。
注:上述为了方便管理,对每个节点都添加了eth0
网络接口,实际生产环境请根据实际情况配置。
服务器配置:
Node | CPU | 内存 | 存储 |
---|---|---|---|
Controller | 4核 | 16GB | 100GB |
Network | 2核 | 8GB | 100GB |
Compute | 16核 | 64GB | 300GB |
BlockStorage | 2核 | 8GB | 100GB+100GB+100GB |
ObjectStorage1 | 2核 | 8GB | 100GB+100GB+100GB |
ObjectStorage2 | 2核 | 8GB | 100GB+100GB+100GB |
注:此处资源分配超出了实际物理资源,可根据实际分配资源。
网络配置:
Node | eth0 | eth1 | eth2 |
---|---|---|---|
External Network | Management Network | Data Network | |
Controller | 192.168.1.11 | 10.0.0.11 | |
Network | 192.168.1.21 | 10.0.0.21 | 10.0.1.21 |
Compute | 192.168.1.31 | 10.0.0.31 | 10.0.1.31 |
BlockStorage | 192.168.1.41 | 10.0.0.41 | |
ObjectStorage1 | 192.168.1.51 | 10.0.0.51 | |
ObjectStorage2 | 192.168.1.52 | 10.0.0.52 | |
Subnet Mask | 255.255.255.0 | 255.255.255.0 | 255.255.255.0 |
Gateway | 192.168.1.1 | 10.0.0.1 | 10.0.1.1 |
注:由于实际网络限制, External Network通过虚拟网卡192.168.1.1
共享主机网络来访问外网
物理主机端口映射信息:
物理机端口 | 虚拟机IP | 虚拟机端口 | 服务描述 |
---|---|---|---|
11122 | 192.168.1.11 | 22 | Controller SSH 服务 |
12122 | 192.168.1.21 | 22 | Network SSH 服务 |
13122 | 192.168.1.31 | 22 | Compute SSH 服务 |
14122 | 192.168.1.41 | 22 | BlockStorage SSH 服务 |
15122 | 192.168.1.51 | 22 | ObjectStorage1 SSH 服务 |
15222 | 192.168.1.52 | 22 | ObjectStorage2 SSH 服务 |
11180 | 192.168.1.11 | 80 | OpenStack Dashboard 服务 |
6080 | 192.168.1.11 | 6080 | OpenStack Compute Service of Nova Proxy |
注:将虚拟机SSH端口映射到物理主机特定端口,以便外网通过物理主机访问虚拟机。
物理主机端口:为方便管理,针对SSH服务,将物理主机映射端口设计如下,前三位表示对应虚拟机地址末两字节,最后两位表示对应虚拟机端口。
OpenStack服务密码要求:
根据OpenStack官方文档
节点组件信息:
Node | OpenStack Service |
---|---|
Controller | mariadb-server、mongodb-server、rabbitmq-server、memcached、keystone、apache2、glance、nova-api、nova-conductor、nova-consoleauth、nova-novncproxy、nova-scheduler、neutron-server、neutron-plugin-ml2、horizon(dashboard)、cinder-api cinder-scheduler、manila-api、manila-scheduler、python-manilaclient、swift、swift-proxy、python-swiftclient、heat-api、heat-api-cfn、heat-engine、ceilometer-api、ceilometer-collector、ceilometer-agent-central、ceilometer-agent-notification、python-ceilometerclient、python-ceilometermiddleware、aodh-api、aodh-evaluator、aodh-notifier、aodh-listener、aodh-expirer、python-trove、python-troveclient、python-glanceclient、trove-common、trove-api、trove-taskmanager、trove-conductor、sahara-api、sahara-engine、sahara-templates、sahara-wsgi-api |
Network | neutron-linuxbridge-agent、neutron-l3-agent、neutron-dhcp-agent、neutron-metadata-agent |
Compute | nova-compute、neutron-linuxbridge-agent、kvm、ceilometer-agent-compute |
BlockStorage | lvm2、cinder-volume、manila-share、neutron-plugin-linuxbridge-agent |
ObjectStorage | xfsprogs、rsync、swift、swift-account、swift-container、swift-object |
各节点功能可参考下图
注:仅供参考理解,具体根据实际情况而定
注:
① 请提前设计好所需密码并登记存档,并及时登记用到的服务地址&端口信息。
② 根据实际情况,将下面Password
列替换为实际密码。
(若为测试环境,建议密码采用一定规则,方便记忆,但数据库等服务密码不要包含一些特殊字符,如:
、/
、+
、@
)
OpenStack节点主机用户&密码:
Node | Hostname | User | Password |
---|---|---|---|
Controller | controller | controller | your_password |
Controller | controller | root | your_password |
Network | network | network | your_password |
Network | network | root | your_password |
Compute | compute | compute | your_password |
Compute | compute | root | your_password |
BlockStorage | blockstorage | blockstorage | your_password |
BlockStorage | blockstorage | root | your_password |
ObjectStorage1 | objectstorage1 | objectstorage | your_password |
ObjectStorage1 | objectstorage1 | root | your_password |
ObjectStorage2 | objectstorage2 | objectstorage | your_password |
ObjectStorage2 | objectstorage2 | root | your_password |
OpenStack服务用户&密码:
Name | User | Password |
---|---|---|
Database_PASS(MariaDB/MySQL) | root | your_password |
RABBIT_PASS | openstack | your_password |
KEYSTONE_DBPASS | keystone | your_password |
ADMIN_PASS | admin | your_password |
DEMO_PASS | demo | your_password |
GLANCE_DBPASS | glance | your_password |
GLANCE_PASS | glance | your_password |
NOVA_DBPASS | nova | your_password |
NOVA_PASS | nova | your_password |
NEUTRON_DBPASS | nuetron | your_password |
NEUTRON_PASS | nuetron | your_password |
METADATA_SECRET | your_password | |
CINDER_DBPASS | cinder | your_password |
CINDER_PASS | cinder | your_password |
MANILA_DBPASS | manila | your_password |
MANILA_PASS | manila | your_password |
SWIFT_PASS | swift | your_password |
HASH_PATH_PREFIX | your_password | |
HASH_PATH_SUFFIX | your_password | |
HEAT_DBPASS | heat | your_password |
HEAT_PASS | heat | your_password |
HEAT_DOMAIN_PASS | heat_domain_admin | your_password |
CEILOMETER_DBPASS | ceilometer | your_password |
CEILOMETER_PASS | ceilometer | your_password |
AODH_DBPASS | aodh | your_password |
AODH_PASS | aodh | your_password |
TROVE_DBPASS | trove | your_password |
TROVE_PASS | trove | your_password |
SAHARA_DBPASS | sahara | your_password |
SAHARA_PASS | sahara | your_password |
OpenStack各节点服务地址&端口
参考:Firewalls and default ports
注:可执行sudo netstat -tnlp
查看
节点 | IP地址 | 端口 | 服务描述 |
---|---|---|---|
Controller | 192.168.1.11 | 22 | SSH |
Controller | 10.0.0.11 | 3306 | MariaDB(MySQL) |
Controller | 10.0.0.11 | 27017 | MongoDB |
Controller | 10.0.0.11 | 5672、25672 | RabbitMQ |
Controller | 10.0.0.11 | 4369 | Erlang端口映射守护进程(Erlang Port Mapper Daemon) |
Controller | 10.0.0.11 | 11211 | Memcached |
Controller | 10.0.0.11 | 35357 | OpenStack Identity Service of Apache HTTP Server(Admin) |
Controller | 10.0.0.11 | 5000 | OpenStack Identity Service of Apache HTTP Server(User) |
Controller | 10.0.0.11 | 9191 | OpenStack Image Service of Glance Registry |
Controller | 10.0.0.11 | 9292 | OpenStack Image Service of Glance API |
Controller | 10.0.0.11 | 8774、8775 | OpenStack Compute Service of Nova API |
Controller | 10.0.0.11 | 6080 | OpenStack Compute Service of Nova Proxy |
Controller | 10.0.0.11 | 9696 | OpenStack Networking Service of Neutron Server |
Controller | 10.0.0.11 | 80 | OpenStack Dashboard Service of Apache HTTP Server |
Controller | 10.0.0.11 | 8776 | OpenStack Block Storage Service of Cinder API |
Controller | 10.0.0.11 | 8786 | OpenStack Shared File Systems Service of Manila API |
Controller | 10.0.0.11 | 8080 | OpenStack Object Storage Service of Swift Proxy |
Controller | 10.0.0.11 | 8000 | OpenStack Orchestration Service of Heat API (CloudFormation) |
Controller | 10.0.0.11 | 8004 | OpenStack Orchestration Service of Heat API |
Controller | 10.0.0.11 | 8777 | OpenStack Telemetry Alarming Service of Ceilometer API |
Controller | 10.0.0.11 | 8042 | OpenStack Telemetry Alarming Service of Aodh API |
Controller | 10.0.0.11 | 8779 | OpenStack Database Service of Trove API |
Controller | 10.0.0.11 | 8386 | OpenStack Data Processing Service of Sahara API |
Network | 192.168.1.21 | 22 | SSH |
Compute | 192.168.1.31 | 22 | SSH |
Compute | 192.168.122.1 | 53 | Libvirt Dnsmasq |
BlockStorage | 192.168.1.41 | 22 | SSH |
BlockStorage | 10.0.0.41 | 3260 | OpenStack Block Storage Service of Tgtd(iSCSI target后台服务) |
ObjectStorage | 192.168.1.51/52 | 22 | SSH |
ObjectStorage | 10.0.0.51/52 | 873 | OpenStack Object Storage Service of Remote Sync |
ObjectStorage | 10.0.0.51/52 | 6000 | OpenStack Object Storage Service of Object |
ObjectStorage | 10.0.0.51/52 | 6001 | OpenStack Object Storage Service of Container |
ObjectStorage | 10.0.0.51/52 | 6002 | OpenStack Object Storage Service of Account |
物理机基本配置
① 开启物理主机虚拟化功能
② 在物理主机上安装VMware Workstation 12.1 Pro
VMware虚拟机配置
① 配置虚拟机网络
虚拟机网络连接方式图解:
打开VMware Workstation虚拟网络编辑器,添加如下虚拟网卡:
其中VMnet0用于配置External Network,VMnet1用于配置Management Network子网, VMnet2用于配置Data Network子网。如下图:
② 创建虚拟机,按前面要求设置CPU、内存大小,并新建网络适配器同时指定网络连接方式,各节点对应名称如下表:
Node | VMnet0 | VMnet1 | VMnet2 |
---|---|---|---|
Controller | 网络适配器 | 网络适配器2 | |
Network | 网络适配器 | 网络适配器2 | 网络适配器3 |
Compute | 网络适配器 | 网络适配器2 | 网络适配器3 |
BlockStorage | 网络适配器 | 网络适配器2 | |
ObjectStorage1 | 网络适配器 | 网络适配器2 | |
ObjectStorage2 | 网络适配器 | 网络适配器2 |
注:虚拟机中添加网络适配器的顺序跟系统内默认网卡名eth0
、eth1
、eth2
对应。
③ 开启虚拟机CPU虚拟化功能
对于每个虚拟机,虚拟机设置–>处理器设置–>虚拟化引擎,选择Intel VT-x/EPT或AMD-V/RVI
,如下图:
④ 各节点虚拟机配置如下图:
Controller节点:
Network节点:
Compute节点:
BlockStorage节点:
ObjectStorage1节点:
ObjectStorage2节点:
在VMware中创建虚拟机,安装Ubuntu 16.04 LTS
Partition disks
配置步骤: /dev/sda1
,大小200MB
,用于挂载/boot
Ext4
–>设置挂载点/boot
–>设置分区。 /
和swap
vg_system
–>按空格键选中剩余空闲空间/dev/sda
–>将修改写入磁盘并配置LVM–>新建逻辑卷–>选择卷组vg_system
–>逻辑卷名:lv_root–>设置逻辑卷大小:91GB–>新建逻辑卷–>选择卷组vg_system
–>逻辑卷名:lv_swap
–>设置逻辑卷大小为剩余空间–>完成。 启用root用户,设置root密码
sudo passwd root
为普通用户添加sudo权限
只需修改/etc/sudoers
文件:
切换到root用户,输入命令su -
,输入root用户密码。
输入命令vi /etc/sudoers
编辑/etc/sudoers
文件,在下面内容下添加一行your_username ALL=(ALL:ALL) ALL
,输入w!
强制保存,退出vi。
# User privilege specification
root ALL=(ALL:ALL) ALL
# controller
controller ALL=(ALL:ALL) ALL
注:如没有修改权限,则为/etc/sudoers
文件添加写权限chmod u+w /etc/sudoers
,修改后撤销权限chmod u-w /etc/sudoers
。
修改网卡命名方式
输入ifconfig -a
查看,发现网卡名称由udev管理命名为ens33
和ens38
,为了方便,将网卡名称修改为上述表格所示eth0
、eth1
、eth2
。
① sudo vi /etc/default/grub
把/etc/default/grub中
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX=""
改成:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0"
② 重新生成grub文件
sudo update-grub
sudo grub-mkconfig -o /boot/grub/grub.cfg
③ 重启系统,发现网卡名称已经改回eth0
、eth1
、eth2
命名格式。
注:以上步骤在Controller节点、Compute节点、Network节点配置方法相同
修改各节点网卡和VMware虚拟网卡绑定关系
可选环节:若网卡和虚拟网卡绑定关系不同,可手动指定
按照前面表格所示,修改各节点网卡名称为对应的eth0
、eth1
、eth2
以Controller节点为例
将默认网卡名eth0
和eth1
修改为eth0
和eth2
sudo vi /etc/udev/rules.d/70-persistent-net.rules
//如无该文件,新建一个即可
添加如下内容,其中00:0c:29:a9:66:8c
和00:0c:29:a9:66:96
为网卡MAC,可执行ifconfig -a
查看,根据情况自行设定:
# eth0
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:0c:29:a9:66:8c", NAME="eth0"
# eth2
SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:0c:29:a9:66:96", NAME="eth2"
保存并重启电脑sudo reboot
。
注:配置完成后,不能在虚拟机设置-->网络适配器-->高级
中点击生成MAC,否则上面MAC地址需要修改配置。
注:Compute节点、Network节点配置方法类似
设置静态IP/DNS
以Controller节点为例
① 修改文件sudo vi /etc/network/interfaces
,将默认生成的(下面内容可能没有,可能不一样,配置时视自己情况而定):
auto ens33
iface ens33 inet dhcp
改为:
#eth0 config (connect to internet)
auto eth0
iface eth0 inet static
address 192.168.1.11 #IP地址
netmask 255.255.255.0 #子网掩码
gateway 192.168.1.1 #网关
dns-nameserver 192.168.1.1 #DNS
# eth1 config (connect to openstack management network)
auto eth1
iface eth1 inet static
address 10.0.0.11 #IP地址
netmask 255.255.255.0 #子网掩码
② 重启网卡,使配置生效:
sudo /etc/init.d/networking restart
sudo service networking restart
注:若找不到上述命令或重启无效可尝试下面命令:
sudo ifdown eth0
sudo ifdown eth1
sudo ifup eth0
sudo ifup eth1
注:若提示ifdown: interface eth0 not configured
,可换下面命令尝试:
sudo ifconfig eth0 down
sudo ifconfig eth1 down
sudo ifconfig eth0 up
sudo ifconfig eth1 up
③ 运行ifconfig -a
查看网络配置信息。
④ 通过ping www.baidu.com
测试能否正常访问外网。若不能,可sudo reboot
重启节点试试。
注:Compute节点、Network节点配置方法类似
在物理主机中为各节点SSH连接配置端口映射
可参考:windows下实现端口映射
以Controller节点为例
① 利用Windows自带的netsh
配置端口映射,打开cmd
命令行,输入:
注:下面xxx.xxx.xxx.xxx
为物理主机实际IP
//配置端口映射
netsh interface portproxy add v4tov4 listenaddress=xxx.xxx.xxx.xxx listenport=11122 connectaddress=192.168.1.11 connectport=22
//或者
netsh interface portproxy add v4tov4 listenport=11122 connectaddress=192.168.1.11 connectport=22
//查看已配置的端口映射
netsh interface portproxy show v4tov4 // all
侦听 ipv4: 连接到 ipv4:
地址 端口 地址 端口
--------------- ---------- --------------- ----------
xxx.xxx.xxx.xxx 11122 192.168.1.11 22
* 11122 192.168.1.11 22
//删除端口映射
netsh interface portproxy delete v4tov4 listenaddress=xxx.xxx.xxx.xxx listenport=11122
netsh interface portproxy delete v4tov4 listenport=11122
② 在系统防火墙高级设置中配置入站规则
新建规则–>端口–>特定本地端口:11122–>允许连接–>选择域/专用/公用–>名称:VMware OpenStack Controller SSH、描述:用于VMware中OpenStack云计算平台Controller节点SSH连接
③ 配置完成后,可在外网主机,通过Xshell连接Controller节点,如下图:
注:若XShell连接失败,提示Xshell no matching outgoing encryption
,可升级Xshell版本,在链接的属性(SSH–>安全性)的加密算法列表中选择aes256-ctr,mac加密列表中选择hmac-sha2-256,保存即可。
注:其他节点配置方法类似
配置hosts文件
以Controller节点为例
OpenStack要求所有的节点主机之间都是通过host互信的,编辑所有节点主机的/etc/hosts文件,注意将YOUR_HOST_NAME替换成本节点主机名称。配置完成后在每台主机上ping通3个主机名。此外,通过配置hosts文件,可在网络环境发生变化时提供可扩展性且便于迁移。
可参考:OpenStack Doc : Controller hosts文件配置
① 执行sudo vi /etc/hosts
,添加如下内容
# config all nodes
10.0.0.11 controller
10.0.0.21 network
10.0.0.31 compute
10.0.0.41 blockstorage
10.0.0.51 objectstorage1
10.0.0.52 objectstorage2
② 注释掉除127.0.0.1
之外的环回地址项,如下:
#127.0.1.1 controller`
注:其他节点配置方法类似
至此,节点网络配置完成:
① Controller、Network、Compute等节点可互相ping通;
② Controller、Network、Compute等节点均可访问外网和进行地址解析。
配置ubuntu的更新源
使用阿里云的更新源,修改配置文件sudo vi /etc/apt/sources.list
,添加:
deb http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse
更新系统
① 更新系统
sudo apt update
sudo apt upgrade
sudo apt dist-upgrade
sudo apt autoremove
可能遇到的问题:
Ubuntu系统/boot容量不足引起的无法更新系统
解决方法:
查看/boot
分区容量df -h /boot
;查看当前使用内核版本号uname -a
;删除旧内核,输入sudo apt-get remove linux-image-
,接着按两下tab键,将显示所有的内核版本,把目前使用的版本之前的版本全部删除。最后执行
sudo update-grub
sudo grub-mkconfig -o /boot/grub/grub.cfg
② 查看系统发行版本和内核版本
network@network:~$ sudo lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 16.04 LTS
Release: 16.04
Codename: xenial
network@network:~$ uname -srpi
Linux 4.4.0-23-generic x86_64 x86_64
服务器时区设置
① 执行sudo tzselect
–>选择亚洲(Asia)–>选择中国(China)–>选择北京(Beijing)–>
② 复制文件到/etc目录下:
sudo cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
注:若在系统安装时已设置正确时区,可跳过该步骤。
统一时间源,安装NTP服务
时间服务器将为所有节点提供支持,OpenStack所有组件的时间都必须同步。本文选择安装chrony
。
Controller节点
① 安装NTP服务:sudo apt-get install chrony
② 打开文件sudo vi /etc/chrony/chrony.conf
增加以下内容,使本服务器时间与外部服务器时间同步。如果不能访问外网,NTP服务器将使用本机硬件时钟作为第二选择。
allow 10.0.0.0/24
server cn.pool.ntp.org iburst
server 127.127.1.0 iburst
③ 重启NTP使配置生效:sudo service chrony restart
注:确保网络时间服务器IP地址可以被DNS解析,如果不能,则在/etc/hosts文件中手工加入。
其他节点
① 安装NTP服务:sudo apt-get install chrony
② 打开配置文件sudo vi /etc/chrony/chrony.conf
,删除全部默认设置,只添加如下内容:
server controller iburst
③ 重启NTP服务:sudo service chrony restart
验证配置是否成功
chronyc sources -v
注:若默认配置文件误删,可执行sudo apt-get --purge remove chrony
清除式卸载chrony,再重新安装。
配置OpenStack
安装OpenStack client:
sudo apt-get install software-properties-common
sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install python-openstackclient
安装SQL数据库(MySQL/MariaDB)
Controller Node
① 安装MariaDB
sudo apt-get install mariadb-server python-mysqldb
② 为MySQL的root用户设置密码Database_PASS
。(将Database_PASS
替换为前面设计的实际密码),若无输入密码提示,可执行下面命令设置root用户密码:
sudo mysqladmin -u root password Database_PASS
注:修改mysql用户密码可用以下命令
mysqladmin -u用户名 -p旧密码 password 新密码
③ 创建文件sudo vi /etc/mysql/mariadb.conf.d/openstack.cnf
,添加如下配置信息:
[mysqld]
bind-address = 10.0.0.11
default-storage-engine = innodb
innodb_file_per_table
collation-server = utf8_general_ci
character-set-server = utf8
其中,bind-address用于绑定MySQL服务监听地址到Controller节点的Management Network网口IP,以便Compute&Network节点访问MySQL中的OpenStack配置信息。
④ 重启MySQL数据库:
sudo service mysql restart
sudo service mysql status
⑤ 查看端口监听情况。
controller@controller:~$ netstat -ntlp | grep 3306
tcp 0 0 10.0.0.11:3306 0.0.0.0:* LISTEN -
⑥ 开启MySQL安全保护措施
注:测试环境对安全要求较低可忽略该步骤
sudo mysql_secure_installation
根据提示输入当前root用户密码,根据实际需要选择后续操作。
⑦ 测试root
用户能否在本机localhost
正常登录,执行以下命令:
mysql -uroot -p
mysql -h localhost -uroot -p
若报错:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'
解决方法:
sudo mysql -u root
use mysql;
update user set plugin='' where User='root';
flush privileges;
exit;
注:下面步骤可省略。
⑧ 测试root
用户是否具有远程登录的权限
通常,不赋予root
用户远程登录的权限,即只允许root
用户在本机localhost
上登录。可执行如下命令测试:
mysql -h controller -uroot -p
mysql -h 10.0.0.11 -uroot -p
若报错,表示当前root
用户没有远程登录权限:
ERROR 1130 (HY000): Host 'controller' is not allowed to connect to this MariaDB server
若需要赋予root
远程登录权限,可执行以下命令:
注:将Database_PASS
替换为前面设计的实际密码
mysql -uroot -p
use mysql;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'Database_PASS';
FLUSH PRIVILEGES;
若不报错,可正常登录,表示当前root
用户具有远程登录权限。
安装NoSQL数据库(MongoDB)
注:只有计量服务(Telemetry Service)用到
Controller Node
① 安装MongoDB
sudo apt-get install mongodb-server mongodb-clients python-pymongo
② 打开文件sudo vi /etc/mongodb.conf
,修改配置信息:
绑定MongoDB服务监听地址到Controller节点的Management Network网口IP。
bind_ip = 10.0.0.11
MongoDB数据库默认在目录/var/lib/mongodb/journal
下创建若干1GB大小的日志文件,通过添加如下配置信息,可将每个日志文件大小限制为128 MB,总的日志文件空间大小为512MB。
# Set Journal File Size
smallfiles = true
③ 删除初始日志文件,重启MongoDB服务:
sudo service mongodb stop
sudo rm /var/lib/mongodb/journal/prealloc.*
sudo service mongodb start
安装消息队列服务(RabbitMQ)
Controller Node
① 安装RabbitMQ
sudo apt-get install rabbitmq-server
② 为OpenStack添加用户openstack
sudo rabbitmqctl add_user openstack RABBIT_PASS
注:将RABBIT_PASS
替换为前面设计的实际密码
③ 为openstack
用户配置读、写访问权限:
sudo rabbitmqctl set_permissions openstack ".*" ".*" ".*"
安装Memcached
身份服务(Identity Service)认证机制需要使用Memcached缓存令牌(Token)
Controller Node
① 安装Memcached
sudo apt-get install memcached python-memcache
② 修改配置文件sudo vi /etc/memcached.conf
,设置Memcached服务监听地址(Controller节点的Management Network网口IP)。
-l 10.0.0.11
③ 重启Memcached服务
sudo service memcached restart
注:配置完上面几步后,再Controller
节点上执行netstat -ntlp
,查看上面几种服务端口监听是否正常。
Identity服务采用RESTful设计,使用REST API提供Web服务接口。
注:常见的Web Service
方式有SOAP
、WSDL
、REST
。
部署节点:Controller Node
在MariaDB(MySQL)中创建Keystone数据库
① 以root用户登录MySQL
mysql -u root -p
② 创建数据库keystone
CREATE DATABASE keystone;
③ 授予数据库keystone
适当的权限
注:将KEYSTONE_DBPASS
替换为前面设计的实际密码。
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY 'KEYSTONE_DBPASS';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY 'KEYSTONE_DBPASS';
注:上述授权命令中,%
则代表了所有的host都能远程访问该mysql。但MySQL官方文档指出,%
并不包括localhost
。因此需要对localhost
和%
都进行授权。
④ 测试keystone
用户能否正常登录
mysql -hlocalhost -ukeystone -p
mysql -hcontroller -ukeystone -p
⑤ 测试Controller节点上的MariaDB能否被Compute&Network节点访问。可用telnet
测试,分别在Compute节点和Network节点上执行以下命令:
telnet controller 3306
生成临时管理身份认证令牌(ADMIN_TOKEN)
生成一个随机值,作为keystone初始配置时的ADMIN_TOKEN
openssl rand -hex 10
记住ADMIN_TOKEN:d57ea40f3a5eedcc70ef
安装Keystone和Apache HTTP Server with mod_wsgi
本文采用Apache HTTP server with mod_wsgi
监听端口5000
和35357
提供身份服务。默认keystone
服务已经监听端口5000
和35357
,为避免冲突,需首先关闭keystone
服务。
① 关闭keystone
服务
新建文件sudo vi /etc/init/keystone.override
,添加内容:manual
。
② 安装keystone
和Apache HTTP server
sudo apt-get install keystone apache2 libapache2-mod-wsgi
③ 修改配置文件sudo vi /etc/keystone/keystone.conf
在[DEFAULT]
处,修改管理令牌admin_token
为前面生成的ADMIN_TOKEN
值。
注:修改ADMIN_TOKEN
为实际Token值:d57ea40f3a5eedcc70ef
admin_token = ADMIN_TOKEN
在[database]
处,配置数据库访问连接。
注:将KEYSTONE_DBPASS
替换为前面设计的实际密码。
connection = mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone
在[token]
处,配置Fernet令牌提供者。
provider = fernet
④ 将配置信息写入到身份服务数据库keystone
:
su root
su -s /bin/sh -c "keystone-manage db_sync" keystone
⑤ 初始化Fernet keys:
sudo keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
配置Apache HTTP Server
① 修改配置文件sudo vi /etc/apache2/apache2.conf
,将服务器名称ServerName指向Controller节点的hostname,添加如下信息:
ServerName controller
② 新建文件sudo vi /etc/apache2/sites-available/wsgi-keystone.conf
,添加Apache HTTP Server配置信息,如下:
Listen 5000
Listen 35357
<VirtualHost *:5000>
WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
WSGIProcessGroup keystone-public
WSGIScriptAlias / /usr/bin/keystone-wsgi-public
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
ErrorLogFormat "%{cu}t %M"
ErrorLog /var/log/apache2/keystone.log
CustomLog /var/log/apache2/keystone_access.log combined
<Directory /usr/bin>
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:35357>
WSGIDaemonProcess keystone-admin processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
WSGIProcessGroup keystone-admin
WSGIScriptAlias / /usr/bin/keystone-wsgi-admin
WSGIApplicationGroup %{GLOBAL}
WSGIPassAuthorization On
ErrorLogFormat "%{cu}t %M"
ErrorLog /var/log/apache2/keystone.log
CustomLog /var/log/apache2/keystone_access.log combined
<Directory /usr/bin>
Require all granted
</Directory>
</VirtualHost>
③ 启用身份服务虚拟主机
sudo ln -s /etc/apache2/sites-available/wsgi-keystone.conf /etc/apache2/sites-enabled
④ 重启Apache HTTP Server
sudo service apache2 restart
测试是否Apache HTTP Server是否正常:
在各节点(Controller、Compute、Network)上,执行telnet命令,看能否建立连接
telnet controller 35357
telnet controller 5000
⑤ 删除keystone配置信息默认数据库,Ubuntu安装包安装keystone时默认配置采用SQLite数据库存放,但本文改用MySQL数据库存储keystone配置信息,因此可删除默认SQLite数据库。
sudo rm -f /var/lib/keystone/keystone.db
创建服务实体(Service Entity)和API路径(API Endpoints)
身份服务数据库keystone
默认是空的,必须使用之前配置时生成的临时认证令牌ADMIN_TOKEN
来初始化用于身份服务的服务实体和API路径。
① 向openstack
命令传递认证令牌值和身份服务URL
有两种方式:通过openstack命令行参数--os-token
和--os-url
;或者通过设置环境变量OS_TOKEN
和OS_URL
。建议采用设置环境变量的方式,如下:
注:修改ADMIN_TOKEN
为前面生成的实际Token值:d57ea40f3a5eedcc70ef
export OS_TOKEN=ADMIN_TOKEN
export OS_URL=http://controller:35357/v3
export OS_IDENTITY_API_VERSION=3
② 创建服务实体
身份服务管理着一个OpenStack的服务目录,通过服务目录确定其他服务是否可用。创建服务实体命令如下:
openstack service create --name keystone --description "OpenStack Identity" identity
③ 创建API路径
OpenStack每个服务可使用三种API路径变体:admin
,internal
和public
。默认情况,admin
类型的API路径可修改用户(user)和租户(tenant),而internal
和public
类型的API路径不允许该操作。创建API路径命令如下:
openstack endpoint create --region RegionOne identity public http://controller:5000/v3
openstack endpoint create --region RegionOne identity internal http://controller:5000/v3
openstack endpoint create --region RegionOne identity admin http://controller:35357/v3
创建域(Domain)、计划(Project)、用户(User)、角色(Role)
① 创建默认域
openstack domain create --description "Default Domain" default
② 创建管理计划、管理用户、管理角色
admin project
、admin user
、admin role
注:添加admin
用户时需设置密码ADMIN_PASS
为前面设计的实际密码。
openstack project create --domain default --description "Admin Project" admin
openstack user create --domain default --password-prompt admin
openstack role create admin
注:创建的任何角色都必须映射到OpenStack配置文件policy.json
指定的角色。
将admin
角色授予admin
计划和admin
用户:
openstack role add --project admin --user admin admin
③ 创建服务计划
本文创建的服务计划每个服务仅包含一个唯一用户,可根据实际情况调整。
openstack project create --domain default --description "Service Project" service
④ 创建示例计划、示例用户、普通用户角色
常规任务(非管理任务)应该使用非特权计划和用户。
注:添加demo
用户时需设置密码DEMO_PASS
为前面设计的实际密码。
openstack project create --domain default --description "Demo Project" demo
openstack user create --domain default --password-prompt demo
openstack role create user
将普通用户角色授予示例计划和示例用户:
openstack role add --project demo --user demo user
注:可重复执行上面步骤,创建其他需要的计划和用户。
验证Keystone组件配置是否正确
① 处于安全考虑,禁用临时身份认证令牌机制。
修改文件sudo vi /etc/keystone/keystone-paste.ini
,从[pipeline:public_api]
、[pipeline:admin_api]
,[pipeline:api_v3]
处移除admin_token_auth
配置信息。
② 取消环境变量OS_TOKEN
和OS_URL
unset OS_TOKEN OS_URL
③ 为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
输入admin
用户密码ADMIN_PASS
。(将ADMIN_PASS
替换为前面设计的实际密码)
若报错:
'NoneType' object has no attribute 'service_catalog'
可执行:export OS_AUTH_TYPE=password
可能还会报错:
__init__() got an unexpected keyword argument 'token'
在执行下面创建环境脚本后重新测试发现已解决,猜测是环境变量OS_TOKEN OS_URL
未取消,可再次执行unset OS_TOKEN OS_URL
试试。
③ 为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
输入demo
用户密码DEMO_PASS
。(将DEMO_PASS
替换为前面设计的实际密码)
注:上述设置OpenStack命令行参数的方式比较繁琐,可采用预先创建用户脚本的方式,在申请身份认证令牌时,只需执行如下命令:
source ~/.openstack/.admin-openrc
openstack token issue
或者
source ~/.openstack/.demo-openrc
openstack token issue
注:创建OpenStack客户端环境脚本方法如下
cd ~
mkdir ~/.openstack
为管理用户admin
创建OpenStack客户端环境脚本,vi ~/.openstack/.admin-openrc
,添加
注:将下面ADMIN_PASS
替换为前面设计的实际密码
# Add environment variables for admin
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_AUTH_TYPE=password
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
为示例用户demo
创建OpenStack客户端环境脚本,vi ~/.openstack/.demo-openrc
,添加
注:将下面DEMO_PASS
替换为前面设计的实际密码
# Add environment variables for demo
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_AUTH_TYPE=password
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
最后,测试Identity服务是否正常,访问http://192.168.1.11:35357/v3
或http://192.168.1.11:5000/v3
。可在各节点上安装curl
,访问服务API路径,下载查看信息,如下:
sudo apt-get install curl
curl http://192.168.1.11:35357/v3
curl http://192.168.1.11:5000/v3
curl http://controller:35357/v3
curl http://controller:5000/v3
得到如下信息:
{"version": {"status": "stable", "updated": "2016-04-04T00:00:00Z", "media-types": [{"base": "application/json", "type": "application/vnd.openstack.identity-v3+json"}], "id": "v3.6", "links": [{"href": "http://192.168.10.3:35357/v3/", "rel": "self"}]}}
用户可使用OpenStack镜像服务提供的REST API
查询、注册、恢复虚拟机镜像。
部署节点:Controller Node
在MariaDB中创建glance数据库
① 以root
用户登录MySQL
mysql -u root -p
② 创建glance
数据库
CREATE DATABASE glance;
③ 授予glance
数据库适当权限
注:将GLANCE_DBPASS
替换为前面设计的实际密码
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' IDENTIFIED BY 'GLANCE_DBPASS';
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' IDENTIFIED BY 'GLANCE_DBPASS';
创建Glance服务实体和API路径
① 设置OpenStack中admin
用户环境变量
source ~/.openstack/.admin-openrc
② 在OpenStack中创建一个glance用户
openstack user create --domain default --password-prompt glance
输入用户glance
的密码GLANCE_PASS
(将GLANCE_PASS
替换为前面设计的实际密码)。
③ 将admin
角色授予glance
用户和service
计划
openstack role add --project service --user glance admin
④ 创建glance服务实体
openstack service create --name glance --description "OpenStack Image" image
⑤ 创建镜像服务API路径
openstack endpoint create --region RegionOne image public http://controller:9292
openstack endpoint create --region RegionOne image internal http://controller:9292
openstack endpoint create --region RegionOne image admin http://controller:9292
安装和配置Glance服务组件
① 安装Glance
sudo apt-get install glance
② 修改配置文件sudo vi /etc/glance/glance-api.conf
。
注:将GLANCE_DBPASS
和GLANCE_PASS
替换为前面设计的实际密码。
在[database]
处,配置数据库访问连接。
connection = mysql+pymysql://glance:GLANCE_DBPASS@controller/glance
在[keystone_authtoken]
和[paste_deploy]
处,配置身份服务访问。
注:注释掉[keystone_authtoken]
处所有默认内容
[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_store]处配置本地文件系统存储和镜像文件存储位置。
stores = file,http
default_store = file
filesystem_store_datadir = /var/lib/glance/images/
③ 修改配置文件sudo vi /etc/glance/glance-registry.conf
。
注:将GLANCE_DBPASS
和GLANCE_PASS
替换为前面设计的实际密码。
在[database]
处,配置数据库访问连接。
connection = mysql+pymysql://glance:GLANCE_DBPASS@controller/glance
在[keystone_authtoken]
和[paste_deploy]
处,配置身份服务访问。
注:注释掉[keystone_authtoken]
处所有默认内容
[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数据库
su root
su -s /bin/sh -c "glance-manage db_sync" glance
⑥ 重启Image Service
sudo service glance-registry restart
sudo service glance-api restart
验证Glance服务组件配置是否正确
① 设置OpenStack admin
用户环境变量
source ~/.openstack/.admin-openrc
② 下载CirrOS系统镜像
注:此处采用CirrOS
镜像测试,也可自行选择其他系统镜像
wget http://download.cirros-cloud.net/0.3.4/cirros-0.3.4-x86_64-disk.img
③ 上传镜像,设置镜像参数磁盘格式QEMU Copy On Write 2 (QCOW2)
、容器格式bare
及可见性public
。
openstack image create "cirros" --file cirros-0.3.4-x86_64-disk.img --disk-format qcow2 --container-format bare --public
④ 确认上传是否成功,验证镜像属性。
controller@controller:~$ openstack image list
Password:
+--------------------------------------+-------------------------+--------+
| ID | Name | Status |
+--------------------------------------+-------------------------+--------+
| 6d07d4e1-3b9d-4986-b1d7-8dd92ec9bd2c | cirros | active |
+--------------------------------------+-------------------------+--------+
部署节点:Controller Node
在Controller节点上需要安装nova-api、nova-conductor、nova-consoleauth、nova-novncproxy、nova-scheduler
在MariaDB(MySQL)中创建数据库nova_api
和nova
① 以root
用户登录MySQL
mysql -u root -p
② 创建nova_api
和nova
数据库
CREATE DATABASE nova_api;
CREATE DATABASE nova;
③ 授予nova_api
和nova
数据库适当权限
注:将NOVA_DBPASS
替换为前面设计的实际密码
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY 'NOVA_DBPASS';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'NOVA_DBPASS';
创建计算服务证书和API路径
① 设置OpenStack admin
用户环境变量
source ~/.openstack/.admin-openrc
② 在OpenStack中创建nova
用户
openstack user create --domain default --password-prompt nova
输入用户nova
的密码NOVA_PASS
(将NOVA_PASS
替换为前面设计的实际密码)。
③ 将admin
角色授予nova
用户
openstack role add --project service --user nova admin
④ 创建nova
服务实体
openstack service create --name nova --description "OpenStack Compute" compute
⑤ 创建计算服务API路径
openstack endpoint create --region RegionOne compute public http://controller:8774/v2.1/%\(tenant_id\)s
openstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1/%\(tenant_id\)s
openstack endpoint create --region RegionOne compute admin http://controller:8774/v2.1/%\(tenant_id\)s
安装计算服务组件
① 安装Nova组件
sudo apt-get install nova-api nova-conductor nova-consoleauth nova-novncproxy nova-scheduler
② 修改配置文件sudo vi /etc/nova/nova.conf
。
在[DEFAULT]
处只启用compute
和metadata
APIs,将
enabled_apis=ec2,osapi_compute,metadata
修改为:
enabled_apis = osapi_compute,metadata
在[api_database]
和[database]
处配置数据库访问连接(若没有[api_database]
和[database]
标记,则手动添加)
注:将NOVA_DBPASS
替换为前面设计的实际密码
[api_database]
connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova_api
[database]
connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova
在[DEFAULT]
和[oslo_messaging_rabbit]
处配置RabbitMQ消息队里访问
注:将RABBIT_PASS
替换为前面设计的实际密码
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
在[DEFAULT]
和[keystone_authtoken]
处配置身份服务访问
注:将NOVA_PASS
替换为前面设计的实际密码
注:注释或删除[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
在[DEFAULT]
处配置my_ip
为Controller节点Management Network网口地址
[DEFAULT]
my_ip = 10.0.0.11
在[DEFAULT]
处启用网络服务支持
注:默认情况下,计算服务使用主机内部防火墙驱动,因此必须禁用OpenStack网络服务中的防火墙驱动。
[DEFAULT]
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver
在[vnc]
处,使用Controller节点Management Network网口地址配置VNC代理(VNC proxy)。
[vnc]
vncserver_listen = $my_ip
vncserver_proxyclient_address = $my_ip
在[glance]
处配置镜像服务API位置
[glance]
api_servers = http://controller:9292
在[oslo_concurrency]
处配置lock_path
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
最后,由于安装包BUG,需要在[DEFAULT]
处移除logdir
。在[DEFAULT]
处删除,以下内容
logdir=/var/log/nova
③ 将配置信息写入计算服务数据库nova
su root
su -s /bin/sh -c "nova-manage api_db sync" nova
su -s /bin/sh -c "nova-manage db sync" nova
④ 重启计算服务
sudo service nova-api restart
sudo service nova-consoleauth restart
sudo service nova-scheduler restart
sudo service nova-conductor restart
sudo service nova-novncproxy restart
部署节点:Compute Node
在Compute节点上需要安装nova-compute。
注:以下步骤在Compute节点上执行
安装配置计算服务组件
安装nova-compute
组件
sudo apt-get install nova-compute
修改配置文件sudo vi /etc/nova/nova.conf
① 在[DEFAULT]
和[oslo_messaging_rabbit]
处配置RabbitMQ消息队列访问
注:将RABBIT_PASS
替换为前面设计的实际密码
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
② 在[DEFAULT]
和[keystone_authtoken]
处配置身份服务访问
注:将NOVA_PASS
替换为前面设计的实际密码
注:注释或删除[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
在[DEFAULT]
处配置my_ip
为Compute节点Management Network网口地址
[DEFAULT]
my_ip = 10.0.0.31
在[DEFAULT]
处启用网络服务支持
[DEFAULT]
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver
在[vnc]
处配置远程控制访问
[vnc]
enabled = True
vncserver_listen = 0.0.0.0
vncserver_proxyclient_address = $my_ip
novncproxy_base_url = http://controller:6080/vnc_auto.html
注: VNC服务器端监听所有地址,VNC代理客户端只监听Compute节点Management Network网口地址,base URL设置Compute节点远程控制台浏览器访问地址(若浏览无法解析controller,则需替换为相应IP地址)。
在[glance]
处配置镜像服务API
[glance]
api_servers = http://controller:9292
在[oslo_concurrency]
处配置lock_path
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
最后,由于安装包BUG,需要在[DEFAULT]
处移除logdir
。在[DEFAULT]
处删除,以下内容
logdir=/var/log/nova
完成安装,重启计算服务
① 检测是否支持虚拟机硬件加速
egrep -c '(vmx|svm)' /proc/cpuinfo
若返回结果大于等于1,则支持,无需做额外配置;
若返回结果0,则不支持硬件加速,需要做以下额外配置:修改配置文件sudo vi /etc/nova/nova-compute.conf
中的libvirt
设置项,使用QEMU
代替KVM
。
[libvirt]
virt_type = qemu
② 重启计算服务
sudo service nova-compute restart
验证计算服务是否安装正确
注:以下步骤需在Controller节点执行
① 设置OpenStack admin
用户环境变量
source ~/.openstack/.admin-openrc
② 打印服务组件列表,验证每个成功启动和注册的进程。
openstack compute service list
结果如下:
+--+----------------+----------+--------+-------+-----+--------------------------+
|Id| Binary | Host | Zone |Status |State| Updated At |
+--+----------------+----------+--------+-------+-----+--------------------------+
| 4|nova-consoleauth|controller|internal|enabled| up |2016-05-29T06:28:52.000000|
| 5|nova-scheduler |controller|internal|enabled| up |2016-05-29T06:28:51.000000|
| 6|nova-conductor |controller|internal|enabled| up |2016-05-29T06:28:53.000000|
| 7|nova-compute |compute |nova |enabled| up |2016-05-29T06:28:45.000000|
+--+----------------+----------+--------+-------+-----+--------------------------+
部署节点:Controller Node
在MariaDB(MySQL)中创建neutron
数据库
① 以root用户登录MySQL
mysql -u root -p
② 创建数据库neutron
CREATE DATABASE neutron;
③ 授予数据库neutron
适当的权限
注:将NEUTRON_DBPASS
替换为前面设计的实际密码。
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY 'NEUTRON_DBPASS';
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY 'NEUTRON_DBPASS';
创建网络服务证书和API路径
① 设置OpenStack admin
用户环境变量
source ~/.openstack/.admin-openrc
② 在OpenStack中创建neutron
用户
openstack user create --domain default --password-prompt neutron
输入用户neutron
的密码NEUTRON_PASS
(将NEUTRON_PASS
替换为前面设计的实际密码)。
③ 将admin
角色授予neutron
用户
openstack role add --project service --user neutron admin
④ 创建neutron
服务实体
openstack service create --name neutron --description "OpenStack Networking" network
⑤ 创建网络服务API路径
openstack endpoint create --region RegionOne network public http://controller:9696
openstack endpoint create --region RegionOne network internal http://controller:9696
openstack endpoint create --region RegionOne network admin http://controller:9696
安装配置neutron-server
服务组件
① 安装neutron-server
组件
sudo apt-get install neutron-server neutron-plugin-ml2
② 修改配置文件sudo vi /etc/neutron/neutron.conf
在[database]
处配置网络服务数据库neutron
访问连接
注:将NEUTRON_DBPASS
替换为前面设计的实际密码
注:首先注释掉[database]
处已存在的默认的connection
[database]
# connection = sqlite:var/lib/neutron/neutron.sqlite
connection = mysql+pymysql://neutron:NEUTRON_DBPASS@controller/neutron
在[DEFAULT]
处启用Modular Layer 2 (ML2) plug-in
、router service
和overlapping IP addresses
[DEFAULT]
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True
在[DEFAULT]
和[oslo_messaging_rabbit]
处配置RabbitMQ消息队列访问
注:将RABBIT_PASS
替换为前面设计的实际密码
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
在[DEFAULT]
和[keystone_authtoken]
处配置身份服务访问
注:将NEUTRON_PASS
替换为前面设计的实际密码
注:注释或删除[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
在[DEFAULT]
和[nova]
处配置网络来通知计算节点网络拓扑变化。
注:将NOVA_PASS
替换为前面设计的实际密码
[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
配置Modular Layer 2 (ML2)
插件
ML2 plug-in使用Linux网桥机制为OpenStack实例建立layer-2虚拟网络设施(桥接和交换)。
修改配置文件sudo vi /etc/neutron/plugins/ml2/ml2_conf.ini
① 在[ml2]
处启用flat
、VLAN
、VXLAN
网络
注:在配置ML2
插件后,移除type_drivers设置项的部分值,将导致数据库不一致。
[ml2]
type_drivers = flat,vlan,vxlan
② 在[ml2]
处启用VXLAN self-service
网络
[ml2]
tenant_network_types = vxlan
③ 在[ml2]
处启用Linux bridge
和layer-2 population
机制
[ml2]
mechanism_drivers = linuxbridge,l2population
注:Linux Bridge Agent
只支持VXLAN overlay networks
④ 在[ml2]
处启用端口安全扩展驱动
[ml2]
extension_drivers = port_security
⑤ 在[ml2_type_flat]
处配置运营商虚拟网络为flat network
[ml2_type_flat]
flat_networks = provider
⑥ 在[ml2_type_vxlan]
处配置自服务网络中的VXLAN
网络标识符范围
[ml2_type_vxlan]
vni_ranges = 1:1000
⑦ 在[securitygroup]
处启用ipset
来增强安全组规则的效率
[securitygroup]
enable_ipset = True
将配置信息写入neutron
数据库
su root
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
为计算服务配置网络访问服务
修改配置文件sudo vi /etc/nova/nova.conf
在[neutron]
处配置访问参数,启用元数据服务代理,配置元数据代理共享密钥
注:将NEUTRON_PASS
和METADATA_SECRET
替换为前面设计的实际密码
[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
重启计算服务API和网络服务
sudo service nova-api restart
sudo service neutron-server restart
部署节点:Network Node
在Network
节点上部署组件:neutron-linuxbridge-agent
、
neutron-l3-agent
、neutron-dhcp-agent
、neutron-metadata-agent
网络服务部署架构有两种方式Provider Networks
和Self-Service Networks
,在本文开头作了简要介绍。本文采用Self-Service Networks
方式部署。
参考文档:Deploy Networking Service using the Architecture of Self-Service Networks
安装网络服务组件
sudo apt-get install neutron-linuxbridge-agent neutron-l3-agent neutron-dhcp-agent neutron-metadata-agent
配置公共服务组件
公共组件配置包括认证机制、消息队列。修改配置文件sudo vi /etc/neutron/neutron.conf
① 在[database]
处注释掉其他所有设置项,因为Network
节点不需要直接访问数据库。
② 在[DEFAULT]
和[oslo_messaging_rabbit]
处配置RabbitMQ消息队列访问
注:将RABBIT_PASS
替换为前面设计的实际密码
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
③ 在[DEFAULT]
和[keystone_authtoken]
处配置身份服务访问
注:将NEUTRON_PASS
替换为前面设计的实际密码
注:注释或删除[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
配置Linux网桥代理
Linux bridge agent为实例建立了二层虚拟网络设施,而且可以管理安全组。
修改配置文件sudo vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini
① 在[linux_bridge]
处将虚拟网络映射到物理网络
注:将PROVIDER_INTERFACE_NAME
替换为Network节点External Network网络接口名称eth0
[linux_bridge]
physical_interface_mappings = provider:PROVIDER_INTERFACE_NAME
② 在[vxlan]
处启用VXLAN overlay networks
,配置管理Overlay网络的物理网络IP地址,启用layer-2 population
注:将OVERLAY_INTERFACE_IP_ADDRESS
替换为Network节点Management Network网络接口IP地址10.0.0.21
[vxlan]
enable_vxlan = True
local_ip = OVERLAY_INTERFACE_IP_ADDRESS
l2_population = True
③ 在[securitygroup]
处启用安全组,并配置Linux bridge iptables firewall driver
[securitygroup]
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
配置三层网络代理
L3(Layer-3) Agent
位自服务网络提供了路由和NAT服务。
修改配置文件sudo vi /etc/neutron/l3_agent.ini
,在[DEFAULT]
处配置Linux网桥接口驱动(Linux Bridge Interface Driver)和外网网桥。
[DEFAULT]
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
external_network_bridge =
注:external_network_bridge
值故意空缺,这样可使多个外部网络共用一个代理。
配置DHCP
代理
修改配置文件sudo vi /etc/neutron/dhcp_agent.ini
,在[DEFAULT]
处配置Linux bridge interface driver
和Dnsmasq DHCP driver
,启用独立的metadata
使运营商网络实例可以访问虚拟网络元信息。
[DEFAULT]
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = True
配置元数据代理
元数据代理提供一些诸如证书之类的配置信息。
修改配置文件sudo vi /etc/neutron/metadata_agent.ini
,在[DEFAULT]
处配置元数据主机和共享密钥。
注:将METADATA_SECRET
替换为前面设计的实际密码
[DEFAULT]
nova_metadata_ip = controller
metadata_proxy_shared_secret = METADATA_SECRET
重启网络服务代理
sudo service neutron-linuxbridge-agent restart
sudo service neutron-dhcp-agent restart
sudo service neutron-metadata-agent restart
sudo service neutron-l3-agent restart
部署节点:Compute Node
安装网络服务组件
sudo apt-get install neutron-linuxbridge-agent
配置公共组件
公共组件配置包括认证机制、消息队列、插件。
修改配置文件sudo vi /etc/neutron/neutron.conf
① 在[database]
处注释掉其他所有设置项,因为Compute
节点不需要直接访问数据库。
② 在[DEFAULT]
和[oslo_messaging_rabbit]
处配置RabbitMQ
消息队列访问
注:将RABBIT_PASS
替换为前面设计的实际密码
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
③ 在[DEFAULT]
和[keystone_authtoken]
处配置身份服务访问
注:将NEUTRON_PASS
替换为前面设计的实际密码
注:注释或删除[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
配置网络设置
配置Linux网桥代理,修改配置文件sudo vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini
① 在[linux_bridge]
处将虚拟网络映射到物理网络
注:将PROVIDER_INTERFACE_NAME
替换为Compute节点External Network网络接口名称eth0
。
[linux_bridge]
physical_interface_mappings = provider:PROVIDER_INTERFACE_NAME
② 在[vxlan]
处启用VXLAN
覆盖网络,配置管理覆盖网络的物理网络接口IP地址,启用layer-2 population
注:将OVERLAY_INTERFACE_IP_ADDRESS
替换为Compute节点Management Network网络接口IP地址10.0.0.31
[vxlan]
enable_vxlan = True
local_ip = OVERLAY_INTERFACE_IP_ADDRESS
l2_population = True
③ 在[securitygroup]
处启用安全组,配置Linux bridge iptables firewall driver
[securitygroup]
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
配置计算服务访问网络
修改配置文件sudo vi /etc/nova/nova.conf
① 在[neutron]
处配置访问参数
注:将NEUTRON_PASS
替换为前面设计的实际密码
[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
② 重启计算服务
sudo service nova-compute restart
③ 重启Linux网桥代理
sudo service neutron-linuxbridge-agent restart
验证网络服务是否安装配置正确
① 在Controller节点上设置OpenStack管理用户admin
的环境变量
source ~/.openstack/.admin-openrc
② 列出已加载的扩展包,验证成功启动的neutron-server
进程
neutron ext-list
neutron agent-list
仪表盘是一个Web接口,可使云管理员和用户管理各种各样的OpenStack资源和服务。本文采用Apache Web Server
部署Dashboard
服务。
部署节点:Controller Node
安装Horizon
sudo apt-get install openstack-dashboard
若遇到由于openstack-dashboard-ubuntu-theme
无法安装的问题,可执行如下命令:
dpkg --remove --force-remove-reinstreq openstack-dashboard-ubuntu-theme
修改配置文件sudo vi /etc/openstack-dashboard/local_settings.py
① 在controller
节点上配置horizon
使用OpenStack Service
。
OPENSTACK_HOST = "controller"
② 配置允许所有主机都可以访问horizon
ALLOWED_HOSTS = ['*', ]
③ 配置memcached session storage service
注:注释掉其他session storage
配置信息
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': 'controller:11211',
}
}
④ 启用Identity API version 3
OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST
⑤ 启用域名支持
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
⑥ 配置API版本
OPENSTACK_API_VERSIONS = {
"identity": 3,
"image": 2,
"volume": 2,
}
⑦ 配置通过Dashboard
创建的用户默认域名为default
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "default"
⑧ 配置通过Dashboard
创建的用户的角色默认为user
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
⑨ 配置时区
注:该步骤可选配置
TIME_ZONE = "Asia/Shanghai"
重新加载Apache服务
sudo service apache2 reload
验证Dashboard
服务是否部署成功
http://controller/horizon
在物理主机中为Dashboard外网访问配置端口映射
① 利用Windows自带的netsh
配置端口映射,打开cmd
命令行,输入:
netsh interface portproxy add v4tov4 listenport=11180 connectaddress=192.168.1.11 connectport=80
② 在系统防火墙高级设置中配置入站规则
新建规则–>端口–>特定本地端口:11180
–>允许连接–>选择域/专用/公用–>名称:VMware OpenStack Dashboard HTTP Service
、描述:用于VMware中OpenStack云计算平台Dashboard服务的Web访问
③ 利用Windows自带的netsh
配置端口映射,打开cmd
命令行,输入:
netsh interface portproxy add v4tov4 listenport=6080 connectaddress=192.168.1.11 connectport=6080
④ 在系统防火墙高级设置中配置入站规则
新建规则–>端口–>特定本地端口:6080
–>允许连接–>选择域/专用/公用–>名称:VMware OpenStack Compute Service of Nova Proxy
、描述:用于VMware中OpenStack云计算平台Nova Proxy服务的Web访问
部署节点:Controller Node
在MariaDB(MySQL)中创建数据库cinder
① 以root
用户登录MySQL
mysql -u root -p
② 创建cinder
数据库
CREATE DATABASE cinder;
③ 授予cinder
数据库适当权限
注:将CINDER_DBPASS
替换为前面设计的实际密码
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' IDENTIFIED BY 'CINDER_DBPASS';
GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' IDENTIFIED BY 'CINDER_DBPASS';
创建Cinder服务实体和API路径
① 设置OpenStack中admin
用户环境变量
source ~/.openstack/.admin-openrc
② 在OpenStack中创建一个cinder
用户
openstack user create --domain default --password-prompt cinder
输入用户cinder
的密码CINDER_PASS
(将CINDER_PASS
替换为前面设计的实际密码)。
③ 将admin
角色授予cinder
用户
openstack role add --project service --user cinder admin
④ 创建cinder
和cinderv2
服务实体
openstack service create --name cinder --description "OpenStack Block Storage" volume
openstack service create --name cinderv2 --description "OpenStack Block Storage" volumev2
⑤ 创建块存储服务API路径
openstack endpoint create --region RegionOne volume public http://controller:8776/v1/%\(tenant_id\)s
openstack endpoint create --region RegionOne volume internal http://controller:8776/v1/%\(tenant_id\)s
openstack endpoint create --region RegionOne volume admin http://controller:8776/v1/%\(tenant_id\)s
openstack endpoint create --region RegionOne volumev2 public http://controller:8776/v2/%\(tenant_id\)s
openstack endpoint create --region RegionOne volumev2 internal http://controller:8776/v2/%\(tenant_id\)s
openstack endpoint create --region RegionOne volumev2 admin http://controller:8776/v2/%\(tenant_id\)s
安装和配置Cinder服务组件
① 安装Cinder
sudo apt-get install cinder-api cinder-scheduler
② 修改配置文件sudo vi /etc/cinder/cinder.conf
。
注:将CINDER_DBPASS
、CINDER_PASS
和RABBIT_PASS
替换为前面设计的实际密码。
在[database]
处配置数据访问连接:
[database]
connection = mysql+pymysql://cinder:CINDER_DBPASS@controller/cinder
在[DEFAULT]
和[oslo_messaging_rabbit]
处配置RabbitMQ消息队列访问:
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
在[DEFAULT]
和[keystone_authtoken]
处配置认证服务访问:
注:注释或删除[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
在[DEFAULT]
处配置my_ip
为Controller节点Management Networ网络接口地址:
[DEFAULT]
my_ip = 10.0.0.11
在[oslo_concurrency]
处配置lock_path
:
[oslo_concurrency]
lock_path = /var/lib/cinder/tmp
③ 将配置信息写入块存储服务数据库cinder
su root
su -s /bin/sh -c "cinder-manage db sync" cinder
配置计算服务调用块存储服务
修改配置文件sudo vi /etc/nova/nova.conf
,添加如下信息:
[cinder]
os_region_name = RegionOne
重启计算服务API和块存储服务
sudo service nova-api restart
sudo service cinder-scheduler restart
sudo service cinder-api restart
部署节点:BlockStorage Node
安装配置LVM
① 安装LVM:
sudo apt-get install lvm2
② 创建LVM物理卷/dev/sdb
:
sudo pvcreate /dev/sdb
③ 创建LVM卷组cinder-volumes
sudo vgcreate cinder-volumes /dev/sdb
④ 配置只有OpenStack实例才可以访问块存储卷
修改配置文件sudo vi /etc/lvm/lvm.conf
,在devices
处添加一个过滤器,使OpenStack实例只允许访问/dev/sdb
。
filter = [ "a/sdb/", "r/.*/"]
注:如果块存储节点操作系统磁盘也使用了逻辑卷管理LVM,则在过滤器中必须将操作系统磁盘LVM所在设备/dev/sda
也添加到允许访问列表。例如本文各节点系统磁盘均采用LVM,则应添加下面过滤器:
filter = [ "a/sda/", "a/sdb/", "r/.*/"]
注:如果Compute节点操作系统磁盘(如/dev/sda
)也使用LVM,则必须在Compute节点上修改配置文件sudo vi /etc/lvm/lvm.conf
,将操作系统磁盘添加到过滤器允许访问列表。如下:
filter = [ "a/sda/", "r/.*/"]
安装配置块存储服务组件
① 安装cinder
sudo apt-get install cinder-volume
② 修改配置文件sudo vi /etc/cinder/cinder.conf
注:将CINDER_DBPASS
、CINDER_PASS
和RABBIT_PASS
替换为前面设计的实际密码。
在[database]
处配置数据库访问连接:
[database]
connection = mysql+pymysql://cinder:CINDER_DBPASS@controller/cinder
在[DEFAULT]
和[oslo_messaging_rabbit]
处配置RabbitMQ消息队列访问服务:
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
在[DEFAULT]
和[keystone_authtoken]
处配置身份认证服务访问:
注:注释或删除[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
在[DEFAULT]
处配置my_ip
为BlockStorage节点Management Networ网络接口地址:
[DEFAULT]
my_ip = 10.0.0.41
在[lvm]
处添加LVM后端驱动、卷组、iSCSI协议和服务,如下:
[lvm]
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
iscsi_protocol = iscsi
iscsi_helper = tgtadm
在[DEFAULT]
处配置LVM后端名称(可任意设置,为了简单,本文设置为lvm):
[DEFAULT]
enabled_backends = lvm
在[DEFAULT]
处配置镜像服务API路径:
[DEFAULT]
glance_api_servers = http://controller:9292
在[oslo_concurrency]
处配置lock_path
:
[oslo_concurrency]
lock_path = /var/lib/cinder/tmp
③ 重启块存储服务
sudo service tgt restart
sudo service cinder-volume restart
验证块存储服务是否安装配置正确
① 在Controller节点上设置OpenStack管理用户admin
的环境变量
source ~/.openstack/.admin-openrc
② 列出块存储服务组件,验证成功启动的cinder
进程
cinder service-list
共享文件系统服务可以提供对共享文件系统或分布式文件系统的访问。
部署节点:Controller Node
在MariaDB(MySQL)中创建数据库manila
① 以root
用户登录MySQL
mysql -u root -p
② 创建manila
数据库
CREATE DATABASE manila;
③ 授予manila
数据库适当权限
注:将MANILA_DBPASS
替换为前面设计的实际密码
GRANT ALL PRIVILEGES ON manila.* TO 'manila'@'localhost' IDENTIFIED BY 'MANILA_DBPASS';
GRANT ALL PRIVILEGES ON manila.* TO 'manila'@'%' IDENTIFIED BY 'MANILA_DBPASS';
创建Manila服务实体和API路径
① 设置OpenStack中admin
用户环境变量
source ~/.openstack/.admin-openrc
② 在OpenStack中创建一个manila
用户
openstack user create --domain default --password-prompt manila
输入用户manila
的密码MANILA_PASS
(将MANILA_PASS
替换为前面设计的实际密码)。
③ 将admin
角色授予manila
用户
openstack role add --project service --user manila admin
④ 创建manila
和manilav2
服务实体
openstack service create --name manila --description "OpenStack Shared File Systems" share
openstack service create --name manilav2 --description "OpenStack Shared File Systems" sharev2
⑤ 创建共享文件系统服务API路径
openstack endpoint create --region RegionOne share public http://controller:8786/v1/%\(tenant_id\)s
openstack endpoint create --region RegionOne share internal http://controller:8786/v1/%\(tenant_id\)s
openstack endpoint create --region RegionOne share admin http://controller:8786/v1/%\(tenant_id\)s
openstack endpoint create --region RegionOne sharev2 public http://controller:8786/v2/%\(tenant_id\)s
openstack endpoint create --region RegionOne sharev2 internal http://controller:8786/v2/%\(tenant_id\)s
openstack endpoint create --region RegionOne sharev2 admin http://controller:8786/v2/%\(tenant_id\)s
安装和配置Manila服务组件
① 安装Manila
sudo apt-get install manila-api manila-scheduler python-manilaclient
② 修改配置文件sudo vi /etc/manila/manila.conf
。
注:将MANILA_DBPASS
、MANILA_PASS
和RABBIT_PASS
替换为前面设计的实际密码。
在[database]
处配置数据访问连接:
[database]
connection = mysql+pymysql://manila:MANILA_DBPASS@controller/manila
在[DEFAULT]
和[oslo_messaging_rabbit]
处配置RabbitMQ消息队列访问:
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
在[DEFAULT]
处添加如下配置信息:
default_share_type = default_share_type
rootwrap_config = /etc/manila/rootwrap.conf
在[DEFAULT]
和[keystone_authtoken]
处配置认证服务访问:
注:注释或删除[keystone_authtoken]
处其他默认设置。
[DEFAULT]
auth_strategy = keystone
[keystone_authtoken]
memcached_servers = controller:11211
auth_uri = http://controller:5000
auth_url = http://controller:35357
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = manila
password = MANILA_PASS
在[DEFAULT]
处配置my_ip
为Controller节点Management Networ网络接口地址:
[DEFAULT]
my_ip = 10.0.0.11
在[oslo_concurrency]
处配置lock_path
:
[oslo_concurrency]
lock_path = /var/lib/manila/tmp
③ 将配置信息写入块存储服务数据库manila
su root
su -s /bin/sh -c "manila-manage db sync" manila
重启共享文件系统服务
sudo service manila-scheduler restart
sudo service manila-api restart
部署节点:BlockStorage Node
安装共享文件系统服务组件
① 安装manila
sudo apt-get install manila-share python-pymysql
② 修改配置文件sudo vi /etc/manila/manila.conf
注:将MANILA_DBPASS
、MANILA_PASS
和RABBIT_PASS
替换为前面设计的实际密码。
在[database]
处配置数据库访问连接:
[database]
connection = mysql+pymysql://manila:MANILA_DBPASS@controller/manila
在[DEFAULT]
和[oslo_messaging_rabbit]
处配置RabbitMQ消息队列访问服务:
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
在[DEFAULT]
处添加如下配置信息:
default_share_type = default_share_type
rootwrap_config = /etc/manila/rootwrap.conf
在[DEFAULT]
和[keystone_authtoken]
处配置身份认证服务访问:
注:注释或删除[keystone_authtoken]
处其他默认配置信息
[DEFAULT]
auth_strategy = keystone
[keystone_authtoken]
memcached_servers = controller:11211
auth_uri = http://controller:5000
auth_url = http://controller:35357
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = manila
password = MANILA_PASS
在[DEFAULT]
处配置my_ip
为BlockStorage节点Management Networ网络接口地址:
[DEFAULT]
my_ip = 10.0.0.41
在[oslo_concurrency]
处配置lock_path
:
[oslo_concurrency]
lock_path = /var/lib/manila/tmp
安装配置共享服务器管理
① 针对两种不同的网络模式(provider和self-service),共享文件系统服务支持两种模式:
不需要驱动器支持的共享服务器管理:不需要安装任何驱动,默认使用LVM和NFS服务方式,支持NFS和CIFS协议,通过在共享服务器创建共享卷,利用NFS为虚拟机提供共享服务。
需要驱动器支持的共享服务器管理:需要计算(Nova),网络(Neutron)和块存储管理(Cinder)服务管理共享服务器。用于创建共享服务器的信息被配置为共享网络。这种模式使用通用驱动程序,并需要启用驱动控制共享服务器(DHSS), 还需要连接到公共网络路由器。本指南采用第二种模式。
② 安装网络服务组件
sudo apt-get install neutron-plugin-linuxbridge-agent
③ 配置网络服务公共组件
公共组件配置包括认证机制、消息队列、插件。修改配置文件sudo vi /etc/neutron/neutron.conf
在[database]
处注释掉其他所有设置项,因为BlockStorage
节点不需要直接访问数据库。
在[DEFAULT]
和[oslo_messaging_rabbit]
处配置RabbitMQ
消息队列访问
注:将RABBIT_PASS
替换为前面设计的实际密码
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
在[DEFAULT]
和[keystone_authtoken]
处配置身份服务访问
注:将NEUTRON_PASS
替换为前面设计的实际密码
注:注释或删除[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
④ 配置网络设置
配置Linux网桥代理,修改配置文件sudo vi /etc/neutron/plugins/ml2/linuxbridge_agent.ini
在[linux_bridge]
处将虚拟网络映射到物理网络
注:将PROVIDER_INTERFACE_NAME
替换为BlockStorage节点External Network网络接口名称eth0
。
[linux_bridge]
physical_interface_mappings = provider:PROVIDER_INTERFACE_NAME
在[vxlan]
处启用VXLAN
覆盖网络,配置管理覆盖网络的物理网络接口IP地址,启用layer-2 population
注:将OVERLAY_INTERFACE_IP_ADDRESS
替换为BlockStorage节点Management Network网络接口IP地址10.0.0.41
[vxlan]
enable_vxlan = True
local_ip = OVERLAY_INTERFACE_IP_ADDRESS
l2_population = True
在[securitygroup]
处启用安全组,配置Linux bridge iptables firewall driver
[securitygroup]
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
⑤ 修改配置文件sudo vi /etc/manila/manila.conf
在[DEFAULT]
处启用generic
和NFS/CIFS
协议:
注:下面共享后端名称可任意设置,本指南设置为驱动名称。
[DEFAULT]
enabled_share_backends = generic
enabled_share_protocols = NFS,CIFS
在[neutron]
、[nova]
和[cinder]
处启用这些服务的认证信息:
注:将NEUTRON_PASS
、NOVA_PASS
和CINDER_PASS
替换为前面设计的实际密码
[neutron]
url = http://controller:9696
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
region_name = RegionOne
project_name = service
username = neutron
password = NEUTRON_PASS
[nova]
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
region_name = RegionOne
project_name = service
username = nova
password = NOVA_PASS
[cinder]
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
region_name = RegionOne
project_name = service
username = cinder
password = CINDER_PASS
在[generic]
处配置generic
驱动:
[generic]
share_backend_name = GENERIC
share_driver = manila.share.drivers.generic.GenericShareDriver
driver_handles_share_servers = True
service_instance_flavor_id = 100
service_image_name = manila-service-image
service_instance_user = manila
service_instance_password = manila
interface_driver = manila.network.linux.interface.BridgeInterfaceDriver
⑥ 重启服务
sudo service manila-share restart
sudo service neutron-linuxbridge-agent restart
验证共享文件系统服务和网络服务代理是否安装配置正确
① 在Controller节点上设置OpenStack管理用户admin
的环境变量
source ~/.openstack/.admin-openrc
② 列出共享文件系统服务组件,验证成功启动的manila
进程
manila service-list
③ 列出网络服务代理
neutron agent-list
注:在OpenStack Mitaka发行版中Horizon中不包括Manila,需要安装额外的插件manila-ui
才能在Horizon中显示Share菜单。
安装Manila UI
查看列表:http://tarballs.openstack.org/manila-ui/
sudo pip install 'http://tarballs.openstack.org/manila-ui/manila-ui-stable-mitaka.tar.gz'
在Horizon
中启用Manila UI
查看Manila UI
安装路径:find /usr -name 'manila_ui'
cd /usr/local/lib/python2.7/dist-packages/manila_ui
sudo cp ./enabled/_90_manila_*.py /usr/share/openstack-dashboard/openstack_dashboard/local/enabled
配置中文语言支持
sudo apt-get install gettext python-pip python-dev build-essential
cd /usr/share/openstack-dashboard/horizon
sudo /usr/share/openstack-dashboard/manage.py makemessages -l en --no-obsolete
sudo /usr/share/openstack-dashboard/manage.py makemessages -d djangojs -l en --no-obsolete
cd /usr/share/openstack-dashboard/openstack_dashboard
sudo /usr/share/openstack-dashboard/manage.py makemessages --extension=html,txt,csv --ignore=openstack -l en --no-obsolete
cd /usr/share/openstack-dashboard/horizon
sudo /usr/share/openstack-dashboard/manage.py compilemessages
cd /usr/share/openstack-dashboard/openstack_dashboard
sudo /usr/share/openstack-dashboard/manage.py compilemessages
cd /usr/local/lib/python2.7/dist-packages/manila_ui
sudo service apache2 reload
重新加载Apache Web Server
sudo service apache2 reload
参考链接:
https://github.com/openstack/manila-ui
http://docs.openstack.org/developer/horizon/topics/install.html
https://www.howtoinstall.co/en/ubuntu/xenial/python-manila-ui
通过REST API
提供对象存储和检索服务。
部署节点:Controller Node
创建对象存储服务实体和API路径
注:对象存储服务不使用Controller节点上的SQL数据库MariaDB,它使用每个存储节点上的分布式数据库SQLite。
① 设置OpenStack中admin
用户环境变量
source ~/.openstack/.admin-openrc
② 在OpenStack中创建一个swift
用户
openstack user create --domain default --password-prompt swift
输入用户swift
的密码SWIFT_PASS
(将SWIFT_PASS
替换为前面设计的实际密码)。
③ 将admin
角色授予swift
用户
openstack role add --project service --user swift admin
④ 创建swift
服务实体
openstack service create --name swift --description "OpenStack Object Storage" object-store
⑤ 创建对象存储服务API路径
openstack endpoint create --region RegionOne object-store public http://controller:8080/v1/AUTH_%\(tenant_id\)s
openstack endpoint create --region RegionOne object-store internal http://controller:8080/v1/AUTH_%\(tenant_id\)s
openstack endpoint create --region RegionOne object-store admin http://controller:8080/v1
安装和配置Swift服务组件
① 安装Swift相关服务组件
sudo apt-get install swift swift-proxy python-swiftclient python-keystoneclient python-keystonemiddleware memcached
② 创建目录/etc/swift
sudo mkdir /etc/swift
③ 从对象存储软件源仓库下载对象存储代理服务配置文件
sudo curl -o /etc/swift/proxy-server.conf https://git.openstack.org/cgit/openstack/swift/plain/etc/proxy-server.conf-sample?h=stable/mitaka
② 修改配置文件sudo vi /etc/swift/proxy-server.conf
。
在[DEFAULT]
处配置代理服务绑定端口、用户和目录:
[DEFAULT]
bind_port = 8080
user = swift
swift_dir = /etc/swift
在[pipeline:main]
处移除tempurl
和tempauth
模块,并添加authtoken
和keystoneauth
模块:
[pipeline:main]
pipeline = catch_errors gatekeeper healthcheck proxy-logging cache container_sync bulk ratelimit authtoken keystoneauth container-quotas account-quotas slo dlo versioned_writes proxy-logging proxy-server
在[app:proxy-server]
处启用账户自动创建:
[app:proxy-server]
use = egg:swift#proxy
account_autocreate = True
在[filter:keystoneauth]
处设置操作用户角色:
[filter:keystoneauth]
use = egg:swift#keystoneauth
operator_roles = admin,user
在[filter:authtoken]
处配置认证服务访问:
注:将SWIFT_PASS
替换为前面设计的实际密码。
注:注释或删除[filter:authtoken]
处其他默认设置。
[filter:authtoken]
paste.filter_factory = keystonemiddleware.auth_token:filter_factory
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 = swift
password = SWIFT_PASS
delay_auth_decision = True
在[filter:cache]
处配置Memcached位置:
[filter:cache]
use = egg:swift#memcache
memcache_servers = controller:11211
部署节点:ObjectStorage Node
注:每个对象存储节点都需执行以下步骤
安装配置XFS
① 安装XFS:
sudo apt-get install xfsprogs rsync
② 将存储设备/dev/sdb
和/dev/sdc
格式化为XFS
文件系统:
sudo mkfs.xfs /dev/sdb
sudo mkfs.xfs /dev/sdc
③ 创建挂载点目录:
sudo mkdir -p /srv/node/sdb
sudo mkdir -p /srv/node/sdc
④ 修改文件sudo vi /etc/fstab
,添加如下信息:
/dev/sdb /srv/node/sdb xfs noatime,nodiratime,nobarrier,logbufs=8 0 2
/dev/sdc /srv/node/sdc xfs noatime,nodiratime,nobarrier,logbufs=8 0 2
⑤ 挂载设备:
sudo mount /srv/node/sdb
sudo mount /srv/node/sdc
⑥ 新建或修改置文件sudo vi /etc/rsyncd.conf
,添加如下信息:
注:将下面MANAGEMENT_INTERFACE_IP_ADDRESS
替换为对象存储节点Management Network
网络接口地址10.0.0.51
或10.0.0.52
uid = swift
gid = swift
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
address = MANAGEMENT_INTERFACE_IP_ADDRESS
[account]
max connections = 2
path = /srv/node/
read only = False
lock file = /var/lock/account.lock
[container]
max connections = 2
path = /srv/node/
read only = False
lock file = /var/lock/container.lock
[object]
max connections = 2
path = /srv/node/
read only = False
lock file = /var/lock/object.lock
⑦ 修改sudo vi /etc/default/rsync
,启用rsync
服务:
RSYNC_ENABLE=true
⑧ 启动rsync
服务:
sudo service rsync start
安装配置Swift服务组件
① 安装swift
组件
sudo apt-get install swift swift-account swift-container swift-object
② 从对象存储软件源仓库下载账户、容器和对象服务配置文件
sudo curl -o /etc/swift/account-server.conf https://git.openstack.org/cgit/openstack/swift/plain/etc/account-server.conf-sample?h=stable/mitaka
sudo curl -o /etc/swift/container-server.conf https://git.openstack.org/cgit/openstack/swift/plain/etc/container-server.conf-sample?h=stable/mitaka
sudo curl -o /etc/swift/object-server.conf https://git.openstack.org/cgit/openstack/swift/plain/etc/object-server.conf-sample?h=stable/mitaka
③ 修改配置文件sudo vi /etc/swift/account-server.conf
。
在[DEFAULT]
处配置绑定IP地址、绑定端口、用户、目录和挂载点:
注:将下面MANAGEMENT_INTERFACE_IP_ADDRESS
替换为对象存储节点Management Network
网络接口地址10.0.0.51
或10.0.0.52
[DEFAULT]
bind_ip = MANAGEMENT_INTERFACE_IP_ADDRESS
bind_port = 6002
user = swift
swift_dir = /etc/swift
devices = /srv/node
mount_check = True
在[pipeline:main]
处启用相关模块:
[pipeline:main]
pipeline = healthcheck recon account-server
在[filter:recon]
处配置recon(meters)
缓存:
[filter:recon]
use = egg:swift#recon
recon_cache_path = /var/cache/swift
④ 修改配置文件sudo vi /etc/swift/container-server.conf
在[DEFAULT]
处配置绑定IP地址、绑定端口、用户、目录和挂载点:
注:将下面MANAGEMENT_INTERFACE_IP_ADDRESS
替换为对象存储节点Management Network
网络接口地址10.0.0.51
或10.0.0.52
[DEFAULT]
bind_ip = MANAGEMENT_INTERFACE_IP_ADDRESS
bind_port = 6001
user = swift
swift_dir = /etc/swift
devices = /srv/node
mount_check = True
在[pipeline:main]
处启用相关模块:
[pipeline:main]
pipeline = healthcheck recon container-server
在[filter:recon]
处配置recon(meters)
缓存:
[filter:recon]
use = egg:swift#recon
recon_cache_path = /var/cache/swift
⑤ 修改配置文件sudo vi /etc/swift/object-server.conf
在[DEFAULT]
处配置绑定IP地址、绑定端口、用户、目录和挂载点:
注:将下面MANAGEMENT_INTERFACE_IP_ADDRESS
替换为对象存储节点Management Network
网络接口地址10.0.0.51
或10.0.0.52
[DEFAULT]
bind_ip = MANAGEMENT_INTERFACE_IP_ADDRESS
bind_port = 6000
user = swift
swift_dir = /etc/swift
devices = /srv/node
mount_check = True
在[pipeline:main]
处启用相关模块:
[pipeline:main]
pipeline = healthcheck recon object-server
在[filter:recon]
处配置recon(meters)
缓存:
[filter:recon]
use = egg:swift#recon
recon_cache_path = /var/cache/swift
recon_lock_path = /var/lock
⑥ 修改挂载点目录所有者:
sudo chown -R swift:swift /srv/node
⑦ 创建recon
目录,并修改所有者:
sudo mkdir -p /var/cache/swift
sudo chown -R root:swift /var/cache/swift
sudo chmod -R 775 /var/cache/swift
部署节点:Controller Node
创建和分发初始环
创建账户环
① 将当前工作目录设置为/etc/swift
:
cd /etc/swift
② 创建基础的account.builder
文件:
sudo swift-ring-builder account.builder create 10 3 1
③ 将每个对象存储节点设备添加到账户环:
sudo swift-ring-builder account.builder add --region 1 --zone 1 --ip STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS --port 6002 --device DEVICE_NAME --weight DEVICE_WEIGHT
注:将STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS
替换为对象存储节点Management Network
网络接口地址,将DEVICE_NAME
替换为对应的对象存储节点上的存储设备名称,将DEVICE_WEIGHT
替换为实际权重值。
注:重复以上命令,将每个存储节点上的每个存储设备添加到账户环。
例如,本文采用如下命令将每个存储节点上的每个存储设备添加到账户环:
sudo swift-ring-builder account.builder add --region 1 --zone 1 --ip 10.0.0.51 --port 6002 --device sdb --weight 100
sudo swift-ring-builder account.builder add --region 1 --zone 1 --ip 10.0.0.51 --port 6002 --device sdc --weight 100
sudo swift-ring-builder account.builder add --region 1 --zone 2 --ip 10.0.0.52 --port 6002 --device sdb --weight 100
sudo swift-ring-builder account.builder add --region 1 --zone 2 --ip 10.0.0.52 --port 6002 --device sdc --weight 100
④ 验证账户环内容:
sudo swift-ring-builder account.builder
⑤ 平衡账户环:
sudo swift-ring-builder account.builder rebalance
创建容器环
① 将当前工作目录设置为/etc/swift
:
cd /etc/swift
② 创建基础的container.builder
文件:
sudo swift-ring-builder container.builder create 10 3 1
③ 将每个对象存储节点设备添加到容器环:
sudo swift-ring-builder container.builder add --region 1 --zone 1 --ip STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS --port 6001 --device DEVICE_NAME --weight DEVICE_WEIGHT
注:将STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS
替换为对象存储节点Management Network
网络接口地址,将DEVICE_NAME
替换为对应的对象存储节点上的存储设备名称,将DEVICE_WEIGHT
替换为实际权重值。
注:重复以上命令,将每个存储节点上的每个存储设备添加到容器环。
例如,本文采用如下命令将每个存储节点上的每个存储设备添加到容器环:
sudo swift-ring-builder container.builder add --region 1 --zone 1 --ip 10.0.0.51 --port 6001 --device sdb --weight 100
sudo swift-ring-builder container.builder add --region 1 --zone 1 --ip 10.0.0.51 --port 6001 --device sdc --weight 100
sudo swift-ring-builder container.builder add --region 1 --zone 2 --ip 10.0.0.52 --port 6001 --device sdb --weight 100
sudo swift-ring-builder container.builder add --region 1 --zone 2 --ip 10.0.0.52 --port 6001 --device sdc --weight 100
④ 验证容器环内容:
sudo swift-ring-builder container.builder
⑤ 平衡容器环:
sudo swift-ring-builder container.builder rebalance
创建对象环
① 将当前工作目录设置为/etc/swift
:
cd /etc/swift
② 创建基础的object.builder
文件:
sudo swift-ring-builder object.builder create 10 3 1
③ 将每个对象存储节点设备添加到对象环:
sudo swift-ring-builder object.builder add --region 1 --zone 1 --ip STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS --port 6000 --device DEVICE_NAME --weight DEVICE_WEIGHT
注:将STORAGE_NODE_MANAGEMENT_INTERFACE_IP_ADDRESS
替换为对象存储节点Management Network
网络接口地址,将DEVICE_NAME
替换为对应的对象存储节点上的存储设备名称,将DEVICE_WEIGHT
替换为实际权重值。
注:重复以上命令,将每个存储节点上的每个存储设备添加到对象环。
例如,本文采用如下命令将每个存储节点上的每个存储设备添加到对象环:
sudo swift-ring-builder object.builder add --region 1 --zone 1 --ip 10.0.0.51 --port 6000 --device sdb --weight 100
sudo swift-ring-builder object.builder add --region 1 --zone 1 --ip 10.0.0.51 --port 6000 --device sdc --weight 100
sudo swift-ring-builder object.builder add --region 1 --zone 2 --ip 10.0.0.52 --port 6000 --device sdb --weight 100
sudo swift-ring-builder object.builder add --region 1 --zone 2 --ip 10.0.0.52 --port 6000 --device sdc --weight 100
④ 验证对象环内容:
sudo swift-ring-builder object.builder
⑤ 平衡对象环:
sudo swift-ring-builder object.builder rebalance
分发环配置文件
将环配置文件account.ring.gz
、container.ring.gz
和object.ring.gz
拷贝到每个对象存储节点以及代理服务节点的/etc/swift
目录。在每个存储节点或代理服务节点执行以下命令:
sudo scp controller@controller:/etc/swift/*.ring.gz /etc/swift
注:本文将swift-proxy
部署到controller节点,因此无需再讲环配置文件拷贝到代理服务节点的/etc/swift
目录。若对象存储代理服务swift-proxy
部署在其他节点,则需将环配置文件拷贝到该代理服务节点/etc/swift
目录下。
添加、分发swift
配置文件
① 从对象存储软件源仓库下载配置文件/etc/swift/swift.conf
sudo curl -o /etc/swift/swift.conf https://git.openstack.org/cgit/openstack/swift/plain/etc/swift.conf-sample?h=stable/mitaka
② 修改配置文件sudo vi /etc/swift/swift.conf
在[swift-hash]
处哈希路径前缀和后缀
注:将HASH_PATH_PREFIX
和HASH_PATH_SUFFIX
替换为前面设计的唯一值。
[swift-hash]
swift_hash_path_suffix = HASH_PATH_SUFFIX
swift_hash_path_prefix = HASH_PATH_PREFIX
在[storage-policy:0]
处设置默认存储策略:
[storage-policy:0]
name = Policy-0
default = yes
③ 分发swift
配置文件
将/etc/swift/swift.conf
拷贝到每个对象存储节点以及代理服务节点的/etc/swift
目录。在每个存储节点或代理服务节点执行以下命令:
sudo scp controller@controller:/etc/swift/swift.conf /etc/swift
④ 在所有存储节点和代理服务节点上设置swift配置目录所有权
sudo chown -R root:swift /etc/swift
重启服务,完成安装
① 在Controller节点和其他Swift代理服务节点上执行:
sudo service memcached restart
sudo service swift-proxy restart
② 在所有对象存储节点上执行:
注:忽略其他未配置的服务报错信息
sudo swift-init all start
验证对象存储服务是否安装配置正确
① 在Controller节点上设置OpenStack示例用户demo
的环境变量
source ~/.openstack/.demo-openrc
② 查看对象存储服务状态
controller@controller:~$ swift stat
Account: AUTH_4bedcb61d9eb47cfb5fc79ea4a1a03b0
Containers: 0
Objects: 0
Bytes: 0
X-Put-Timestamp: 1465023102.25072
X-Timestamp: 1465023102.25072
X-Trans-Id: tx4a14ec8f1e6c46179a9b8-0057527a7d
Content-Type: text/plain; charset=utf-8
③ 创建一个容器container1
openstack container create container1
④ 上传一个测试文件到容器container1
注:将FILE
替换为任意本地测试文件名
openstack object create container1 FILE
⑤ 列出容器container1
中的文件:
openstack object list container1
⑥ 从容器container1
下载文件:
openstack object save container1 FILE
提供一种基于模板的编排,用于创建和管理云资源。
部署节点:Controller Node
在MariaDB(MySQL)中创建数据库heat
① 以root
用户登录MySQL
mysql -u root -p
② 创建heat
数据库
CREATE DATABASE heat;
③ 授予heat
数据库适当权限
注:将HEAT_DBPASS
替换为前面设计的实际密码
GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'localhost' IDENTIFIED BY 'HEAT_DBPASS';
GRANT ALL PRIVILEGES ON heat.* TO 'heat'@'%' IDENTIFIED BY 'HEAT_DBPASS';
创建Orchestration服务实体和API路径
① 设置OpenStack中admin
用户环境变量
source ~/.openstack/.admin-openrc
② 在OpenStack中创建一个heat
用户
openstack user create --domain default --password-prompt heat
输入用户heat
的密码HEAT_PASS
(将HEAT_PASS
替换为前面设计的实际密码)。
③ 将admin
角色授予heat
用户
openstack role add --project service --user heat admin
④ 创建heat
和heat-cfn
服务实体
openstack service create --name heat --description "Orchestration" orchestration
openstack service create --name heat-cfn --description "Orchestration" cloudformation
⑤ 创建Orchestration服务API路径
openstack endpoint create --region RegionOne orchestration public http://controller:8004/v1/%\(tenant_id\)s
openstack endpoint create --region RegionOne orchestration internal http://controller:8004/v1/%\(tenant_id\)s
openstack endpoint create --region RegionOne orchestration admin http://controller:8004/v1/%\(tenant_id\)s
openstack endpoint create --region RegionOne cloudformation public http://controller:8000/v1
openstack endpoint create --region RegionOne cloudformation internal http://controller:8000/v1
openstack endpoint create --region RegionOne cloudformation admin http://controller:8000/v1
创建Orchestration管理域、用户、角色
① 创建heat
域
openstack domain create --description "Stack projects and users" heat
② 创建heat_domain_admin
用户
openstack user create --domain heat --password-prompt heat_domain_admin
输入heat_domain_admin
用户密码HEAT_DOMAIN_PASS
(将HEAT_DOMAIN_PASS
替换为前面设计的实际密码)。
③ 将admin
角色授予heat_domain_admin
用户
openstack role add --domain heat --user-domain heat --user heat_domain_admin admin
④ 创建heat_stack_owner
角色
openstack role create heat_stack_owner
⑤ 将角色heat_stack_owner
授予示例项目和用户
openstack role add --project demo --user demo heat_stack_owner
注:必须将heat_stack_owner
角色授予管理stack的每一个用户。
⑥ 创建heat_stack_user
角色
openstack role create heat_stack_user
注: Orchestration服务自动将角色heat_stack_user
授予stack部署期间创建的用户,为了避免冲突,不要讲角色heat_stack_owner
授予任何用户。
安装和配置Orchestration服务组件
① 安装Orchestration
sudo apt-get install heat-api heat-api-cfn heat-engine
② 修改配置文件sudo vi /etc/heat/heat.conf
。
注:将HEAT_DBPASS
、HEAT_PASS
、HEAT_DOMAIN_PASS
和RABBIT_PASS
替换为前面设计的实际密码。
在[database]
处配置数据访问连接:
[database]
connection = mysql+pymysql://heat:HEAT_DBPASS@controller/heat
在[DEFAULT]
和[oslo_messaging_rabbit]
处配置RabbitMQ消息队列访问:
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
在[keystone_authtoken]
、[trustee]
、[clients_keystone]
和[ec2authtoken]
处配置认证服务访问:
[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 = heat
password = HEAT_PASS
[trustee]
auth_plugin = password
auth_url = http://controller:35357
username = heat
password = HEAT_PASS
user_domain_name = default
[clients_keystone]
auth_uri = http://controller:35357
[ec2authtoken]
auth_uri = http://controller:5000
在[DEFAULT]
处配置元数据和等待条件URLs
[DEFAULT]
heat_metadata_server_url = http://controller:8000
heat_waitcondition_server_url = http://controller:8000/v1/waitcondition
在[DEFAULT]
处配置stack域和管理证书:
[DEFAULT]
stack_domain_admin = heat_domain_admin
stack_domain_admin_password = HEAT_DOMAIN_PASS
stack_user_domain_name = heat
③ 将配置信息写入Orchestration服务数据库heat
su root
su -s /bin/sh -c "heat-manage db_sync" heat
重启服务,完成安装
sudo service heat-api restart
sudo service heat-api-cfn restart
sudo service heat-engine restart
验证编排服务是否安装配置正确
① 在Controller节点上设置OpenStack示例用户admin
的环境变量
source ~/.openstack/.admin-openrc
② 列出服务组件,验证每个进程是否成功启动和注册
openstack orchestration service list
提供监控和计量功能,提供OpenStack云计算的账单,性能指标,扩展性和满意度的调查表。
部署节点:Controller Node
为Telemetry服务创建数据库、服务证书、API端点
① 在MongoDB
中创建数据库ceilometer
注:将CEILOMETER_DBPASS
替换为前面设计的实际密码
sudo mongo --host controller --eval '
db = db.getSiblingDB("ceilometer");
db.createUser({user: "ceilometer",
pwd: "CEILOMETER_DBPASS",
roles: [ "readWrite", "dbAdmin" ]})'
注:若执行失败,则可能是未授权插入用户,需要在/etc/mongodb.conf
中临时注释掉授权项auth
,然后重启MongoDB数据库,重新执行命令。
② 设置OpenStack中admin
用户环境变量
source ~/.openstack/.admin-openrc
③ 在OpenStack中创建一个ceilometer
用户
openstack user create --domain default --password-prompt ceilometer
输入用户ceilometer
的密码CEILOMETER_PASS
(将CEILOMETER_PASS
替换为前面设计的实际密码)。
④ 将admin
角色授予ceilometer
用户
openstack role add --project service --user ceilometer admin
⑤ 创建ceilometer
服务实体
openstack service create --name ceilometer --description "Telemetry" metering
⑥ 创建Telemetry服务API路径
openstack endpoint create --region RegionOne metering public http://controller:8777
openstack endpoint create --region RegionOne metering internal http://controller:8777
openstack endpoint create --region RegionOne metering admin http://controller:8777
安装和配置Telemetry服务组件
① 安装Telemetry
sudo apt-get install ceilometer-api ceilometer-collector ceilometer-agent-central ceilometer-agent-notification python-ceilometerclient
② 修改配置文件sudo vi /etc/ceilometer/ceilometer.conf
。
注:将CEILOMETER_DBPASS
、CEILOMETER_PASS
和RABBIT_PASS
替换为前面设计的实际密码。
在[database]
处配置数据访问连接:
[database]
connection = mongodb://ceilometer:CEILOMETER_DBPASS@controller:27017/ceilometer
在[DEFAULT]
和[oslo_messaging_rabbit]
处配置RabbitMQ消息队列访问:
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = 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 = ceilometer
password = CEILOMETER_PASS
在[service_credentials]
处配置服务证书
[service_credentials]
auth_type = password
auth_url = http://controller:5000/v3
project_domain_name = default
user_domain_name = default
project_name = service
username = ceilometer
password = CEILOMETER_PASS
interface = internalURL
region_name = RegionOne
重启服务,完成安装
sudo service ceilometer-agent-central restart
sudo service ceilometer-agent-notification restart
sudo service ceilometer-api restart
sudo service ceilometer-collector restart
部署节点:Controller Node
启用镜像服务计量
① 修改配置文件sudo vi /etc/glance/glance-api.conf
和sudo vi /etc/glance/glance-registry.conf
在[DEFAULT]
、[oslo_messaging_notifications]
和[oslo_messaging_rabbit]
处配置RabbitMQ消息队列访问:
注:将RABBIT_PASS
替换为前面设计的实际密码
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_notifications]
driver = messagingv2
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
② 重启服务,完成安装
sudo service glance-registry restart
sudo service glance-api restart
部署节点:Compute Node
启用计算服务计量
① 在Compute节点上安装计量服务代理
sudo apt-get install ceilometer-agent-compute
② 修改配置文件sudo vi /etc/ceilometer/ceilometer.conf
注:将RABBIT_PASS
和CEILOMETER_PASS
替换为前面设计的实际密码
在[DEFAULT]
和[oslo_messaging_rabbit]
处配置RabbitMQ消息队列访问:
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = 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 = ceilometer
password = CEILOMETER_PASS
在[service_credentials]
处配置服务证书
[service_credentials]
auth_url = http://controller:5000/v2.0
username = ceilometer
project_name = service
password = CEILOMETER_PASS
interface = internalURL
region_name = RegionOne
配置计算服务使用计量服务
修改配置文件sudo vi /etc/nova/nova.conf
,在[DEFAULT]
处配置通知信息:
[DEFAULT]
instance_usage_audit = True
instance_usage_audit_period = hour
notify_on_state_change = vm_and_task_state
notification_driver = messagingv2
重启服务,完成安装
sudo service ceilometer-agent-compute restart
sudo service nova-compute restart
启用块存储服务计量
① 修改配置文件sudo vi /etc/cinder/cinder.conf
注:在Controller和BlockStorage节点上都要修改。
在[oslo_messaging_notifications]
处配置消息通知驱动
[oslo_messaging_notifications]
driver = messagingv2
② 在Controller节点上重启服务
sudo service cinder-api restart
sudo service cinder-scheduler restart
③ 在BlockStorage节点上重启服务
sudo service cinder-volume restart
启用对象存储服务计量
计量服务通过轮询和通知相结合的方式收集对象存储计量信息。
① 在Controller节点上创建角色ResellerAdmin
,并将该角色授予ceilometer
用户
source ~/.openstack/.admin-openrc
openstack role create ResellerAdmin
openstack role add --project service --user ceilometer ResellerAdmin
② 安装计量服务中间件
sudo apt-get install python-ceilometermiddleware
③ 修改配置文件sudo vi /etc/swift/proxy-server.conf
注:该步骤需要在Controller节点和其他运行对象存储代理服务的节点上执行。
在[filter:keystoneauth]
处添加ResellerAdmin
角色:
[filter:keystoneauth]
operator_roles = admin, user, ResellerAdmin
在[pipeline:main]
处添加ceilometer`:
[pipeline:main]
pipeline = ceilometer catch_errors gatekeeper healthcheck proxy-logging cache container_sync bulk ratelimit authtoken keystoneauth container-quotas account-quotas slo dlo versioned_writes proxy-logging proxy-server
在[filter:ceilometer]
处配置通知服务:
注:将RABBIT_PASS
替换为前面设计的实际密码
[filter:ceilometer]
paste.filter_factory = ceilometermiddleware.swift:filter_factory
control_exchange = swift
url = rabbit://openstack:RABBIT_PASS@controller:5672/
driver = messagingv2
topic = notifications
log_level = WARN
④ 重启对象存储代理服务
sudo service swift-proxy restart
部署节点:Controller
为Telemetry Alarming服务创建数据库、服务证书、API端点
① 以root
用户登录MySQL
mysql -u root -p
② 创建aodh
数据库
CREATE DATABASE aodh;
③ 授予aodh
数据库适当权限
注:将AODH_DBPASS
替换为前面设计的实际密码
GRANT ALL PRIVILEGES ON aodh.* TO 'aodh'@'localhost' IDENTIFIED BY 'AODH_DBPASS';
GRANT ALL PRIVILEGES ON aodh.* TO 'aodh'@'%' IDENTIFIED BY 'AODH_DBPASS';
④ 设置OpenStack中admin
用户环境变量
source ~/.openstack/.admin-openrc
⑤ 在OpenStack中创建一个aodh
用户
openstack user create --domain default --password-prompt aodh
输入用户aodh
的密码AODH_PASS
(将AODH_PASS
替换为前面设计的实际密码)。
⑥ 将admin
角色授予aodh
用户
openstack role add --project service --user aodh admin
⑦ 创建aodh
服务实体
openstack service create --name aodh --description "Telemetry" alarming
⑧ 创建Alarming服务API路径
openstack endpoint create --region RegionOne alarming public http://controller:8042
openstack endpoint create --region RegionOne alarming internal http://controller:8042
openstack endpoint create --region RegionOne alarming admin http://controller:8042
安装配置Telemetry Alarming服务组件
① 安装组件
sudo apt-get install aodh-api aodh-evaluator aodh-notifier aodh-listener aodh-expirer python-ceilometerclient
② 修改配置文件sudo vi /etc/aodh/aodh.conf
注:将AODH_DBPASS
、AODH_PASS
和RABBIT_PASS
替换为前面设计的实际密码。
在[database]
处配置数据访问连接:
[database]
connection = mysql+pymysql://aodh:AODH_DBPASS@controller/aodh
在[DEFAULT]
和[oslo_messaging_rabbit]
处配置RabbitMQ消息队列访问:
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = 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 = aodh
password = AODH_PASS
在[service_credentials]
处配置服务证书
[service_credentials]
auth_type = password
auth_url = http://controller:5000/v3
project_domain_name = default
user_domain_name = default
project_name = service
username = aodh
password = AODH_PASS
interface = internalURL
region_name = RegionOne
③ 修改配置文件sudo vi /etc/aodh/api_paste.ini
修改[filter:authtoken]
如下:
[filter:authtoken]
oslo_config_project = aodh
④ 重启Alarming服务
sudo service aodh-api restart
sudo service aodh-evaluator restart
sudo service aodh-notifier restart
sudo service aodh-listener restart
验证Telemetry服务是否安装配置正确
① 设置OpenStack中admin
用户环境变量
source ~/.openstack/.admin-openrc
② 列出可用计量信息
ceilometer meter-list`
③ 利用镜像服务下载镜像CirrOS
IMAGE_ID=$(glance image-list | grep 'cirros' | awk '{ print $2 }')
glance image-download $IMAGE_ID > /tmp/cirros.img
④ 重新列出可用计量信息,验证上一步镜像下载计量信息
ceilometer meter-list
⑤ 从image.download meter
中检索用量统计信息
ceilometer statistics -m image.download -p 60
⑥ 删除下载的临时测试镜像
sudo rm /tmp/cirros.img
部署节点:Controller
为Database服务创建数据库、服务证书、API端点
① 以root
用户登录MySQL
mysql -u root -p
② 创建trove
数据库
CREATE DATABASE trove;
③ 授予trove
数据库适当权限
注:将TROVE_DBPASS
替换为前面设计的实际密码
GRANT ALL PRIVILEGES ON trove.* TO 'trove'@'localhost' IDENTIFIED BY 'TROVE_DBPASS';
GRANT ALL PRIVILEGES ON trove.* TO 'trove'@'%' IDENTIFIED BY 'TROVE_DBPASS';
④ 设置OpenStack中admin
用户环境变量
source ~/.openstack/.admin-openrc
⑤ 在OpenStack中创建一个trove
用户
openstack user create --domain default --password-prompt trove
输入用户trove
的密码TROVE_PASS
(将TROVE_PASS
替换为前面设计的实际密码)。
⑥ 将admin
角色授予trove
用户
openstack role add --project service --user trove admin
⑦ 创建trove
服务实体
openstack service create --name trove --description "Database" database
⑧ 创建Database服务API路径
openstack endpoint create --region RegionOne database public http://controller:8779/v1.0/%\(tenant_id\)s
openstack endpoint create --region RegionOne database internal http://controller:8779/v1.0/%\(tenant_id\)s
openstack endpoint create --region RegionOne database admin http://controller:8779/v1.0/%\(tenant_id\)s
安装配置Database服务组件
① 安装组件
sudo apt-get update
sudo apt-get install python-trove python-troveclient python-glanceclient trove-common trove-api trove-taskmanager trove-conductor
② 在目录/etc/trove
下,修改文件trove.conf
、trove-taskmanager.conf
和trove-conductor.conf
,对于每个文件,执行下面步骤。
注:将TROVE_DBPASS
和RABBIT_PASS
替换为前面设计的实际密码
在[DEFAULT]
和[database]
处修改如下项的值:
[DEFAULT]
log_dir = /var/log/trove
trove_auth_url = http://controller:5000/v2.0
nova_compute_url = http://controller:8774/v2
cinder_url = http://controller:8776/v1
swift_url = http://controller:8080/v1/AUTH_
notifier_queue_hostname = controller
[database]
connection = mysql://trove:TROVE_DBPASS@controller/trove
在[DEFAULT]
和[oslo_messaging_rabbit]
处配置RabbitMQ消息队列访问:
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
③ 检查api-paste.ini
是否在/etc/trove
目录下
ll /etc/trove
④ 修改配置文件sudo vi /etc/trove/trove.conf
,检查确认下面所列设置项的值。
注:将TROVE_PASS
替换为前面设计的实际密码
[DEFAULT]
auth_strategy = keystone
add_addresses = True
network_label_regex = .*
api_paste_config = /etc/trove/api-paste.ini
[keystone_authtoken]
auth_uri = http://controller:5000
auth_url = http://controller:35357
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = trove
password = TROVE_PASS
⑤ 修改配置文件sudo vi /etc/trove/trove-taskmanager.conf
,检查确认下面所列设置项的值。
注:将ADMIN_PASS
替换为前面设计的实际密码
[DEFAULT]
nova_proxy_admin_user = admin
nova_proxy_admin_pass = ADMIN_PASS
nova_proxy_admin_tenant_name = service
taskmanager_manager = trove.taskmanager.manager.Manager
⑥ 修改配置文件sudo vi /etc/trove/trove-guestagent.conf
,检查确认下面所列设置项的值。
注:将RABBIT_PASS
和ADMIN_PASS
替换为前面设计的实际密码
rabbit_host = controller
rabbit_password = RABBIT_PASS
nova_proxy_admin_user = admin
nova_proxy_admin_pass = ADMIN_PASS
nova_proxy_admin_tenant_name = service
trove_auth_url = http://controller:35357/v2.0
⑦ 将配置信息写入trove
数据库
su root
su -s /bin/sh -c "trove-manage db_sync" trove
注:若报错:
InternalError: (pymysql.err.InternalError) (1832, u"Cannot change column 'datastore_version_id': used in a foreign key constraint 'instances_ibfk_1'") [SQL: u'\nALTER TABLE instances CHANGE COLUMN datastore_version_id datastore_version_id VARCHAR(36) NOT NULL']
原因是MariaDB 10.0+中对外键约束列变更时要求更严。一种变通的解决方案如下:
首先,关闭外键约束检查功能:
mysql -uroot -p
use trove;
SET GLOBAL foreign_key_checks=0;
然后,重新执行上述命令。最后,在开启外键约束检查功能。
mysql -uroot -p
use trove;
SET GLOBAL foreign_key_checks=1;
参考链接:https://bugs.launchpad.net/trove/+bug/1473226
⑧ 重启服务完成安装
由于Ubuntu安装包存在一个BUG,需要修改/etc/init/trove-taskmanager.conf
和/etc/init/trove-conductor.conf
文件。
在上述两个文件中,分别找到如下位置:
exec start-stop-daemon --start --chdir /var/lib/trove \
--chuid trove:trove --make-pidfile --pidfile /var/run/trove/trove-taskmanager.pid \
--exec /usr/bin/trove-taskmanager -- ${DAEMON_ARGS}
注意:上述参数中缺少--config-file
(或者参数配置文件路径有误),对两个文件应修改如下:
exec start-stop-daemon --start --chdir /var/lib/trove \
--chuid trove:trove --make-pidfile --pidfile /var/run/trove/trove-taskmanager.pid \
--exec /usr/bin/trove-taskmanager -- \
--config-file=/etc/trove/trove-taskmanager.conf ${DAEMON_ARGS}
exec start-stop-daemon --start --chdir /var/lib/trove \
--chuid trove:trove --make-pidfile --pidfile /var/run/trove/trove-conductor.pid \
--exec /usr/bin/trove-conductor -- \
--config-file=/etc/trove/trove-conductor.conf ${DAEMON_ARGS}
最后,重启数据库服务:
sudo service trove-api restart
sudo service trove-taskmanager restart
sudo service trove-conductor restart
验证Database服务是否安装配置正确
① 设置OpenStack中admin
用户环境变量
source ~/.openstack/.admin-openrc
② 列出数据库信息
trove list
③ 添加数据存储到trove
选择一个数据库类型,如MySQL
、MongoDB
,创建一个trove
镜像。
参考链接:
Building Guest Images for OpenStack Trove
OpenStack Trove 专用镜像制作
上传镜像到Glance:
glance image-create --name "mysqlTest" --disk-format qcow2 --container-format bare --file mysql-5.6.qcow2
创建一个数据存储:
su root
su -s /bin/sh -c "trove-manage --config-file /etc/trove/trove.conf datastore_update mysql ''" trove
④ 使用新的镜像更新数据存储
su -s /bin/sh -c "trove-manage --config-file /etc/trove/trove.conf datastore_version_update mysql mysql-5.6 mysql glance_image_ID '' 1" trove
⑤ 创建一个数据库实例
参考链接:https://github.com/openstack/trove-dashboard
安装Trove Dashboard
查看列表:http://tarballs.openstack.org/trove-dashboard
sudo pip install 'http://tarballs.openstack.org/trove-dashboard/trove-dashboard-stable-mitaka.tar.gz'
在Horizon
中启用Trove Dashboard
查看Trove Dashboard
安装路径:find /usr -name trove_dashboard
cd /usr/local/lib/python2.7/dist-packages/trove_dashboard
sudo cp ./enabled/_17*.py /usr/share/openstack-dashboard/openstack_dashboard/local/enabled
重新加载Apache Web Server
sudo service apache2 reload
部署节点:Controller
创建数据库sahara
① 以root
用户登录MySQL
mysql -u root -p
② 创建sahara
数据库
CREATE DATABASE sahara;
③ 授予CREATE DATABASE sahara;
数据库适当权限
注:将SAHARA_DBPASS
替换为前面设计的实际密码
GRANT ALL PRIVILEGES ON sahara.* TO 'sahara'@'localhost' IDENTIFIED BY 'SAHARA_DBPASS';
GRANT ALL PRIVILEGES ON sahara.* TO 'sahara'@'%' IDENTIFIED BY 'SAHARA_DBPASS';
④ 设置OpenStack中admin
用户环境变量
source ~/.openstack/.admin-openrc
⑤ 在OpenStack中创建一个sahara
用户
openstack user create --domain default --password-prompt sahara
输入用户sahara
的密码SAHARA_PASS
(将SAHARA_PASS
替换为前面设计的实际密码)。
⑥ 将admin
角色授予sahara
用户
openstack role add --project service --user sahara admin
⑦ 创建Sahara Data Processing
服务实体sahara
openstack service create --name sahara --description "Sahara Data Processing" data-processing
⑧ 创建Sahara Data Processing
服务API路径
openstack endpoint create --region RegionOne data-processing public http://controller:8386/v1.1/%\(tenant_id\)s
openstack endpoint create --region RegionOne data-processing internal http://controller:8386/v1.1/%\(tenant_id\)s
openstack endpoint create --region RegionOne data-processing admin http://controller:8386/v1.1/%\(tenant_id\)s
安装配置sahara
① 安装sahara
sudo apt-get install sahara
① 修改配置文件sudo vi /etc/sahara/sahara.conf
注:将SAHARA_DBPASS
和SAHARA_PASS
替换为前面设计的实际密码
在[database]
处配置数据库连接:
[database]
connection = mysql://sahara:SAHARA_DBPASS@controller/sahara
在[DEFAULT]
、[keystone_authtoken]
和[paste_deploy]
处,配置身份服务访问:
[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 = sahara
password = SAHARA_PASS
identity_uri = http://controller:35357
admin_tenant_name = service
admin_user = sahara
admin_password = SAHARA_PASS
[paste_deploy]
flavor = keystone
在[DEFAULT]
处配置网络服务:
[DEFAULT]
use_neutron = true
use_namespaces=True
use_rootwrap=True
rootwrap_command='sudo sahara-rootwrap /etc/sahara/rootwrap.conf'
use_floating_ips = true
verbose = true
log_file = sahara.log
log_dir = /var/log/sahara
在[oslo_messaging_notifications]
处配置通知服务:
[oslo_messaging_notifications]
enable = true
driver = messaging
在[oslo_concurrency]
处配置lock_path
[oslo_concurrency]
lock_path = /var/lib/sahara/tmp
在[DEFAULT]
和[oslo_messaging_rabbit]
处配置RabbitMQ消息队列访问:
注:将RABBIT_PASS
替换为前面设计的实际密码
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = RABBIT_PASS
在[infrastructure_engine]
处配置编排服务:
[DEFAULT]
infrastructure_engine = heat
在[service_credentials]
处添加如下内容:
[service_credentials]
auth_type = password
auth_url = http://controller:5000/v3
project_domain_name = default
user_domain_name = default
project_name = service
username = sahara
password = SAHARA_PASS
interface = internalURL
region_name = RegionOne
② 配置MySQLsudo vi /etc/mysql/mariadb.conf.d/openstack.cnf
,添加如下内容:
[mysqld]
max_allowed_packet = 256M
重启数据库:
sudo service mysql restart
③ 将配置写入数据库:
sudo sahara-db-manage --config-file /etc/sahara/sahara.conf upgrade head
④ 启动sahara
服务
sudo service sahara-api start
sudo service sahara-engine start
参考链接:https://github.com/openstack/sahara-dashboard
安装Sahara Dashboard
查看列表:http://tarballs.openstack.org/sahara-dashboard
sudo pip install 'http://tarballs.openstack.org/sahara-dashboard/sahara-dashboard-stable-mitaka.tar.gz'
在Horizon
中启用Sahara Dashboard
查看sahara Dashboard
安装路径:find /usr -name sahara_dashboard
cd /usr/local/lib/python2.7/dist-packages/sahara_dashboard
sudo cp ./enabled/_18*.py /usr/share/openstack-dashboard/openstack_dashboard/local/enabled
重新加载Apache Web Server
sudo service apache2 reload
部署节点:Controller Node
网络结构
Provider Network中一个实例通过二层网络(桥接或交换)来访问外部网络,该网络包含一个DHCP服务器来给实例提供IP地址。
如下图:
创建Provider Network
① 设置OpenStack中admin
用户环境变量
source ~/.openstack/.admin-openrc
② 创建网络provider
:
neutron net-create --shared --provider:physical_network provider --provider:network_type flat provider
其中,--shared
设置允许所有项目访问虚拟网络,--provider:physical_network provider
和--provider:network_type flat
将扁平虚拟网络通过Network节点的eth0
口连接到扁平物理网络。相关配置文件如下:
Controller
节点上的/etc/neutron/plugins/ml2/ml2_conf.ini
[ml2_type_flat]
flat_networks = provider
Network
节点上的/etc/neutron/plugins/ml2/linuxbridge_agent.ini
[linux_bridge]
physical_interface_mappings = provider:eth0
③ 创建子网
neutron subnet-create --name provider --allocation-pool start=START_IP_ADDRESS,end=END_IP_ADDRESS --dns-nameserver DNS_RESOLVER --gateway PROVIDER_NETWORK_GATEWAY provider PROVIDER_NETWORK_CIDR
其中,START_IP_ADDRESS
和END_IP_ADDRESS
是将分配给实例的子网的起始IP和结束IP地址,需要替换为实际起始结束IP地址(这个IP地址范围不能包括任何已存在的活动IP);DNS_RESOLVER
是域名服务器,需替换为实际DNS服务器IP(可查看DNS服务器配置文件/etc/resolv.conf
);PROVIDER_NETWORK_GATEWAY
是外部网络网关IP,替换为实际网关IP。例如,本文执行如下命令创建子网:
neutron subnet-create --name provider --allocation-pool start=192.168.1.100,end=192.168.1.200 --dns-nameserver 192.168.1.1 --gateway 192.168.1.1 provider 192.168.1.0/24
网络结构
Self-Service网络通过NAT
连接到物理网络,包含一个DHCP服务器为实例提供IP地址,Self-Service网络中的实例可自动访问外部网络,但外部网络主机访问Self-Service网络中的实例需要配置浮动IP才可以。其他普通用户也可以创建Self-Service网络,因为该网络只提供普通用户项目下实例之间的连通性。
注:创建Self-Service网络前必须先创建Provider网络。
网络结构如下图:
创建Self-Service Network
① 设置OpenStack中demo
用户环境变量
source ~/.openstack/.demo-openrc
② 创建网络:
neutron net-create selfservice
注:普通用户在上述命令中无法提供额外参数,相关参数在
Controller
节点上的/etc/neutron/plugins/ml2/ml2_conf.ini
文件中配置:
[ml2]
tenant_network_types = vxlan
[ml2_type_vxlan]
vni_ranges = 1:1000
③ 创建子网
neutron subnet-create --name selfservice --dns-nameserver DNS_RESOLVER --gateway SELFSERVICE_NETWORK_GATEWAY selfservice SELFSERVICE_NETWORK_CIDR
注:子网IP段可参考RFC1918中关于私有地址空间的规定,如下
10.0.0.0 - 10.255.255.255 (10/8 prefix)
172.16.0.0 - 172.31.255.255 (172.16/12 prefix)
192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
本文采用如下命令创建子网:
neutron subnet-create --name selfservice --dns-nameserver 8.8.4.4 --gateway 172.16.1.1 selfservice 172.16.1.0/24
④ 创建配置虚拟路由器
Self-Service网络通过虚拟路由器(如实现双向NAT)连接到Provider网络。每个虚拟路由器包含至少一个连接到Self-Service网络的接口和一个位于Provider网络的网关。Provider网络必须包含router:external
设置项,以便Self-Service网络虚拟路由器可连接到外部网络,可以网络创建时或创建后添加(必须具有admin
或其他特权用户权限)。如下:
source ~/.openstack/.admin-openrc
neutron net-update provider --router:external
source ~/.openstack/.demo-openrc
neutron router-create router
neutron router-interface-add router selfservice
neutron router-gateway-set router provider
⑤ 验证配置是否正确
在Network
节点上执行ip netns
,列出网络命名空间:
qdhcp-20b2a466-cd25-4b9a-9194-2b8005a8b547 (id: 2)
qdhcp-e82fd421-79dc-446d-82dc-3cfb5a491644 (id: 1)
qrouter-70837112-c3e0-4702-b4e4-ee9ce9cc4b8f (id: 0)
设置admin
环境变量:
source ~/.openstack/.admin-openrc
列出router
路由器网络接口,查看连接Provider网络的网关IP:
neutron router-port-list router
可看到router
路由器连接Provider网络的网关IP为192.168.1.101
在Controller节点或其他OpenStack节点或物理主机上ping上述网关:
ping -c 4 192.168.1.101
部署节点:Controller Node
为CirrOS
镜像创建用于测试的虚拟机类型模板m1.nano
。
source ~/.openstack/.admin-openrc
openstack flavor create --id 0 --vcpus 1 --ram 64 --disk 1 m1.nano
部署节点:Controller Node
大多数云平台镜像支持公钥认证而不支持传统的口令认证,在启动实例前必须为计算服务添加一个公钥。生成密钥对步骤如下:
设置普通用户demo
的认证环境变量
source ~/.openstack/.demo-openrc
生成一个密钥对
ssh-keygen -q -N ""
openstack keypair create --public-key ~/.ssh/id_rsa.pub demokey
注:上面可以跳过ssh-keygen
命令,直接使用已有的公钥。
验证公钥对
openstack keypair list
部署节点:Controller Node
默认安全组规则适用于所有实例,并且包含防火墙规则,该防火墙规则拒绝远程访问实例。对于Linux镜像,建议至少允许ICMP (ping)
和secure shell (SSH)
。添加规则到默认安全组步骤如下:
添加规则允许ICMP协议
openstack security group rule create --proto icmp default
添加规则允许secure shell (SSH)
访问
openstack security group rule create --proto tcp --dst-port 22 default
部署节点:Controller Node
启动实例前,至少需要制定虚拟机模板类型、镜像名称、网络、安全组、密钥对和实例名称。
设置普通用户demo
的认证环境变量
source ~/.openstack/.demo-openrc
列出可用虚拟机模板
虚拟机模板指定了处理器、内存、存储等虚拟资源的分配概况。
openstack flavor list
列出可用镜像
openstack image list
列出可用网路
openstack network list
注:若实例启动使用Provider网络provider
,或者使用Self-Service网络selfservice
,则必须使用ID代替名称来使用该网络名称。
列出可用安全组
openstack security group list
在Provider网络中启动实例
注:将PROVIDER_NET_ID
替换为实际Provider网络ID。
openstack server create --flavor m1.nano --image cirros --nic net-id=PROVIDER_NET_ID --security-group default --key-name demokey provider-instance
获取Provider网络provider
的网络ID:
export PROVIDER_NET_ID=$(openstack network list | awk '/ provider / { print $2 }')
例如本文采用如下命令启动实例:
openstack server create --flavor m1.nano --image cirros --nic net-id=$PROVIDER_NET_ID --security-group default --key-name demokey provider-instance-cirros
在Self-Service网络中启动实例
注:将SELFSERVICE_NET_ID
替换为实际Self-Service网络ID。
openstack server create --flavor m1.nano --image cirros --nic net-id=SELFSERVICE_NET_ID --security-group default --key-name demokey selfservice-instance
获取Self-Service网络selfservice
的网络ID:
export SELFSERVICE_NET_ID=$(openstack network list | awk '/ selfservice / { print $2 }')
例如本文采用如下命令启动实例:
openstack server create --flavor m1.nano --image cirros --nic net-id=$SELFSERVICE_NET_ID --security-group default --key-name demokey selfservice-instance-cirros
查看实例状态
openstack server list
使用虚拟控制台访问实例
① 获取一个Virtual Network Computing (VNC)
会话URL,通过Web浏览器访问该URL。
controller@controller:~$ openstack console url show provider-instance-cirros
+-----+-------------------------------------------------------------------------------+
|Field| Value |
+-----+-------------------------------------------------------------------------------+
|type | novnc |
| url |http://controller:6080/vnc_auto.html?token=5ed8f684-7ee5-4c10-aa5d-6bbd8f55cd1f|
+-----+-------------------------------------------------------------------------------+
controller@controller:~$ openstack console url show selfservice-instance-cirros
+-----+-------------------------------------------------------------------------------+
|Field| Value |
+-----+-------------------------------------------------------------------------------+
|type | novnc |
| url |http://controller:6080/vnc_auto.html?token=ba0af1cb-83b6-4757-8b58-8951d4933ff9|
+-----+-------------------------------------------------------------------------------+
注:若客户端主机无法解析controller
可在客户机hosts文件中添加对应规则,或者直接将controller
替换为对应IP地址。
② 通过Web浏览器访问上述URL,输入用户密码(cirros/cubswin:)
),进入Cirros系统后,验证网络连通性。
对于Provider网络虚拟机:
ping -c 4 192.168.1.1
ping -c 4 openstack.org
ifconfig -a
对于Self-Service网络虚拟机:
ping -c 4 172.16.1.1
ping -c 4 openstack.org
ifconfig -a
远程访问实例
对于Provider网络虚拟机:
① 在Controller节点或其他任何位于物理网络中的节点上,测试能否连通实例。
ping -c 4 192.168.1.102
② 使用SSH访问实例
ssh cirros@192.168.1.102
对于Self-Service网络虚拟机:
③ 在Provider虚拟网络中创建浮动IP
openstack ip floating create provider
④ 将上述浮动IP和实例相关联
openstack ip floating add 192.168.1.103 selfservice-instance-cirros
⑤ 查看浮动IP绑定状态
openstack server list
⑥ 在Controller节点或其他任何位于物理网络中的节点上,验证浮动IP能否连通
ping -c 4 192.168.1.103
⑦ 使用SSH访问实例
ssh cirros@192.168.1.103
部署节点:Controller Node
创建一个卷
① 设置普通用户demo
的环境变量
source ~/.openstack/.demo-openrc
② 创建一个1GB的卷
openstack volume create --size 1 volume1
③ 列出可用卷
openstack volume list
将一个卷添加到指定实例
① 添加卷到实例
注:将INSTANCE_NAME
和VOLUME_NAME
替换为实际实例名和卷名。
openstack server add volume INSTANCE_NAME VOLUME_NAME
例如,本文执行如下命令添加卷到实例:
openstack server add volume provider-instance-cirros volume1
② 查看卷状态
openstack volume list
③ 通过SSH登录实例,使用fdisk
命令验证新添加的卷设备/dev/sdb
ssh cirros@192.168.1.102
sudo fdisk -l
注:在使用卷之前,必须在块设备上创建文件系统并将其挂载到系统中。
部署节点:Controller Node
创建一个模板
编排服务采用模板来设计栈。创建文件demo-template.yml
,添加如下内容:
heat_template_version: 2015-10-15
description: Launch a basic instance with CirrOS image using the
``m1.nano`` flavor, ``demokey`` key, and one network.
parameters:
NetID:
type: string
description: Network ID to use for the instance.
resources:
server:
type: OS::Nova::Server
properties:
image: cirros
flavor: m1.nano
key_name: demokey
networks:
- network: { get_param: NetID }
outputs:
instance_name:
description: Name of the instance.
value: { get_attr: [ server, name ] }
instance_ip:
description: IP address of the instance.
value: { get_attr: [ server, first_address ] }
创建一个栈
① 设置普通用户demo
的环境变量
source ~/.openstack/.demo-openrc
② 查看可用网络:
openstack network list
③ 设置环境变量NET_ID
,如下将NET_ID
设置为provider
网络ID:
export NET_ID=$(openstack network list | awk '/ provider / { print $2 }')
④ 在provider
网络中创建含有一个Cirros实例的栈
openstack stack create -t demo-template.yml --parameter "NetID=$NET_ID" stack
⑤ 列出可用栈
openstack stack list
⑥ 查看实例名和IP,和OpenStack客户端输出信息作比较
controller@controller:~$ openstack stack output show --all stack
+---------------+-------------------------------------------------+
| Field | Value |
+---------------+-------------------------------------------------+
| instance_name | { |
| | "output_value": "stack-server-zxf6yokswyje", |
| | "output_key": "instance_name", |
| | "description": "Name of the instance." |
| | } |
| instance_ip | { |
| | "output_value": "192.168.1.104", |
| | "output_key": "instance_ip", |
| | "description": "IP address of the instance." |
| | } |
+---------------+-------------------------------------------------+
⑦ 查看OpenStack客户端信息
openstack server list
⑧ 删除栈
openstack stack delete --yes stack
部署节点:Controller Node
创建服务镜像
根据传统的部署方式,需要从一个支持诸如NFS/CIFS等网络文件系统的镜像中创建一个实例,来评估共享文件系统。本文为了降低资源要求,测试实例采用CirrOS
镜像,但CirrOS
镜像不支持网络文件系统。为了评估共享文件系统服务,本文采用支持网络文件系统的manila-share-service
镜像创建一个普通实例,通过限制内存为256MB来减少对资源的消耗。
① 下载manila-share-service
镜像
wget http://tarballs.openstack.org/manila-image-elements/images/manila-service-image-master.qcow2
② 设置普通用户admin
的环境变量
source ~/.openstack/.admin-openrc
③ 添加镜像到镜像服务
openstack image create "manila-service-image" --file manila-service-image-master.qcow2 --disk-format qcow2 --container-format bare --public
③ 为支持上述镜像服务创建一个新的模板类型
openstack flavor create manila-service-flavor --id 100 --ram 256 --disk 0 --vcpus 1
创建共享
根据共享文件系统服务配置时选择的模式,本文采用需要共享驱动器支持的共享服务器管理模式,因此创建一个需要共享服务器管理支持的共享。在创建共享之前,启用DHSS模式的通用驱动需要定义至少一个镜像、一个类型模板、一个网络和一个共享网络(用于创建提供NFS/CIFS服务的共享服务器)。步骤如下:
① 创建共享类型
设置普通用户admin
的环境变量:
source ~/.openstack/.admin-openrc
创建启用DHSS的默认共享类型:
manila type-create generic_share_type True
② 创建共享网络
设置普通用户demo
的环境变量:
source ~/.openstack/.demo-openrc
列出可用网络,获取Self-Service网络selfservice
的网络ID及其子网ID:
neutron net-list
获取selfservice
网络ID:
export SELFSERVICE_NET_ID=$(openstack network list | awk '/ selfservice / { print $2 }')
获取selfservice
子网ID:
export SELFSERVICE_SUBNET_ID=$(openstack subnet list | awk '/ selfservice / { print $2 }')
利用selfservice
网络ID和子网ID创建共享网络:
manila share-network-create --name selfservice-net-share1 --neutron-net-id $SELFSERVICE_NET_ID --neutron-subnet-id $SELFSERVICE_SUBNET_ID
③ 创建共享
设置普通用户demo
的环境变量:
source ~/.openstack/.demo-openrc
利用共享网络创建一个NFS共享:
manila create NFS 1 --name share2 --share-network selfservice-net-share1 --share-type generic_share_type
查看可用共享,等待一段时间,新创建的共享状态将从creating
变为available
:
manila list
注:若创建共享出错,可参考6.11
创建支持NFS的测试实例
① 获取Self-Service网络selfservice
的网络ID:
export SELFSERVICE_NET_ID=$(openstack network list | awk '/ selfservice / { print $2 }')
② 启动实例:
openstack server create --flavor manila-service-flavor --image manila-service-image --nic net-id=$SELFSERVICE_NET_ID --security-group default --key-name demokey selfservice-instance-manila
③ 查看实例状态
openstack server list
④ 使用虚拟控制台访问实例
获取一个Virtual Network Computing (VNC)
会话URL,通过Web浏览器访问该URL。
controller@controller:~$ openstack console url show selfservice-instance-manila | awk '/ url / { print $4 }'
http://controller:6080/vnc_auto.html?token=2d11eb78-f15c-4e55-a9ef-9efe5ae33ea2
注:用户名密码均为manila
挂载共享到测试实例
① 在尝试通过网络挂载共享前,配置使实例可以访问新建共享:
manila access-allow share2 ip INSTANCE_IP_ADDRESS
注:将INSTANCE_IP_ADDRESS
替换为selfservice
网络实例IP地址(本文此处可用实例selfservice-instance-manila
的IP地址)
② 确定共享的对外IP地址:
manila show share2 | grep path
例如,本文得到的path
为:10.254.0.22:/shares/share-fc9f6166-f2ee-4785-ba24-d7e7a598e161
。
③ 在测试实例selfservice-instance-manila
上创建一个挂载点
mkdir ~/test_folder
④ 根据共享地址在实例上挂载NFS共享,在测试实例上执行如下挂载命令:
sudo mount -t nfs 10.254.0.22:/shares/share-fc9f6166-f2ee-4785-ba24-d7e7a598e161 ~/test_folder
mariadb.cnf
配置问题问题
安装MySQL后卸载,删除/etc/mysql/
下所有文件,重新安装MariaDB时报错。
问题 ①:找不到配置文件mariadb.cnf
Setting up mariadb-common (10.0.24-7) ...
update-alternatives: error: alternative path /etc/mysql/mariadb.cnf doesn't exist
dpkg: error processing package mariadb-common (--configure):
subprocess installed post-installation script returned error exit status 2
Errors were encountered while processing:
mariadb-common
E: Sub-process /usr/bin/dpkg returned an error code (1)
问题 ②: 依赖包mariadb-server-10.0
未配置
Setting up libhttp-message-perl (6.11-1) ...
dpkg: dependency problems prevent configuration of mariadb-server:
mariadb-server depends on mariadb-server-10.0 (>= 10.0.24-7); however:
Package mariadb-server-10.0 is not configured yet.
dpkg: error processing package mariadb-server (--configure):No apport report written because the error message indicates its a followup error from a previous failure.
dependency problems - leaving unconfigured
Processing triggers for libc-bin (2.23-0ubuntu3) ...
Errors were encountered while processing:
mariadb-server-10.0
mariadb-server
E: Sub-process /usr/bin/dpkg returned an error code (1)
原因
问题 ①: 重装MariaDB时将配置文件删除,导致找不到配置文件mariadb.cnf
。
解决方法
问题 ①: 在/etc/mysql/
下新建一个mariadb.cnf
文件,或者从别的电脑上拷贝一个mariadb.cnf
到该目录。
问题 ②: 彻底清除配置文件,删除软件,重新安装。
sudo service mysql stop
sudo apt-get purge mysql* mariadb*
sudo apt autoremove
sudo rm -r /var/lib/mysql
sudo rm -r /var/log/mysql
sudo rm -r /etc/mysql
sudo reboot
sudo apt-get install mariadb-server
问题
在/etc/mysql/conf.d/openstack.cnf
中指定了bind_address = 10.0.0.11
,但是netstat -ntlp
显示MySQL仍然绑定在地址127.0.0.1
,导致其他节点无法访问数据库。
原因
① 查看mysqld默认参数,执行:/usr/sbin/mysqld --print-defaults
/usr/sbin/mysqld would have been started with the following arguments:
--bind-address=10.0.0.11 --default-storage-engine=innodb --innodb_file_per_table --collation-server=utf8_general_ci --character-set-server=utf8 --log-error --user=mysql --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306 --basedir=/usr --datadir=/var/lib/mysql --tmpdir=/tmp --lc-messages-dir=/usr/share/mysql --skip-external-locking --bind-address=127.0.0.1 --key_buffer_size=16M --max_allowed_packet=16M --thread_stack=192K --thread_cache_size=8 --myisam-recover=BACKUP --query_cache_limit=1M --query_cache_size=16M --log_error=/var/log/mysql/error.log --expire_logs_days=10 --max_binlog_size=100M --character-set-server=utf8mb4 --collation-server=utf8mb4_general_ci
发现参数开头是自定义配置信息,后面又添加了其他参数被覆盖了
② 启动mysql服务,查看后台进程,如下:
root 28195 1 0 18:31 ? 00:00:00 /bin/bash /usr/bin/mysqld_safe
root 28196 1 0 18:31 ? 00:00:00 logger -p daemon err -t /etc/init.d/mysql -i
mysql 28360 28195 0 18:31 ? 00:00:00 /usr/sbin/mysqld --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --skip-log-error --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306
root 28361 28195 0 18:31 ? 00:00:00 logger -t mysqld -p daemon error
发现服务启动时候传入的参数和上一步查到的默认参数不一致,而且添加了--skip-log-error
,导致/var/log/mysql/error.log
不再记录错误信息。
③ 查看/etc/mysql/mariadb.cnf
可以看到配置文件加载顺序:
The MariaDB/MySQL tools read configuration files in the following order:
1. "/etc/mysql/mariadb.cnf" (this file) to set global defaults,
2. "/etc/mysql/conf.d/*.cnf" to set global options.
3. "/etc/mysql/mariadb.conf.d/*.cnf" to set MariaDB-only options.
4. "~/.my.cnf" to set user-specific options.
发现/etc/mysql/mariadb.conf.d/
下的50-server.cnf
和50-mysqld_safe.cnf
文件中设置了默认配置信息,根据加载顺序,覆盖了/etc/mysql/conf.d/
下的配置信息。
解决方法
根据需要修改50-server.cnf
和50-mysqld_safe.cnf
即可。
问题
neutron-l3-agent
无法启动,日志文件/var/log/neutron/neutron-l3-agent.log
没有记录任何信息。
原因
① 查看日志/var/log/neutron/neutron-l3-agent.log
发现报错信息如下:
5400 ERROR neutron.agent.l3.agent [-] An interface driver must be specified
l3-agent cannot check service plugins enabled on the neutron server
造成这个错误的原因是,第一次误将neutron-server
和neutron-plugin-ml2
安装在Network
节点上,导致找不到服务。
解决方法:
将neutron-server
和neutron-plugin-ml2
重新安装在 Controller
节点即可。
② 在执行sudo service neutron-l3-agent restart
启动后,迅速执行ps -ef | grep neutron-l3-agent
,可以看到后台进程信息,如下:
network@network:~$ ps -ef | grep neutron-l3-agent
neutron 7269 1 30 21:38 ? 00:00:01 /usr/bin/python /usr/bin/neutron-l3-agent --config-file=/etc/neutron/neutron.conf --config-file=/etc/neutron/l3_agent.ini --config-file=/etc/neutron/fwaas_driver.ini --log-file=/var/log/neutron/neutron-l3-agent.log
network 7284 2453 0 21:38 pts/0 00:00:00 grep --color=auto neutron-l3-agent
③ 从上一步获取neutron-l3-agent
启动命令行参数,手动执行启动,如下,获取启动错误信息:
root@network:/var/log/neutron# /usr/bin/python /usr/bin/neutron-l3-agent --config-file=/etc/neutron/neutron.conf --config-file=/etc/neutron/l3_agent.ini --config-file=/etc/neutron/fwaas_driver.ini --log-file=/var/log/neutron/neutron-l3-agent.log
Guru mediation now registers SIGUSR1 and SIGUSR2 by default for backward compatibility. SIGUSR1 will no longer be registered in a future release, so please use SIGUSR2 to generate reports.
Traceback (most recent call last):
File "/usr/bin/neutron-l3-agent", line 10, in
sys.exit(main())
File "/usr/lib/python2.7/dist-packages/neutron/cmd/eventlet/agents/l3.py", line 17, in main
l3_agent.main()
File "/usr/lib/python2.7/dist-packages/neutron/agent/l3_agent.py", line 51, in main
common_config.init(sys.argv[1:])
File "/usr/lib/python2.7/dist-packages/neutron/common/config.py", line 243, in init
**kwargs)
File "/usr/lib/python2.7/dist-packages/oslo_config/cfg.py", line 2164, in __call__
raise ConfigFilesNotFoundError(self._namespace._files_not_found)
oslo_config.cfg.ConfigFilesNotFoundError: Failed to find some config files: /etc/neutron/fwaas_driver.ini
④ 由最后一行可发现是找不到文件/etc/neutron/fwaas_driver.ini
导致无法启动的。这是因为之前为了重新安装,删除了Network
节点上的部署的neutron
相关的所有组件,并删除了/etc/neutron/
下所有配置文件。重新安装后导致缺失/etc/neutron/fwaas_driver.ini
,从而导致neutron-l3-agent
无法启动且日志文件/var/log/neutron/neutron-l3-agent.log
没有记录任何信息。
解决方法
从Controller
节点拷贝一份到Network
节点,执行命令:
sudo scp controller@controller:/etc/neutron/fwaas_driver.ini /etc/neutron/fwaas_driver.ini
输入controller
用户密码,完成拷贝。
为了保持权限一致,查看fwaas_driver.ini
在Controller
节点上的权限:
controller@controller:~$ ll /etc/neutron/fwaas_driver.ini
-rw-r--r-- 1 root neutron 149 Apr 8 08:15 /etc/neutron/fwaas_driver.ini
network@network:~$ ll /etc/neutron/fwaas_driver.ini
-rw-r--r-- 1 root root 149 May 30 22:14 /etc/neutron/fwaas_driver.ini
network@network:~$ sudo chgrp neutron /etc/neutron/fwaas_driver.ini
network@network:~$ ll /etc/neutron/fwaas_driver.ini
-rw-r--r-- 1 root neutron 149 May 30 22:14 /etc/neutron/fwaas_driver.ini
问题
执行sudo service apache2 start
发现Apache服务无法启动,
2016-07-24 17:55:29.873 112434 CRITICAL keystone [req-8a1299fa-c406-4d70-bd33-9b8eb509a76d - - - - -] error: [Errno 98] Address already in use
原因
官方安装文档中的关闭keystone
服务的方法不起作用,重启后 默认keystone
服务未禁止自启动,已经监听端口5000和35357,发生冲突。可执行ps -ef | grep keystone
查看keystone
服务进程信息。
解决方法
① 安装sysv-rc-conf
sudo apt-get install sysv-rc-conf
查看系统运行级别who -r
② 执行sudo sysv-rc-conf
可看到keystone
默认运行级别为2345
,取消选中。
参考:http://blog.163.com/thinki_cao/blog/static/839448752012112694037995/
③ 修改启动配置文件sudo vi /etc/init/keystone.conf
,将start on runlevel [2345]
修改为start on runlevel []
③ 重新启动服务
sudo reboot
④ 若重启后发现默认keystone
服务仍然自动启动,可执行
sudo service keystone stop
sudo rm /lib/systemd/system/keystone.service
sudo rm /etc/systemd/system/multi-user.target.wants/keystone.service
sudo reboot
问题
创建云主机,状态错误,无法启动,提示NoValidHost: No valid host was found. There are not enough hosts available.
。查看日志sudo /var/log/nova/nova-conductor.log
2016-07-19 10:48:36.873 12190 WARNING nova.scheduler.utils [req-7233346a-5a7d-4af0-9f3d-39d23b567984 905f5309838b4839bdebc2c400488f87 22b3450f6e734442a155ad56ce2382d7 - - -] [instance: fa47a094-d1b5-41ab-9636-780025afb273] Setting instance to ERROR state.
2016-07-19 11:35:03.463 12188 ERROR nova.scheduler.utils [req-a47318b9-a386-41bc-a527-d6764d2b9917 905f5309838b4839bdebc2c400488f87 22b3450f6e734442a155ad56ce2382d7 - - -] [instance: 2d1f1eba-2034-4515-9382-9c75436da40d] Error from last host: compute (node compute): [u'Traceback (most recent call last):\n', u' File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 1926, in _do_build_and_run_instance\n filter_properties)\n', u' File "/usr/lib/python2.7/dist-packages/nova/compute/manager.py", line 2116, in _build_and_run_instance\n instance_uuid=instance.uuid, reason=six.text_type(e))\n', u"RescheduledException: Build of instance 2d1f1eba-2034-4515-9382-9c75436da40d was re-scheduled: Request Failed: internal server error while processing your request.\nNeutron server returns request_ids: ['req-822378f2-1544-4f73-88fd-34de66547565']\n"]
2016-07-19 11:35:03.546 12188 WARNING nova.scheduler.utils [req-a47318b9-a386-41bc-a527-d6764d2b9917 905f5309838b4839bdebc2c400488f87 22b3450f6e734442a155ad56ce2382d7 - - -] Failed to compute_task_build_instances: No valid host was found. There are not enough hosts available.
......
NoValidHost: No valid host was found. There are not enough hosts available.
原因
在controller
节点上,/etc/neutron/neutron.conf
文件中未指定lock_path
,发生网络服务neutron异常,无法访问目标主机。
解决方法
参考下面 6.6
lock_path
问题
controller@controller:~$ neutron router-interface-add router selfservice
Request Failed: internal server error while processing your request.
Neutron server returns request_ids: ['req-0dbe9380-5c83-48ec-b012-a1f258ef3e0d']
原因
未指定lock_path
在controller
节点上,查看日志sudo vi /var/log/neutron/neutron-server.log
2016-07-19 19:25:36.734 15677 ERROR oslo_messaging.rpc.dispatcher [req-adc3fe7b-9fcf-4280-8a0b-b98d018be7b2 - - - - -] Exception during message handling: value required for option: lock_path
2016-07-19 19:25:36.734 15677 ERROR oslo_messaging.rpc.dispatcher RequiredOptError: value required for option: lock_path
解决方法
在controller
节点上,修改配置文件sudo vi /etc/neutron/neutron.conf
,在[oslo_concurrency]
处添加如下内容
[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
将修改写入数据库,重启服务
su root
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
sudo service neutron-server restart
bridge-nf-call-arptables
不存在问题
查看日志sudo vi /var/log/neutron/neutron-linuxbridge-agent.log
,显示错误:
2016-07-19 19:52:01.365 6194 ERROR neutron.agent.linux.utils [req-b8081842-66f0-487e-91c0-62127d7830f2 - - - - -] Exit code: 255; Stdin: ; Stdout: ; Stderr: sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-arptables: No such file or directory
原因
sudo ll /proc/sys/net/bridge/bridge-nf-call-arptables
发现文件存在,但暂时还未发现影响哪个组件的哪个功能,待解决
问题
查看日志sudo vi /var/log/ceilometer/ceilometer-agent-central.log
2016-07-19 20:45:47.074 7482 ERROR ceilometer.agent.manager [req-57db422d-f131-4c99-97cc-fd874956efbc admin - - - -] Skipping endpoint, keystone issue: The request you have made requires authentication. (HTTP 401) (Request-ID: req-69262a02-156c-4b5f-ab3f-924190a6cd98) (HTTP 401)
2016-07-19 20:45:47.078 7482 INFO ceilometer.agent.manager [req-57db422d-f131-4c99-97cc-fd874956efbc admin - - - -] Skip pollster power, no resources found this cycle
原因
待解决
问题
计量警报服务,后台日志一直报错,sudo vi /var/log/aodh/aodh-evaluator.log
2016-07-19 20:34:20.605 7474 ERROR aodh.evaluator [-] alarm evaluation cycle failed
......
2016-07-19 20:33:20.547 7474 ERROR aodh.evaluator ProgrammingError: (pymysql.err.ProgrammingError) (1146, u"Table 'aodh.alarm' doesn't exist") [SQL: u'SELECT alarm.alarm_id AS alarm_alarm_id, alarm.enabled AS alarm_enabled, alarm.name AS alarm_name, alarm.type AS alarm_type, alarm.severity AS alarm_severity, alarm.description AS alarm_description, alarm.timestamp AS alarm_timestamp, alarm.user_id AS alarm_user_id, alarm.project_id AS alarm_project_id, alarm.state AS alarm_state, alarm.state_timestamp AS alarm_state_timestamp, alarm.ok_actions AS alarm_ok_actions, alarm.alarm_actions AS alarm_alarm_actions, alarm.insufficient_data_actions AS alarm_insufficient_data_actions, alarm.repeat_actions AS alarm_repeat_actions, alarm.rule AS alarm_rule, alarm.time_constraints AS alarm_time_constraints \nFROM alarm \nWHERE alarm.enabled = true AND alarm.type != %(type_1)s ORDER BY alarm.timestamp DESC'] [parameters: {u'type_1': 'event'}]
2016-07-19 20:33:20.547 7474 ERROR aodh.evaluator
原因
待解决
问题
2016-07-19 21:09:00.184 7909 ERROR oslo_service.periodic_task [-] Error during Manager.publish_exists_event
2016-07-19 21:09:00.184 7909 ERROR oslo_service.periodic_task Traceback (most recent call last):
2016-07-19 21:09:00.184 7909 ERROR oslo_service.periodic_task File "/usr/lib/python2.7/dist-packages/oslo_service/periodic_task.py", line 220, in run_periodic_tasks
2016-07-19 21:09:00.184 7909 ERROR oslo_service.periodic_task task(self, context)
2016-07-19 21:09:00.184 7909 ERROR oslo_service.periodic_task File "/usr/lib/python2.7/dist-packages/trove/taskmanager/manager.py", line 407, in publish_exists_event
2016-07-19 21:09:00.184 7909 ERROR oslo_service.periodic_task self.admin_context)
2016-07-19 21:09:00.184 7909 ERROR oslo_service.periodic_task File "/usr/lib/python2.7/dist-packages/trove/extensions/mgmt/instances/models.py", line 178, in publish_exist_events
......
2016-07-19 21:09:00.184 7909 ERROR oslo_service.periodic_task Unauthorized: The request you have made requires authentication. (HTTP 401)
2016-07-19 21:09:00.184 7909 ERROR oslo_service.periodic_task
原因
待解决
manila
创建共享错误问题
创建共享,显示状态错误,在blockstorage
节点上查看日志sudo vi /var/log/neutron/neutron-linuxbridge-agent.log
2016-07-19 22:28:44.914 5844 ERROR neutron.plugins.ml2.drivers.agent._common_agent [req-1e855d21-1292-498a-bf78-388528b5cc97 - - - - -] Error in agent loop. Devices info: {'current': set(['tap5636fd8b-48']), 'timestamps': {'tap5636fd8b-48': None}, 'removed': set([]), 'added': set(['tap5636fd8b-48']), 'updated': set([])}
2016-07-19 22:28:41.967 5844 INFO neutron.agent.securitygroups_rpc [req-1e855d21-1292-498a-bf78-388528b5cc97 - - - - -] Preparing filters for devices set(['tap5636fd8b-48'])
2016-07-19 22:28:42.335 5844 ERROR neutron.agent.linux.utils [req-1e855d21-1292-498a-bf78-388528b5cc97 - - - - -] Exit code: 255; Stdin: ; Stdout: ; Stderr: sysctl: cannot stat /proc/sys/net/bridge/bridge-nf-call-arptables: No such file or directory
查看日志sudo vi /var/log/manila/manila-share.log
,显示无法获取共享服务器:
2016-07-19 22:34:08.628 6095 ERROR manila.share.manager [req-c68dc620-0eb4-4847-a271-3ccd76509f48 18d3670a039649299ed141229c509b62 4bedcb61d9eb47cfb5fc79ea4a1a03b0 - - -] Creation of share instance a7c60e8e-9368-4869-abea-ad6196c3ce07 failed: failed to get share server.
2016-07-19 22:34:08.660 6095 ERROR oslo_messaging.rpc.dispatcher [req-c68dc620-0eb4-4847-a271-3ccd76509f48 18d3670a039649299ed141229c509b62 4bedcb61d9eb47cfb5fc79ea4a1a03b0 - - -] Exception during message handling: SSH connection has not been established to 10.254.0.19 in 300s. Giving up.
原因
在安装配置共享服务时网络配置有错,无法更新网络拓扑变化。创建的网络manila_service_network
在节点BlockStorage
上的端口manila:share
未能及时加入到vxlan
,导致创建共享时,网络不通,无法连接节点BlockStorage
上的共享网络。
① 查看BlockStorage
节点上的共享服务网络端口
source ~/.openstack/.admin-openrc
openstack network list
openstack port list
最后得到端口ID:5636fd8b-48
② 查看BlockStorage
节点接口信息
blockstorage@blockstorage:~$ ifconfig -a
ns-5636fd8b-48 Link encap:Ethernet HWaddr fa:16:3e:76:15:f3
tap5636fd8b-48 Link encap:Ethernet HWaddr a2:22:f6:eb:de:dd
vxlan-71 Link encap:Ethernet HWaddr 5a:ff:85:17:37:af
③ 查看网桥信息
blockstorage@blockstorage:~$ brctl show
bridge name bridge id STP enabled interfaces
brqe82fd421-79 8000.5aff851737af no vxlan-71
可见端口tap5636fd8b-48
未绑定到网桥brqe82fd421-79
,不能访问vxlan-71
解决方法:
手动添加端口tap5636fd8b-48
到网桥brqe82fd421-79
参考:
https://ask.openstack.org/en/question/92678
https://ask.openstack.org/en/question/92395
sudo brctl addif brqe82fd421-79 tap5636fd8b-48
brctl show
bridge name bridge id STP enabled interfaces
brqe82fd421-79 8000.5aff851737af no tap5636fd8b-48
vxlan-71
问题
点击Dashboard
中的云硬盘一致性组,提示“错误:无法获取云硬盘一致性组”
controller@controller:~$ cinder consisgroup-list
ERROR: Policy doesn't allow consistencygroup:get_all to be performed. (HTTP 403) (Request-ID: req-45148cb9-ba43-4a66-bd57-0e4f7cfcb6bb)
原因
在cinder
策略配置文件中禁用了一致性组API
解决方法
① 修改配置文件sudo vi /etc/cinder/policy.json
,删除`consistencygroup
规则下的group:nobody
来启用一致性组API。可用vim打开文件,执行如下命令。
:1,$ s/group:nobody//g
② 重启块存储API服务
sudo service cinder-api restart