本文主要参考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 Mitaka for Ubuntu 16.04 LTS 部署指南 1. 硬件服务器2. OpenStack部署分析及规划 2.1 目的2.2 OpenStack网络模型选择2.3 OpenStack节点硬件需求2.4 OpenStack服务组件选择2.5 OpenStack节点网络设计2.6 OpenStack节点服务器规划2.7 OpenStack各节点组件规划2.8 关键信息登记 3. 环境准备 3.1 物理主机基本配置3.2 节点系统安装3.3 节点系统基本环境配置 4. OpenStack节点服务配置 4.1 OpenStack基本配置4.2 身份服务配置(Identity Service - Keystone)4.3 镜像服务配置(Image Service - Glance)4.4 计算服务配置(Compute Service - Nova)4.5 网络服务配置(Networking Service - Neutron)4.6 仪表盘服务配置(Dashboard Service - Horizon)4.7 块存储服务配置(Block Storage Service - Cinder)4.8 共享文件系统服务配置(Shared File Systems Service - Manila) 4.8.1 Shared File Systems Service(Manila)4.8.2 Manila Dashboard(Manila UI) 4.9 对象存储服务配置(Object Storage Service - Swift)4.10 编排服务配置(Orchestration Service - Heat)4.11 计量服务配置(Telemetry Service - Ceilometer) 4.11.1 Telemetry Data Collection Service (Ceilometer)4.11.2 Telemetry Alarming Service (Aodh) 4.12 数据库服务配置(Database Service - Trove) 4.12.1 Database Service(Trove)4.12.2 Trove Dashboard 4.13 数据处理服务配置(Data Processing Service - Sahara) 4.13.1 Data Processing Service(Sahara)4.13.2 Sahara Dashboard 5. 启动实例 5.1 创建虚拟网络 5.1.1 Provider Network5.1.2 Self-Service Network 5.2 创建虚拟机类型模板(Flavor)5.3 生成密钥对5.4 添加安全组规则5.5 启动实例5.6 测试块存储服务5.7 测试编排服务5.8 测试共享文件系统服务 6. 遇到的问题 6.1 安装MariaDB时mariadb.cnf配置问题6.2 MariaDB监听地址无法绑定到指定IP6.3 neutron-l3-agent无法启动且日志文件不更新6.4 Apache服务无法启动6.5 云主机状态错误,无法启动6.6 创建路由失败,缺少lock_path6.7 bridge-nf-call-arptables不存在6.8 计量数据收集服务异常6.9 计量警报服务异常6.10 数据库服务异常6.11 manila创建共享错误6.12 无法获取云硬盘一致性组6.13 从镜像无法创建云主机 参考链接
官方文档中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、StormOpenStack官方文档建议网络布局如下:
本文采用如下网络设计 总共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各节点功能可参考下图 注:仅供参考理解,具体根据实际情况而定
系统信息 注:可用命令uname -srpio和lsb_release -drc查看
Linux 4.4.0-33-generic x86_64 x86_64 GNU/LinuxDescription: Ubuntu 16.04.1 LTSRelease: 16.04Codename: xenial组件版本 注:可用如下命令查看
sudo apt-get install apt-show-versionsapt-show-versions | grep -e mariadb -e mongodb -e rabbitmq -e memcachedapt-show-versions | grep -e keystone -e glance -e nova -e neutron -e horizon -e cinder -e manila -e swift -e heat -e ceilometer -e aodh -e trove -e sahara官方版本查看:http://releases.openstack.org/mitaka/index.html
组件 版本 mariadb 10.0.25 mongodb 2.6.10 rabbitmq 3.5.7 memcached 1.4.25 keystone 9.0.2 glance 12.0.0 nova 13.1.0 neutron 8.1.2 horizon 9.0.1 cinder 8.0.0 manila 2.0.0 swift 2.7.0 heat 6.0.0 ceilometer 6.0.0 aodh 2.0.1 trove 5.0.1 sahara 4.0.0注: ① 请提前设计好所需密码并登记存档,并及时登记用到的服务地址&端口信息。 ② 根据实际情况,将下面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_passwordOpenStack服务用户&密码:
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_passwordOpenStack各节点服务地址&端口 参考: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
创建虚拟机,设置CPU核心数、内存大小、存储大小。添加两块(或三块)虚拟网卡加载Ubuntu Server 16.04 LTS系统镜像启动系统,选择时区、语言,设置主机名和用户名、密码。Partition disks配置步骤: ① 单独设置分区/dev/sda1,大小200MB,用于挂载/boot 选择手动配置-->选择硬盘-->创建新的分区表-->选择空闲空间-->新建分区-->设置大小200MB-->选择主分区-->选择开始位置-->设置文件系统格式Ext4-->设置挂载点/boot-->设置分区。 ② 设置LVM,方便扩展存储,挂载/和swap 配置逻辑卷LVM-->将修改写入磁盘并配置LVM-->新建卷组-->卷组名称:vg_system-->按空格键选中剩余空闲空间/dev/sda-->将修改写入磁盘并配置LVM-->新建逻辑卷-->选择卷组vg_system-->逻辑卷名:lv_root-->设置逻辑卷大小:91GB-->新建逻辑卷-->选择卷组vg_system-->逻辑卷名:lv_swap-->设置逻辑卷大小为剩余空间-->完成。 ③ 分别对每一个逻辑卷进行配置 磁盘格式:lv_root选择ext4,lv_swap选择swap area。 挂载点:lv_root选择"/"。 最后选择完成分区并将更改写入磁盘,点击确定即可。选择服务器默认安装软件包 空格键选择OpenSSH Server,方便使用SSH传输文件。安装Grub。 按照上述步骤,创建其他节点服务器并安装Ubuntu 16.04 LTS系统启用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 specificationroot ALL=(ALL:ALL) ALL# controllercontroller 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-grubsudo 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查看,根据情况自行设定:
# eth0SUBSYSTEM=="net", ACTION=="add", ATTR{address}=="00:0c:29:a9:66:8c", NAME="eth0"# eth2SUBSYSTEM=="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 ens33iface ens33 inet dhcp改为:
#eth0 config (connect to internet)auto eth0iface eth0 inet staticaddress 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 eth1iface eth1 inet staticaddress 10.0.0.11 #IP地址netmask 255.255.255.0 #子网掩码② 重启网卡,使配置生效:
sudo /etc/init.d/networking restartsudo service networking restart注:若找不到上述命令或重启无效可尝试下面命令:
sudo ifdown eth0sudo ifdown eth1sudo ifup eth0sudo ifup eth1注:若提示ifdown: interface eth0 not configured,可换下面命令尝试:
sudo ifconfig eth0 downsudo ifconfig eth1 downsudo ifconfig eth0 upsudo 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=11122netsh 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 nodes10.0.0.11 controller10.0.0.21 network10.0.0.31 compute10.0.0.41 blockstorage10.0.0.51 objectstorage110.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 multiversedeb http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiversedeb http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ xenial main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ xenial-proposed main restricted universe multiversedeb-src http://mirrors.aliyun.com/ubuntu/ xenial-backports main restricted universe multiverse更新系统 ① 更新系统
sudo apt updatesudo apt upgradesudo apt dist-upgradesudo apt autoremove可能遇到的问题: Ubuntu系统/boot容量不足引起的无法更新系统 解决方法: 查看/boot分区容量df -h /boot;查看当前使用内核版本号uname -a;删除旧内核,输入sudo apt-get remove linux-image-,接着按两下tab键,将显示所有的内核版本,把目前使用的版本之前的版本全部删除。最后执行
sudo update-grubsudo grub-mkconfig -o /boot/grub/grub.cfg② 查看系统发行版本和内核版本
network@network:~$ sudo lsb_release -aNo LSB modules are available.Distributor ID: UbuntuDescription: Ubuntu 16.04 LTSRelease: 16.04Codename: xenialnetwork@network:~$ uname -srpiLinux 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/24server cn.pool.ntp.org iburstserver 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-commonsudo apt-get updatesudo apt-get dist-upgradesudo 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.11default-storage-engine = innodbinnodb_file_per_tablecollation-server = utf8_general_cicharacter-set-server = utf8其中,bind-address用于绑定MySQL服务监听地址到Controller节点的Management Network网口IP,以便Compute&Network节点访问MySQL中的OpenStack配置信息。 ④ 重启MySQL数据库:
sudo service mysql restartsudo service mysql status⑤ 查看端口监听情况。
controller@controller:~$ netstat -ntlp | grep 3306tcp 0 0 10.0.0.11:3306 0.0.0.0:* LISTEN -⑥ 开启MySQL安全保护措施 注:测试环境对安全要求较低可忽略该步骤
sudo mysql_secure_installation根据提示输入当前root用户密码,根据实际需要选择后续操作。 ⑦ 测试root用户能否在本机localhost正常登录,执行以下命令:
mysql -uroot -pmysql -h localhost -uroot -p若报错:
ERROR 1698 (28000): Access denied for user 'root'@'localhost'解决方法:
sudo mysql -u rootuse mysql;update user set plugin='' where User='root';flush privileges;exit;注:下面步骤可省略。 ⑧ 测试root用户是否具有远程登录的权限 通常,不赋予root用户远程登录的权限,即只允许root用户在本机localhost上登录。可执行如下命令测试:
mysql -h controller -uroot -pmysql -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 -puse 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.11MongoDB数据库默认在目录/var/lib/mongodb/journal下创建若干1GB大小的日志文件,通过添加如下配置信息,可将每个日志文件大小限制为128 MB,总的日志文件空间大小为512MB。
# Set Journal File Sizesmallfiles = true③ 删除初始日志文件,重启MongoDB服务:
sudo service mongodb stopsudo 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 -pmysql -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 rootsu -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 5000Listen 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 35357telnet 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_TOKENexport OS_URL=http://controller:35357/v3export 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/v3openstack endpoint create --region RegionOne identity internal http://controller:5000/v3openstack 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" adminopenstack user create --domain default --password-prompt adminopenstack 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" demoopenstack user create --domain default --password-prompt demoopenstack 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-openrcopenstack token issue或者
source ~/.openstack/.demo-openrcopenstack token issue注:创建OpenStack客户端环境脚本方法如下
cd ~mkdir ~/.openstack为管理用户admin创建OpenStack客户端环境脚本,vi ~/.openstack/.admin-openrc,添加 注:将下面ADMIN_PASS替换为前面设计的实际密码
# Add environment variables for adminexport OS_PROJECT_DOMAIN_NAME=defaultexport OS_USER_DOMAIN_NAME=defaultexport OS_PROJECT_NAME=adminexport OS_USERNAME=adminexport OS_PASSWORD=ADMIN_PASSexport OS_AUTH_URL=http://controller:35357/v3export OS_AUTH_TYPE=passwordexport OS_IDENTITY_API_VERSION=3export OS_IMAGE_API_VERSION=2为示例用户demo创建OpenStack客户端环境脚本,vi ~/.openstack/.demo-openrc,添加 注:将下面DEMO_PASS替换为前面设计的实际密码
# Add environment variables for demoexport OS_PROJECT_DOMAIN_NAME=defaultexport OS_USER_DOMAIN_NAME=defaultexport OS_PROJECT_NAME=demoexport OS_USERNAME=demoexport OS_PASSWORD=DEMO_PASSexport OS_AUTH_URL=http://controller:5000/v3export OS_AUTH_TYPE=passwordexport OS_IDENTITY_API_VERSION=3export 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 curlcurl http://192.168.1.11:35357/v3curl http://192.168.1.11:5000/v3curl http://controller:35357/v3curl 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:9292openstack endpoint create --region RegionOne image internal http://controller:9292openstack 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:5000auth_url = http://controller:35357memcached_servers = controller:11211auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = glancepassword = GLANCE_PASS[paste_deploy]flavor = keystone在`[glance_store]处配置本地文件系统存储和镜像文件存储位置。
stores = file,httpdefault_store = filefilesystem_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:5000auth_url = http://controller:35357memcached_servers = controller:11211auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = glancepassword = GLANCE_PASS[paste_deploy]flavor = keystone④ 将配置信息写入glance数据库
su rootsu -s /bin/sh -c "glance-manage db_sync" glance⑥ 重启Image Service
sudo service glance-registry restartsudo 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 listPassword: +--------------------------------------+-------------------------+--------+| 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\)sopenstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1/%\(tenant_id\)sopenstack 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和metadataAPIs,将
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 = controllerrabbit_userid = openstackrabbit_password = RABBIT_PASS在[DEFAULT]和[keystone_authtoken]处配置身份服务访问 注:将NOVA_PASS替换为前面设计的实际密码 注:注释或删除[keystone_authtoken]处其他内容
[DEFAULT]auth_strategy = keystone[keystone_authtoken]auth_uri = http://controller:5000auth_url = http://controller:35357memcached_servers = controller:11211auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = novapassword = NOVA_PASS在[DEFAULT]处配置my_ip为Controller节点Management Network网口地址
[DEFAULT]my_ip = 10.0.0.11在[DEFAULT]处启用网络服务支持 注:默认情况下,计算服务使用主机内部防火墙驱动,因此必须禁用OpenStack网络服务中的防火墙驱动。
[DEFAULT]use_neutron = Truefirewall_driver = nova.virt.firewall.NoopFirewallDriver在[vnc]处,使用Controller节点Management Network网口地址配置VNC代理(VNC proxy)。
[vnc]vncserver_listen = $my_ipvncserver_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 rootsu -s /bin/sh -c "nova-manage api_db sync" novasu -s /bin/sh -c "nova-manage db sync" nova④ 重启计算服务
sudo service nova-api restartsudo service nova-consoleauth restartsudo service nova-scheduler restartsudo service nova-conductor restartsudo 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 = controllerrabbit_userid = openstackrabbit_password = RABBIT_PASS② 在[DEFAULT]和[keystone_authtoken]处配置身份服务访问 注:将NOVA_PASS替换为前面设计的实际密码 注:注释或删除[keystone_authtoken]处其他内容
[DEFAULT]auth_strategy = keystone[keystone_authtoken]auth_uri = http://controller:5000auth_url = http://controller:35357memcached_servers = controller:11211auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = novapassword = NOVA_PASS在[DEFAULT]处配置my_ip为Compute节点Management Network网口地址
[DEFAULT]my_ip = 10.0.0.31在[DEFAULT]处启用网络服务支持
[DEFAULT]use_neutron = Truefirewall_driver = nova.virt.firewall.NoopFirewallDriver在[vnc]处配置远程控制访问
[vnc]enabled = Truevncserver_listen = 0.0.0.0vncserver_proxyclient_address = $my_ipnovncproxy_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:9696openstack endpoint create --region RegionOne network internal http://controller:9696openstack 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.sqliteconnection = mysql+pymysql://neutron:NEUTRON_DBPASS@controller/neutron在[DEFAULT]处启用Modular Layer 2 (ML2) plug-in、router service和overlapping IP addresses
[DEFAULT]core_plugin = ml2service_plugins = routerallow_overlapping_ips = True在[DEFAULT]和[oslo_messaging_rabbit]处配置RabbitMQ消息队列访问 注:将RABBIT_PASS替换为前面设计的实际密码
[DEFAULT]rpc_backend = rabbit[oslo_messaging_rabbit]rabbit_host = controllerrabbit_userid = openstackrabbit_password = RABBIT_PASS在[DEFAULT]和[keystone_authtoken]处配置身份服务访问 注:将NEUTRON_PASS替换为前面设计的实际密码 注:注释或删除[keystone_authtoken]处其他配置信息
[DEFAULT]auth_strategy = keystone[keystone_authtoken]auth_uri = http://controller:5000auth_url = http://controller:35357memcached_servers = controller:11211auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = neutronpassword = NEUTRON_PASS在[DEFAULT]和[nova]处配置网络来通知计算节点网络拓扑变化。 注:将NOVA_PASS替换为前面设计的实际密码
[DEFAULT]notify_nova_on_port_status_changes = Truenotify_nova_on_port_data_changes = True[nova]auth_url = http://controller:35357auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultregion_name = RegionOneproject_name = serviceusername = novapassword = 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 rootsu -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:9696auth_url = http://controller:35357auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultregion_name = RegionOneproject_name = serviceusername = neutronpassword = NEUTRON_PASSservice_metadata_proxy = Truemetadata_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 = controllerrabbit_userid = openstackrabbit_password = RABBIT_PASS③ 在[DEFAULT]和[keystone_authtoken]处配置身份服务访问 注:将NEUTRON_PASS替换为前面设计的实际密码 注:注释或删除[keystone_authtoken]处其他配置信息
[DEFAULT]auth_strategy = keystone[keystone_authtoken]auth_uri = http://controller:5000auth_url = http://controller:35357memcached_servers = controller:11211auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = neutronpassword = 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 = Truelocal_ip = OVERLAY_INTERFACE_IP_ADDRESSl2_population = True③ 在[securitygroup]处启用安全组,并配置Linux bridge iptables firewall driver
[securitygroup]enable_security_group = Truefirewall_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.BridgeInterfaceDriverexternal_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.BridgeInterfaceDriverdhcp_driver = neutron.agent.linux.dhcp.Dnsmasqenable_isolated_metadata = True配置元数据代理 元数据代理提供一些诸如证书之类的配置信息。 修改配置文件sudo vi /etc/neutron/metadata_agent.ini,在[DEFAULT]处配置元数据主机和共享密钥。 注:将METADATA_SECRET替换为前面设计的实际密码
[DEFAULT]nova_metadata_ip = controllermetadata_proxy_shared_secret = METADATA_SECRET重启网络服务代理
sudo service neutron-linuxbridge-agent restartsudo service neutron-dhcp-agent restartsudo service neutron-metadata-agent restartsudo 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 = controllerrabbit_userid = openstackrabbit_password = RABBIT_PASS③ 在[DEFAULT]和[keystone_authtoken]处配置身份服务访问 注:将NEUTRON_PASS替换为前面设计的实际密码 注:注释或删除[keystone_authtoken]处其他项
[DEFAULT]auth_strategy = keystone[keystone_authtoken]auth_uri = http://controller:5000auth_url = http://controller:35357memcached_servers = controller:11211auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = neutronpassword = 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 = Truelocal_ip = OVERLAY_INTERFACE_IP_ADDRESSl2_population = True③ 在[securitygroup]处启用安全组,配置Linux bridge iptables firewall driver
[securitygroup]enable_security_group = Truefirewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver配置计算服务访问网络 修改配置文件sudo vi /etc/nova/nova.conf ① 在[neutron]处配置访问参数 注:将NEUTRON_PASS替换为前面设计的实际密码
[neutron]url = http://controller:9696auth_url = http://controller:35357auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultregion_name = RegionOneproject_name = serviceusername = neutronpassword = 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-listneutron 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" volumeopenstack service create --name cinderv2 --description "OpenStack Block Storage" volumev2⑤ 创建块存储服务API路径
openstack endpoint create --region RegionOne volume public http://controller:8776/v1/%\(tenant_id\)sopenstack endpoint create --region RegionOne volume internal http://controller:8776/v1/%\(tenant_id\)sopenstack endpoint create --region RegionOne volume admin http://controller:8776/v1/%\(tenant_id\)sopenstack endpoint create --region RegionOne volumev2 public http://controller:8776/v2/%\(tenant_id\)sopenstack endpoint create --region RegionOne volumev2 internal http://controller:8776/v2/%\(tenant_id\)sopenstack 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 = controllerrabbit_userid = openstackrabbit_password = RABBIT_PASS在[DEFAULT]和[keystone_authtoken]处配置认证服务访问: 注:注释或删除[keystone_authtoken]处其他默认设置。
[DEFAULT]auth_strategy = keystone[keystone_authtoken]auth_uri = http://controller:5000auth_url = http://controller:35357memcached_servers = controller:11211auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = cinderpassword = 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 rootsu -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 restartsudo service cinder-scheduler restartsudo 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 = controllerrabbit_userid = openstackrabbit_password = RABBIT_PASS在[DEFAULT]和[keystone_authtoken]处配置身份认证服务访问: 注:注释或删除[keystone_authtoken]处其他默认配置信息
[DEFAULT]auth_strategy = keystone[keystone_authtoken]auth_uri = http://controller:5000auth_url = http://controller:35357memcached_servers = controller:11211auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = cinderpassword = 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.LVMVolumeDrivervolume_group = cinder-volumesiscsi_protocol = iscsiiscsi_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 restartsudo 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" shareopenstack service create --name manilav2 --description "OpenStack Shared File Systems" sharev2⑤ 创建共享文件系统服务API路径
openstack endpoint create --region RegionOne share public http://controller:8786/v1/%\(tenant_id\)sopenstack endpoint create --region RegionOne share internal http://controller:8786/v1/%\(tenant_id\)sopenstack endpoint create --region RegionOne share admin http://controller:8786/v1/%\(tenant_id\)sopenstack endpoint create --region RegionOne sharev2 public http://controller:8786/v2/%\(tenant_id\)sopenstack endpoint create --region RegionOne sharev2 internal http://controller:8786/v2/%\(tenant_id\)sopenstack 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 = controllerrabbit_userid = openstackrabbit_password = RABBIT_PASS在[DEFAULT]处添加如下配置信息:
default_share_type = default_share_typerootwrap_config = /etc/manila/rootwrap.conf在[DEFAULT]和[keystone_authtoken]处配置认证服务访问: 注:注释或删除[keystone_authtoken]处其他默认设置。
[DEFAULT]auth_strategy = keystone[keystone_authtoken]memcached_servers = controller:11211auth_uri = http://controller:5000auth_url = http://controller:35357auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = manilapassword = 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 rootsu -s /bin/sh -c "manila-manage db sync" manila重启共享文件系统服务
sudo service manila-scheduler restartsudo 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 = controllerrabbit_userid = openstackrabbit_password = RABBIT_PASS在[DEFAULT]处添加如下配置信息:
default_share_type = default_share_typerootwrap_config = /etc/manila/rootwrap.conf在[DEFAULT]和[keystone_authtoken]处配置身份认证服务访问: 注:注释或删除[keystone_authtoken]处其他默认配置信息
[DEFAULT]auth_strategy = keystone[keystone_authtoken]memcached_servers = controller:11211auth_uri = http://controller:5000auth_url = http://controller:35357auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = manilapassword = 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 = controllerrabbit_userid = openstackrabbit_password = RABBIT_PASS在[DEFAULT]和[keystone_authtoken]处配置身份服务访问 注:将NEUTRON_PASS替换为前面设计的实际密码 注:注释或删除[keystone_authtoken]处其他项
[DEFAULT]auth_strategy = keystone[keystone_authtoken]auth_uri = http://controller:5000auth_url = http://controller:35357memcached_servers = controller:11211auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = neutronpassword = 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 = Truelocal_ip = OVERLAY_INTERFACE_IP_ADDRESSl2_population = True在[securitygroup]处启用安全组,配置Linux bridge iptables firewall driver
[securitygroup]enable_security_group = Truefirewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver⑤ 修改配置文件sudo vi /etc/manila/manila.conf 在[DEFAULT]处启用generic和NFS/CIFS协议: 注:下面共享后端名称可任意设置,本指南设置为驱动名称。
[DEFAULT]enabled_share_backends = genericenabled_share_protocols = NFS,CIFS在[neutron]、[nova]和[cinder]处启用这些服务的认证信息: 注:将NEUTRON_PASS、NOVA_PASS和CINDER_PASS替换为前面设计的实际密码
[neutron]url = http://controller:9696auth_uri = http://controller:5000auth_url = http://controller:35357memcached_servers = controller:11211auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultregion_name = RegionOneproject_name = serviceusername = neutronpassword = NEUTRON_PASS[nova]auth_uri = http://controller:5000auth_url = http://controller:35357memcached_servers = controller:11211auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultregion_name = RegionOneproject_name = serviceusername = novapassword = NOVA_PASS[cinder]auth_uri = http://controller:5000auth_url = http://controller:35357memcached_servers = controller:11211auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultregion_name = RegionOneproject_name = serviceusername = cinderpassword = CINDER_PASS在[generic]处配置generic驱动:
[generic]share_backend_name = GENERICshare_driver = manila.share.drivers.generic.GenericShareDriverdriver_handles_share_servers = Trueservice_instance_flavor_id = 100service_image_name = manila-service-imageservice_instance_user = manilaservice_instance_password = manilainterface_driver = manila.network.linux.interface.BridgeInterfaceDriver⑥ 重启服务
sudo service manila-share restartsudo 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_uisudo cp ./enabled/_90_manila_*.py /usr/share/openstack-dashboard/openstack_dashboard/local/enabled配置中文语言支持
sudo apt-get install gettext python-pip python-dev build-essentialcd /usr/share/openstack-dashboard/horizonsudo /usr/share/openstack-dashboard/manage.py makemessages -l en --no-obsoletesudo /usr/share/openstack-dashboard/manage.py makemessages -d djangojs -l en --no-obsoletecd /usr/share/openstack-dashboard/openstack_dashboardsudo /usr/share/openstack-dashboard/manage.py makemessages --extension=html,txt,csv --ignore=openstack -l en --no-obsoletecd /usr/share/openstack-dashboard/horizonsudo /usr/share/openstack-dashboard/manage.py compilemessagescd /usr/share/openstack-dashboard/openstack_dashboardsudo /usr/share/openstack-dashboard/manage.py compilemessagescd /usr/local/lib/python2.7/dist-packages/manila_uisudo 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\)sopenstack endpoint create --region RegionOne object-store internal http://controller:8080/v1/AUTH_%\(tenant_id\)sopenstack 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 = 8080user = swiftswift_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#proxyaccount_autocreate = True在[filter:keystoneauth]处设置操作用户角色:
[filter:keystoneauth]use = egg:swift#keystoneauthoperator_roles = admin,user在[filter:authtoken]处配置认证服务访问: 注:将SWIFT_PASS替换为前面设计的实际密码。 注:注释或删除[filter:authtoken]处其他默认设置。
[filter:authtoken]paste.filter_factory = keystonemiddleware.auth_token:filter_factoryauth_uri = http://controller:5000auth_url = http://controller:35357memcached_servers = controller:11211auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = swiftpassword = SWIFT_PASSdelay_auth_decision = True在[filter:cache]处配置Memcached位置:
[filter:cache]use = egg:swift#memcachememcache_servers = controller:11211部署节点:ObjectStorage Node
注:每个对象存储节点都需执行以下步骤
安装配置XFS ① 安装XFS:
sudo apt-get install xfsprogs rsync② 将存储设备/dev/sdb和/dev/sdc格式化为XFS文件系统:
sudo mkfs.xfs /dev/sdbsudo mkfs.xfs /dev/sdc③ 创建挂载点目录:
sudo mkdir -p /srv/node/sdbsudo 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/sdbsudo mount /srv/node/sdc⑥ 新建或修改置文件sudo vi /etc/rsyncd.conf,添加如下信息: 注:将下面MANAGEMENT_INTERFACE_IP_ADDRESS替换为对象存储节点Management Network网络接口地址10.0.0.51或10.0.0.52
uid = swiftgid = swiftlog file = /var/log/rsyncd.logpid file = /var/run/rsyncd.pidaddress = MANAGEMENT_INTERFACE_IP_ADDRESS[account]max connections = 2path = /srv/node/read only = Falselock file = /var/lock/account.lock[container]max connections = 2path = /srv/node/read only = Falselock file = /var/lock/container.lock[object]max connections = 2path = /srv/node/read only = Falselock 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/mitakasudo curl -o /etc/swift/container-server.conf https://git.openstack.org/cgit/openstack/swift/plain/etc/container-server.conf-sample?h=stable/mitakasudo 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_ADDRESSbind_port = 6002user = swiftswift_dir = /etc/swiftdevices = /srv/nodemount_check = True在[pipeline:main]处启用相关模块:
[pipeline:main]pipeline = healthcheck recon account-server在[filter:recon]处配置recon(meters)缓存:
[filter:recon]use = egg:swift#reconrecon_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_ADDRESSbind_port = 6001user = swiftswift_dir = /etc/swiftdevices = /srv/nodemount_check = True在[pipeline:main]处启用相关模块:
[pipeline:main]pipeline = healthcheck recon container-server在[filter:recon]处配置recon(meters)缓存:
[filter:recon]use = egg:swift#reconrecon_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_ADDRESSbind_port = 6000user = swiftswift_dir = /etc/swiftdevices = /srv/nodemount_check = True在[pipeline:main]处启用相关模块:
[pipeline:main]pipeline = healthcheck recon object-server在[filter:recon]处配置recon(meters)缓存:
[filter:recon]use = egg:swift#reconrecon_cache_path = /var/cache/swiftrecon_lock_path = /var/lock⑥ 修改挂载点目录所有者:
sudo chown -R swift:swift /srv/node⑦ 创建recon目录,并修改所有者:
sudo mkdir -p /var/cache/swiftsudo chown -R root:swift /var/cache/swiftsudo 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 100sudo swift-ring-builder account.builder add --region 1 --zone 1 --ip 10.0.0.51 --port 6002 --device sdc --weight 100sudo swift-ring-builder account.builder add --region 1 --zone 2 --ip 10.0.0.52 --port 6002 --device sdb --weight 100sudo 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 100sudo swift-ring-builder container.builder add --region 1 --zone 1 --ip 10.0.0.51 --port 6001 --device sdc --weight 100sudo swift-ring-builder container.builder add --region 1 --zone 2 --ip 10.0.0.52 --port 6001 --device sdb --weight 100sudo 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 100sudo swift-ring-builder object.builder add --region 1 --zone 1 --ip 10.0.0.51 --port 6000 --device sdc --weight 100sudo swift-ring-builder object.builder add --region 1 --zone 2 --ip 10.0.0.52 --port 6000 --device sdb --weight 100sudo 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_SUFFIXswift_hash_path_prefix = HASH_PATH_PREFIX在[storage-policy:0]处设置默认存储策略:
[storage-policy:0]name = Policy-0default = 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 restartsudo 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: 0X-Put-Timestamp: 1465023102.25072X-Timestamp: 1465023102.25072 X-Trans-Id: tx4a14ec8f1e6c46179a9b8-0057527a7dContent-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" orchestrationopenstack service create --name heat-cfn --description "Orchestration" cloudformation⑤ 创建Orchestration服务API路径
openstack endpoint create --region RegionOne orchestration public http://controller:8004/v1/%\(tenant_id\)sopenstack endpoint create --region RegionOne orchestration internal http://controller:8004/v1/%\(tenant_id\)sopenstack endpoint create --region RegionOne orchestration admin http://controller:8004/v1/%\(tenant_id\)sopenstack endpoint create --region RegionOne cloudformation public http://controller:8000/v1openstack endpoint create --region RegionOne cloudformation internal http://controller:8000/v1openstack 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 = controllerrabbit_userid = openstackrabbit_password = RABBIT_PASS在[keystone_authtoken]、[trustee]、[clients_keystone]和[ec2authtoken]处配置认证服务访问:
[DEFAULT]auth_strategy = keystone[keystone_authtoken]auth_uri = http://controller:5000auth_url = http://controller:35357memcached_servers = controller:11211auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = heatpassword = HEAT_PASS[trustee]auth_plugin = passwordauth_url = http://controller:35357username = heatpassword = HEAT_PASSuser_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:8000heat_waitcondition_server_url = http://controller:8000/v1/waitcondition在[DEFAULT]处配置stack域和管理证书:
[DEFAULT]stack_domain_admin = heat_domain_adminstack_domain_admin_password = HEAT_DOMAIN_PASSstack_user_domain_name = heat③ 将配置信息写入Orchestration服务数据库heat
su rootsu -s /bin/sh -c "heat-manage db_sync" heat重启服务,完成安装
sudo service heat-api restartsudo service heat-api-cfn restartsudo 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:8777openstack endpoint create --region RegionOne metering internal http://controller:8777openstack 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 = controllerrabbit_userid = openstackrabbit_password = RABBIT_PASS在[DEFAULT]和[keystone_authtoken]处配置认证服务访问:
[DEFAULT]auth_strategy = keystone[keystone_authtoken]auth_uri = http://controller:5000auth_url = http://controller:35357memcached_servers = controller:11211auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = ceilometerpassword = CEILOMETER_PASS在[service_credentials]处配置服务证书
[service_credentials]auth_type = passwordauth_url = http://controller:5000/v3project_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = ceilometerpassword = CEILOMETER_PASSinterface = internalURLregion_name = RegionOne重启服务,完成安装
sudo service ceilometer-agent-central restartsudo service ceilometer-agent-notification restartsudo service ceilometer-api restartsudo 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 = controllerrabbit_userid = openstackrabbit_password = RABBIT_PASS② 重启服务,完成安装
sudo service glance-registry restartsudo 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 = controllerrabbit_userid = openstackrabbit_password = RABBIT_PASS在[DEFAULT]和[keystone_authtoken]处配置认证服务访问:
[DEFAULT]auth_strategy = keystone[keystone_authtoken]auth_uri = http://controller:5000auth_url = http://controller:35357memcached_servers = controller:11211auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = ceilometerpassword = CEILOMETER_PASS在[service_credentials]处配置服务证书
[service_credentials]auth_url = http://controller:5000/v2.0username = ceilometerproject_name = servicepassword = CEILOMETER_PASSinterface = internalURLregion_name = RegionOne配置计算服务使用计量服务 修改配置文件sudo vi /etc/nova/nova.conf,在[DEFAULT]处配置通知信息:
[DEFAULT]instance_usage_audit = Trueinstance_usage_audit_period = hournotify_on_state_change = vm_and_task_statenotification_driver = messagingv2重启服务,完成安装
sudo service ceilometer-agent-compute restartsudo 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 restartsudo service cinder-scheduler restart③ 在BlockStorage节点上重启服务
sudo service cinder-volume restart启用对象存储服务计量 计量服务通过轮询和通知相结合的方式收集对象存储计量信息。 ① 在Controller节点上创建角色ResellerAdmin,并将该角色授予ceilometer用户
source ~/.openstack/.admin-openrcopenstack role create ResellerAdminopenstack 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_factorycontrol_exchange = swifturl = rabbit://openstack:RABBIT_PASS@controller:5672/driver = messagingv2topic = notificationslog_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:8042openstack endpoint create --region RegionOne alarming internal http://controller:8042openstack 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 = controllerrabbit_userid = openstackrabbit_password = RABBIT_PASS在[DEFAULT]和[keystone_authtoken]处配置认证服务访问:
[DEFAULT]auth_strategy = keystone[keystone_authtoken]auth_uri = http://controller:5000auth_url = http://controller:35357memcached_servers = controller:11211auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = aodhpassword = AODH_PASS在[service_credentials]处配置服务证书
[service_credentials]auth_type = passwordauth_url = http://controller:5000/v3project_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = aodhpassword = AODH_PASSinterface = internalURLregion_name = RegionOne③ 修改配置文件sudo vi /etc/aodh/api_paste.ini 修改[filter:authtoken]如下:
[filter:authtoken]oslo_config_project = aodh④ 重启Alarming服务
sudo service aodh-api restartsudo service aodh-evaluator restartsudo service aodh-notifier restartsudo 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\)sopenstack endpoint create --region RegionOne database internal http://controller:8779/v1.0/%\(tenant_id\)sopenstack endpoint create --region RegionOne database admin http://controller:8779/v1.0/%\(tenant_id\)s安装配置Database服务组件 ① 安装组件
sudo apt-get updatesudo 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/trovetrove_auth_url = http://controller:5000/v2.0nova_compute_url = http://controller:8774/v2cinder_url = http://controller:8776/v1swift_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 = controllerrabbit_userid = openstackrabbit_password = RABBIT_PASS③ 检查api-paste.ini是否在/etc/trove目录下
ll /etc/trove④ 修改配置文件sudo vi /etc/trove/trove.conf,检查确认下面所列设置项的值。 注:将TROVE_PASS替换为前面设计的实际密码
[DEFAULT]auth_strategy = keystoneadd_addresses = Truenetwork_label_regex = .*api_paste_config = /etc/trove/api-paste.ini[keystone_authtoken]auth_uri = http://controller:5000auth_url = http://controller:35357auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = trovepassword = TROVE_PASS⑤ 修改配置文件sudo vi /etc/trove/trove-taskmanager.conf,检查确认下面所列设置项的值。 注:将ADMIN_PASS替换为前面设计的实际密码
[DEFAULT]nova_proxy_admin_user = adminnova_proxy_admin_pass = ADMIN_PASSnova_proxy_admin_tenant_name = servicetaskmanager_manager = trove.taskmanager.manager.Manager⑥ 修改配置文件sudo vi /etc/trove/trove-guestagent.conf,检查确认下面所列设置项的值。 注:将RABBIT_PASS和ADMIN_PASS替换为前面设计的实际密码
rabbit_host = controllerrabbit_password = RABBIT_PASSnova_proxy_admin_user = adminnova_proxy_admin_pass = ADMIN_PASSnova_proxy_admin_tenant_name = servicetrove_auth_url = http://controller:35357/v2.0⑦ 将配置信息写入trove数据库
su rootsu -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 -puse trove;SET GLOBAL foreign_key_checks=0;然后,重新执行上述命令。最后,在开启外键约束检查功能。
mysql -uroot -puse 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 restartsudo service trove-taskmanager restartsudo 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 rootsu -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_dashboardsudo 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\)sopenstack endpoint create --region RegionOne data-processing internal http://controller:8386/v1.1/%\(tenant_id\)sopenstack 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:5000auth_url = http://controller:35357memcached_servers = controller:11211auth_type = passwordproject_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = saharapassword = SAHARA_PASSidentity_uri = http://controller:35357admin_tenant_name = serviceadmin_user = saharaadmin_password = SAHARA_PASS[paste_deploy]flavor = keystone在[DEFAULT]处配置网络服务:
[DEFAULT]use_neutron = trueuse_namespaces=Trueuse_rootwrap=Truerootwrap_command='sudo sahara-rootwrap /etc/sahara/rootwrap.conf'use_floating_ips = trueverbose = truelog_file = sahara.loglog_dir = /var/log/sahara在[oslo_messaging_notifications]处配置通知服务:
[oslo_messaging_notifications]enable = truedriver = 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 = controllerrabbit_userid = openstackrabbit_password = RABBIT_PASS在[infrastructure_engine]处配置编排服务:
[DEFAULT]infrastructure_engine = heat在[service_credentials]处添加如下内容:
[service_credentials]auth_type = passwordauth_url = http://controller:5000/v3project_domain_name = defaultuser_domain_name = defaultproject_name = serviceusername = saharapassword = SAHARA_PASSinterface = internalURLregion_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 startsudo 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_dashboardsudo 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 = providerNetwork节点上的/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-openrcneutron net-update provider --router:externalsource ~/.openstack/.demo-openrcneutron router-create routerneutron router-interface-add router selfserviceneutron 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-openrcopenstack 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.1ping -c 4 openstack.orgifconfig -a对于Self-Service网络虚拟机:
ping -c 4 172.16.1.1ping -c 4 openstack.orgifconfig -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.102sudo fdisk -l注:在使用卷之前,必须在块设备上创建文件系统并将其挂载到系统中。
部署节点:Controller Node
创建一个模板 编排服务采用模板来设计栈。创建文件demo-template.yml,添加如下内容:
heat_template_version: 2015-10-15description: 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问题 安装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 existdpkg: error processing package mariadb-common (--configure): subprocess installed post-installation script returned error exit status 2Errors were encountered while processing: mariadb-commonE: 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 unconfiguredProcessing triggers for libc-bin (2.23-0ubuntu3) ...Errors were encountered while processing: mariadb-server-10.0 mariadb-serverE: Sub-process /usr/bin/dpkg returned an error code (1)原因 问题 ①: 重装MariaDB时将配置文件删除,导致找不到配置文件mariadb.cnf。
解决方法 问题 ①: 在/etc/mysql/下新建一个mariadb.cnf文件,或者从别的电脑上拷贝一个mariadb.cnf到该目录。 问题 ②: 彻底清除配置文件,删除软件,重新安装。
sudo service mysql stopsudo apt-get purge mysql* mariadb*sudo apt autoremovesudo rm -r /var/lib/mysqlsudo rm -r /var/log/mysqlsudo rm -r /etc/mysqlsudo rebootsudo 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_saferoot 28196 1 0 18:31 ? 00:00:00 logger -p daemon err -t /etc/init.d/mysql -imysql 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=3306root 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 specifiedl3-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-agentneutron 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.lognetwork 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.logGuru 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 <module>sys.exit(main())File "/usr/lib/python2.7/dist-packages/neutron/cmd/eventlet/agents/l3.py", line 17, in mainl3_agent.main()File "/usr/lib/python2.7/dist-packages/neutron/agent/l3_agent.py", line 51, in maincommon_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.ininetwork@network:~$ ll /etc/neutron/fwaas_driver.ini-rw-r--r-- 1 root root 149 May 30 22:14 /etc/neutron/fwaas_driver.ininetwork@network:~$ sudo chgrp neutron /etc/neutron/fwaas_driver.ininetwork@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 stopsudo rm /lib/systemd/system/keystone.servicesudo rm /etc/systemd/system/multi-user.target.wants/keystone.servicesudo 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
问题
controller@controller:~$ neutron router-interface-add router selfserviceRequest 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_path2016-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 rootsu -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutronsudo service neutron-server restart问题 查看日志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_event2016-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_tasks2016-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_event2016-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原因 待解决
问题 创建共享,显示状态错误,在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-openrcopenstack network listopenstack port list最后得到端口ID:5636fd8b-48
② 查看BlockStorage节点接口信息
blockstorage@blockstorage:~$ ifconfig -ans-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 showbridge name bridge id STP enabled interfacesbrqe82fd421-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-48brctl showbridge name bridge id STP enabled interfacesbrqe82fd421-79 8000.5aff851737af no tap5636fd8b-48 vxlan-71问题 点击Dashboard中的云硬盘一致性组,提示“错误:无法获取云硬盘一致性组”
controller@controller:~$ cinder consisgroup-listERROR: 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问题 从镜像启动云主机时,提示"No valid host was found. There are not enough hosts available",查看compute节点日志/var/log/nova/nova-compute.log发现如下错误:
2016-08-13 20:00:13.880 6753 ERROR nova.compute.manager [instance: c34a05ab-333b-4bb3-a7e3-41f05ee32e66] BadRequest: Invalid input for dns_name. Reason: 'ubuntu-server-16.04' not a valid PQDN or FQDN. Reason: TLD '04' must not be all numeric.原因 创建云主机时名字命名格式有错,如该主机名为Ubuntu Server 16.04,Openstack自动将名称转换为ubuntu-server-16.04,由于主机名中存在非法字符.,导致网络配置时DNS名称出错。
解决方法 修改云主机名称为ubuntu-server-1604即可。