手把手教你安装OpenStack——Ocata安装指南

本文参考:https://docs.openstack.org/ocata/install-guide-rdo/index.html官方文档来手把手教你安装Ocata,安装文档中有漏洞的地方,本文都会提及。本指南不会给出所有命令的输出结果,只给出部分必要的解释,因此在安装时最好对照着官方文档进行。

本文目录:

  • 安装环境
  • 认证服务
  • 镜像服务
  • 计算服务
  • 网络服务
  • Dashboard

一、安装环境 1、示例架构

根据官方文档,本文架构采用一个控制节点和一个计算节点。

(The example architecture requires at least twonodes (hosts) to launch a basic virtual machine or instance. )

控制节点运行认证服务、镜像服务、计算服务的管理部分、网络服务的管理部分、各种网络代理以及Dashboard,还包括一些基础服务如数据库、消息队列以及NTP。

计算节点上运行计算服务中管理实例的管理程序部分。默认情况下,计算服务使用 KVM。还运行网络代理服务,用来连接实例和虚拟网络以及通过安全组给实例提供防火墙服务。

2、网络

  • 公有网络

公有网络选项以尽可能简单的方式通过layer-2(网桥/交换机)服务以及VLAN网络的分割来部署OpenStack网络服务。实际上,它将虚拟网络桥接到物理网络,并依靠物理网络基础设施提供layer-3服务(路由)。另外,DHCP服务为实例提供IP地址。

  • 私有网络

私有网络选项扩展了公有网络选项,增加了layer-3(路由)服务,使用VXLAN类似的方式。本质上,它使用NAT路由虚拟网络到物理网络。另外,这个选项也提供高级服务的基础,比如LBaas和FWaaS。

这里我们选择私有网络。

3、安全

下面是各个需要密码的服务以及解释,建议这些密码使用同一个,以免混淆。

4、主机网络配置

控制节点

  • 配置网络接口

Controller:IP:192.168.0.112/24 GATEWAY:192.168.0.1

网络配置完之后需要将防火墙和selinux关闭。

  • 关闭防火墙:

systemctl stop firewalld.service

  • 禁止防火墙开机启动

systemctl disable firewalld.service

  • 关闭selinux

vim /etc/selinux/config,配置selinux=disabled

# setenforce 0,使配置立即生效

  • 配置地址解析

编辑/etc/hosts

# controller

192.168.0.112 controller

# compute1

192.168.0.113 compute1

计算节点

  • 配置网络接口。

Compute:IP:192.168.0.113/24 GATEWAY:192.168.0.1

同样需要配置地址解析,参考控制节点。

配置完成之后需要进行验证:

  • 与外网连通性:

分别在控制节点和计算节点上:

# ping -c 4 www.baidu.com

  • 控制节点和计算节点连通性:

控制节点上输入# ping -c 4 compute1

计算节点上输入# ping -c 4 controller

5、NTP

控制节点

  • 安装相关包

# yum install chrony

  • 编辑 /etc/chrony.conf

server NTP_SERVER iburst

可以根据需要将NTP_SERVER替换为合适的NTP服务器,建议不用改。然后添加:

allow 192.168.0.0/24

即允许计算节点同步。(计算节点IP网段属于192.168.0.0)

# systemctl enable chronyd.service

# systemctl start chronyd.service

启动服务。

计算节点

编辑/etc/chrony.conf,可以将其他的几个同步地址注释掉。

server controller iburst

同步控制节点。

# systemctl enable chronyd.service

# systemctl start chronyd.service

启动服务。(如果发现同步的不是控制节点,那么重启一下NTP服务即可。)

# systemctl restart chronyd.service

验证操作:

在控制节点上同步时间。

# chronyc sources

带星号的是NTP当前同步的地址。

计算节点上同步。

# chronycsources

210 Number of sources = 1

MS Name/IP address

Stratum Poll Reach LastRx Last sample

======================================================

^* controller 3 9 377 421 +15us[ -87us] +/- 15ms

6、安装OpenStack包

以下操作在所有节点上进行。

  • 启用OpenStack库:

# yum install centos-release-openstack-ocata

  • 完成安装

1)在所有节点上升级包

# yum upgrade

2)安装OpenStack 客户端

# yum install python-openstackclient

3)CentOS默认启用了SELinux,安装openstack-selinux来自动管理OpenStack服务的安全策略。

# yum install openstack-selinux

7、安装数据库

数据库一般运行在控制节点上。

安装并配置组件。

  • 安装相关包。

# yum install mariadb mariadb-server python2-PyMySQL

创建并编辑/etc/my.cnf.d/openstack.cnf 文件,并完成以下操作。在配置文件中添加以下配置:

[mysqld]

bind-address=192.168.0.112

default-storage-engine=innodb

innodb_file_per_table=on

max_connections=4096

collation-server=utf8_general_ci

character-set-server=utf8

其中bind-address为控制节点IP地址。

  • 完成安装

1)启动数据库并设置开机启动

# systemctl enable mariadb.service

# systemctl start mariadb.service

2)运行mysql_secure_installation脚本来保证数据库安全,为root账户设置一个合适的密码

# mysql_secure_installation

8、消息队列

OpenStack使用消息队列来协调服务之间的状态和操作,消息队列服务一般运行在控制节点上。,OpenStack支持RabbitMQ,Qpid以及ZeroMQ等消息队列服务。本指南使用RabbitMQ消息队列服务。

  • 安装相关包

# yum install rabbitmq-server

  • 启动消息队列并设置开机启动

# systemctl enable rabbitmq-server.service

# systemctl start rabbitmq-server.service

  • 添加openstack用户

#rabbitmqctl add_user openstack RABBIT_PASS

Creating user “openstack” …

使用合适的密码替换掉 RABBIT_PASS

  • 允许openstack用户的配置、写、读权限

#rabbitmqctl set_permissions openstack”.*””.*””.*”

Setting permissions for user “openstack” in vhost “/” …

9、缓存令牌

认证服务的认证机制使用Memcached来缓存令牌,一般运行在控制节点上。

  • 安装相关包

# yum install memcached python-memcached

编辑 /etc/sysconfig/memcached文件并配置IP地址,将127.0.0.1改为控制节点IP。

  • 完成安装

启动 Memcached服务并设置开机启动。

# systemctl enable memcached.service

# systemctl start memcached.service

二、认证服务

控制节点上配置。 1、前提条件

  • 创建数据库

以root身份登录数据库

$ mysql -u root -p

创建keystone数据库

MariaDB[(none)]> CREATE DATABASE keystone;

给数据库赋予适当的权限;

MariaDB [(none)]> GRANT ALL PRIVILEGESON keystone.* TO ‘keystone’@’localhost’

IDENTIFIED BY ‘KEYSTONE_DBPASS’;

MariaDB [(none)]> GRANT ALL PRIVILEGESON keystone.* TO ‘keystone’@’%’

IDENTIFIED BY ‘KEYSTONE_DBPASS’;

用合适的密码替换KEYSTONE_DBPASS

2、安装并配置组件

  • 运行命令安装相关包

# yum install openstack-keystone httpd mod_wsgi

编辑文件/etc/keystone/keystone.conf

在[database]选项配置数据库连接

[database]

# …

connection=mysql+pymysql://keystone:KEYSTONE_DBPASS@controller/keystone

替换掉KEYSTONE_DBPASS

在[token]选项中,配置,Fernet令牌提供者:

[token]

# …

provider=fernet

  • 同步认证服务数据库

# su -s/bin/sh -c “keystone-manage db_sync” keystone

  • 初始化Fernetkey仓库

# keystone-manage fernet_setup –keystone-user keystone –keystone-

groupkeystone

# keystone-manage credential_setup –keystone-user keystone–keystone-groupkeystone

  • 引导认证服务

# keystone-manage bootstrap –bootstrap-password ADMIN_PASS

–bootstrap-admin-urlhttp://controller:35357/v3/

–bootstrap-internal-urlhttp://controller:5000/v3/

–bootstrap-public-urlhttp://controller:5000/v3/

–bootstrap-region-id RegionOne

替换掉ADMIN_PASS

  • 配置Apache服务器
  1. 编辑/etc/httpd/conf/httpd.conf并配置ServerName选项,使之参考控制节点
  2. 给/usr/share/keystone/wsgi-keystone.conf文件创建一个链接

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

  • 完成安装

1.启动Apache服务器并设置开机启动

# systemctlenable httpd.service

# systemctl start httpd.service

2.配置管理账户

$export OS_USERNAME=admin

$export OS_PASSWORD=ADMIN_PASS

$export OS_PROJECT_NAME=admin

$export OS_USER_DOMAIN_NAME=Default

$export OS_PROJECT_DOMAIN_NAME=Default

$export OS_AUTH_URL=http://controller:35357/v3

$export OS_IDENTITY_API_VERSION=3

3、创建一个域、项目、用户和角色

  • 本指南有一个service 项目,你添加的每一个服务都有唯一的用户。

$ openstack project create –domain default

–deion “Service Project”service

  • 普通的任务不应该使用具有特权的项目和用户。作为示例,本指南创建一个demo项目和用户。

1、创建demo项目:

$ openstack project create –domain default

–deion “Demo Project”demo

2、创建demo用户:

$ openstack user create –domain default

–password-prompt demo

3、创建user角色:

$ openstack role create user

4、将user角色添加到demo项目和用户中。

$ openstack role add –project demo –user demo user

4、验证操作

  • 出于安全性的原因,禁用掉暂时的认证令牌机制。

编辑/etc/keystone/keystone-paste.ini文件,并从[pipeline:public_api], [pipeline:admin_api], 和[pipeline:api_v3]选项中删除admin_token_auth

  • 取消设置临时的OS_AUTH_URL和OS_PASSWORD环境变量:

$unset OS_AUTH_URL OS_PASSWORD

  • 使用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 admintoken issue

这里遇到错误

由于是Http错误,所以返回Apache HTTP 服务配置的地方,重启Apache 服务,并重新设置管理账户:

# systemctlrestart httpd.service

$ export OS_USERNAME=admin

$ export OS_PASSWORD=ADMIN_PASS

$ export OS_PROJECT_NAME=admin

$ export OS_USER_DOMAIN_NAME=Default

$ export OS_PROJECT_DOMAIN_NAME=Default

$ export OS_AUTH_URL=http://controller:35357/v3

$ export OS_IDENTITY_API_VERSION=3

错误解决!

  • 使用demo用户,请求认证令牌:

$ openstack–os-auth-url http://controller:5000/v3

–os-project-domain-namedefault –os-user-domain-name default

–os-project-namedemo –os-username demo token issue

Password:

密码为创建demo用户时的密码。

5、创建OpenStack客户端环境脚本:

在前面章节中,我们使用环境变量和命令的组合来配置认证服务,为了更加高效和方便,我们创建一个脚本方便以后的操作。这些脚本包括一些公共的操作,但是也支持自定义的操作。

  • 创建脚本

创建并编辑admin-openrc文件,并添加以下内容:

export OS_PROJECT_DOMAIN_NAME=Default

export OS_USER_DOMAIN_NAME=Default

export OS_PROJECT_NAME=admin

export OS_USERNAME=admin

export OS_PASSWORD=root

export OS_AUTH_URL=http://controller:35357/v3

export OS_IDENTITY_API_VERSION=3

export OS_IMAGE_API_VERSION=2

替换掉OS_PASSWORD的密码。

创建并编辑demo-openrc文件,并添加以下内容:

export OS_PROJECT_DOMAIN_NAME=Default

export OS_USER_DOMAIN_NAME=Default

export OS_PROJECT_NAME=demo

export OS_USERNAME=demo

export OS_PASSWORD=DEMO_PASS

export OS_AUTH_URL=http://controller:5000/v3

export OS_IDENTITY_API_VERSION=3

export OS_IMAGE_API_VERSION=2

  • 使用脚本

加载脚本文件更新环境变量:

$ . admin-openrc

请求一个认证令牌;

$ openstack token issue

三、镜像服务

1、前提条件

  • 创建数据库

连接数据库,使用root登录。

$ mysql -u root -p

创建 glance 数据库

MariaDB [(none)]> CREATE DATABASEglance;

赋予权限:

MariaDB [(none)]> GRANT ALL PRIVILEGESON glance.* TO ‘glance’@’localhost’

IDENTIFIED BY ‘GLANCE_DBPASS’;

MariaDB [(none)]> GRANT ALL PRIVILEGESON glance.* TO ‘glance’@’%’

IDENTIFIED BY ‘GLANCE_DBPASS’;

替换GLANCE_DBPASS为合适的密码;

退出数据库连接。

  • 导入admin证书来获取只有admin才能执行的命令行权限;

$ . admin-openrc

  • 创建服务认证:

创建glance用户

$ openstack user create –domain default –password-prompt glance

添加管理员角色到glance用户和service项目中:

$ openstack role add –project service –user glance admin

  • 创建glance服务实体

创建镜像服务API端口:

$ openstack endpoint create –region RegionOne

imagepublic http://controller:9292

$ openstack endpoint create –region RegionOne

image internal http://controller:9292

$ openstack endpoint create –region RegionOne

image admin http://controller:9292

2、安装并配置组件

  • 安装相关包:

# yum install openstack-glance

  • 编辑/etc/glance/glance-api.conf文件,完成以下操作;

在[keystone_authtoken]和[paste_deploy]选项中,配置认证服务权限:

[keystone_authtoken]

# …

auth_uri=http://controller:5000

auth_url=http://controller:35357

memcached_servers=controller:11211

auth_type=password

project_domain_name=default

user_domain_name=default

project_name=service

username=glance

password=GLANCE_PASS

[paste_deploy]

# …

flavor=keystone

替换掉GLANCE_PASS密码。删除或注释掉其他[keystone_authtoken]参数。

在[glance_store]选项中,配置本地文件系统存储和镜像文件位置。

[glance_store]

# …

stores=file,http

default_store=file

filesystem_store_datadir=/var/lib/glance/images/

编辑/etc/glance/glance-registry.conf文件,并完成以下操作:

在[database]选项中,配置数据库权限:

[database]

# …

connection=mysql+pymysql://glance:GLANCE_DBPASS@controller/glance

替换掉 GLANCE_DBPASS密码。

在[keystone_authtoken]和[paste_deploy]选项中,配置认证服务权限:

[keystone_authtoken]# …

auth_uri=http://controller:5000

auth_url=http://controller:35357

memcached_servers=controller:11211

auth_type=password

project_domain_name=default

user_domain_name=default

project_name=service

username=glance

password=GLANCE_PASS

[paste_deploy]

# …

flavor=keystone

替换掉GLANCE_DBPASS密码。

4、更新镜像服务数据库

完成安装

  • 启动镜像服务并设置开机启动。

# systemctl enable openstack-glance-api.service

openstack-glance-registry.service

# systemctl start openstack-glance-api.service

openstack-glance-registry.service

5、验证操作

  • 获取admin权限

$ . admin-openrc

  • 下载源镜像

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

  • 上传镜像

$ openstack image create “cirros”

–file cirros-0.3.4-x86_64-disk.img

–disk-format qcow2 –container-format bare

–public

  • 验证上传镜像:

openstack image list

四、计算服务 1、安装和配置控制节点

  • 准备条件

创建数据库,与之前步骤类似,这里不再详细列出

$ mysql -u root -p

MariaDB [(none)]> CREATE DATABASEnova_api;

MariaDB [(none)]> CREATE DATABASE nova;

MariaDB [(none)]> GRANT ALL PRIVILEGESON nova_api.* TO ‘nova’@’localhost’

IDENTIFIED BY ‘NOVA_DBPASS’;

MariaDB [(none)]> GRANT ALL PRIVILEGESON nova_api.* TO ‘nova’@’%’

IDENTIFIED BY ‘NOVA_DBPASS’;

MariaDB [(none)]> GRANT ALL PRIVILEGESON nova.* TO ‘nova’@’localhost’

IDENTIFIED BY ‘NOVA_DBPASS’;

MariaDB [(none)]> GRANT ALL PRIVILEGESON nova.* TO ‘nova’@’%’

IDENTIFIED BY ‘NOVA_DBPASS’;

  • 获取admin权限:

$ . admin-openrc

创建nova用户

$ openstack user create –domain default

–password-prompt nova

设置合适的密码

向nova用户中添加admin角色。

$ openstack role add –project service –user nova admin

创建nova服务实体

$ openstack service create –name nova

–deion “OpenStack Compute” compute

2、创建计算服务API端口

$ openstack endpoint create –region RegionOne

compute public http://controller:8774/v2.1/%(tenant_id)s

$ openstack endpoint create –region RegionOne

compute internal http://controller:8774/v2.1/%(tenant_id)s

$ openstack endpoint create –region RegionOne

compute admin http://controller:8774/v2.1/%(tenant_id)s

  • 安装并配置组件

安装相关包

# yum install openstack-nova-api openstack-nova-conductor

openstack-nova-console openstack-nova-novncproxy

openstack-nova-scheduler

  • 编辑 /etc/nova/nova.conf文件

在[DEFAULT]选项中,开启计算和元数据API

[DEFAULT]

# …

enabled_apis=osapi_compute,metadata

在 [api_database]和[database]选项中,配置数据库连接

[api_database]

# …

connection=mysql+pymysql://nova:NOVA_DBPASS@controller/nova_api

[database]

# …

connection=mysql+pymysql://nova:NOVA_DBPASS@controller/nova

替换NOVA_DBPASS密码。

在[DEFAULT]选项中,配置消息队列连接。

[DEFAULT]

# …

transport_url=rabbit://openstack:RABBIT_PASS@controller

替换掉RABBIT_PASS

在[api]和[keystone_authtoken]选项中,

[api]

# …

auth_strategy=keystone

[keystone_authtoken]

# …

auth_uri=http://controller:5000

auth_url=http://controller:35357

memcached_servers=controller:11211

auth_type=password

project_domain_name=default

user_domain_name=default

project_name=service

username=nova

password=NOVA_PASS

替换掉NOVA_PASS

在[DEFAULT]选项中,配置my_ip

[DEFAULT]

# …

my_ip=10.0.0.11

开启对网络服务的支持

[DEFAULT]

# …

use_neutron=True

firewall_driver=nova.virt.firewall.NoopFirewallDriver

在[vnc]选项中,配置VNC代理

[vnc]

enabled=true

# …

vncserver_listen=$my_ip

vncserver_proxyclient_address=$my_ip

在[glance]选项中,配置镜像服务API的位置。

[glance]

# …

api_servers=http://controller:9292

在[oslo_concurrency]选项中,配置锁定路径

[oslo_concurrency]

# …

lock_path=/var/lib/nova/tmp

更新数据库

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

#su -s /bin/sh -c “nova-manage db sync”nova

  • 完成安装

开启计算服务并设置开机启动;

# systemctl enable openstack-nova-api.service

openstack-nova-consoleauth.service openstack-nova-scheduler.service

openstack-nova-conductor.service openstack-nova-novncproxy.service

# systemctl start openstack-nova-api.service

openstack-nova-consoleauth.service openstack-nova-scheduler.service

openstack-nova-conductor.service openstack-nova-novncproxy.service

3、安装并配置计算节点

  • 安装并配置组件

安装相关包

# yum install openstack-nova-compute

编辑/etc/nova/nova.conf文件

在[DEFAULT]选项中,开启计算和元数据API

[DEFAULT]

# …

enabled_apis=osapi_compute,metadata

在[DEFAULT]选项中,配置消息队列权限

[DEFAULT]

# …

transport_url=rabbit://openstack:RABBIT_PASS@controller

替换掉RABBIT_PASS

在[api]和[keystone_authtoken]选项中,配置认证服务权限

[api]

# …

auth_strategy=keystone

[keystone_authtoken]

# …

auth_uri=http://controller:5000

auth_url=http://controller:35357

memcached_servers=controller:11211

auth_type=password

project_domain_name=default

user_domain_name=default

project_name=service

username=nova

password=NOVA_PASS

替换掉NOVA_PASS

在[DEFAULT]选项中,配置my_ip参数

[DEFAULT]

# …

my_ip=MANAGEMENT_INTERFACE_IP_ADDRESS

替换MANAGEMENT_INTERFACE_IP_ADDRESS为计算节点IP

在[DEFAULT]选项中,开启网络服务支持

[DEFAULT]

# …

use_neutron=True

firewall_driver=nova.virt.firewall.NoopFirewallDriver

在[vnc]选项中,开启并配置远程控制台权限

[vnc]

# …

enabled=True

vncserver_listen=0.0.0.0

vncserver_proxyclient_address=$my_ip

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

在[glance]选项中,配置镜像服务API地址

[glance]

# …

api_servers=http://controller:9292

在[oslo_concurrency]选项,配置锁定路径

[oslo_concurrency]

# …

lock_path=/var/lib/nova/tmp

4、完成安装

  • 检查你的计算节点是否支持硬件虚拟化

$ egrep -c ‘(vmx|svm)’ /proc/cpuinfo

如果输出值大于等于1,那么不需要配置,否则,需要做一下配置

编辑/etc/nova/nova.conf文件,配置[libvirt]

[libvirt]

# …

virt_type=qemu

  • 开启计算服务并设置开机启动

# systemctl enable libvirtd.serviceopenstack-nova-compute.service

# systemctl start libvirtd.service openstack-nova-compute.service

  • 验证操作

在控制节点上进行操作。

获取admin权限

$ . admin-openrc

列出服务组件来验证每个组件都成功运行了

$ openstack compute service list

这里遇到问题:发现计算节点上服务没有启动

查看计算节点日志:/var/log/nova/nova-compute.log发现

里面提到需要配置placement,而官方文档并没有提到这一点。解决办法是安装openstack-nova-placement-api,并配置相关选项。

控制节点上,然后创建用户把用户placement添加到项目中去并创建placement类型的服务目录:

最终创建端口:

openstack endpoint create –regionRegionOne placement public http://192.168.0.112:8778

openstack endpoint create –regionRegionOne placement admin

openstack endpoint create –regionRegionOne placement intenal http://192.168.0.112:8778

在计算节点上编辑文件:/etc/nova/nova.conf

在placement选项中添加:

auth_uri = http://controller:5000

auth_url = http://controller:35357

memcached_servers = controller:11211

auth_type = password

project_domain_name = default

user_domain_name = default

project_name = service

username = nova

password = root

os_region_name = RegionOne

替换掉password,重启计算服务:

# systemctl restartopenstack-nova-compute.service

可以看到服务已经启动:

控制节点上也显示正常:

在此参考了

,特别感谢!

下面接着验证操作:

3、列出认证服务中的API端口以检查连通性

$ openstack catalog list

4、列出镜像服务中的镜像以验证连通性;

$ openstack image list

五、网络服务

安装并配置控制节点

1、前提条件

创建数据库,与之前类似:

$ mysql -u root -p

MariaDB [(none)] CREATE DATABASE neutron;

MariaDB [(none)]> GRANT ALL PRIVILEGESON neutron.* TO ‘neutron’@’localhost’

IDENTIFIED BY ‘NEUTRON_DBPASS’;

MariaDB [(none)]> GRANT ALL PRIVILEGESON neutron.* TO ‘neutron’@’%’

IDENTIFIED BY ‘NEUTRON_DBPASS’;

获取admin权限:

$ . admin-openrc

创建服务认证:

创建neutron用户

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

给neutron添加admin角色:

$ openstack role add –project service –user neutron admin

创建neutron服务实体:

$ openstack service create –name neutron

–deion “OpenStack Networking” network

创建网络服务API端口:

$ openstack endpoint create –region RegionOne

network public http://controller:9696

$ openstack endpoint create –region RegionOne

network internal http://controller:9696

$ openstack endpoint create –region RegionOne

network admin http://controller:9696

2、配置网络选项

选项1:部署一个最简单的网络,仅支持实例和公共网络的连接。

选项2:在选项1的基础上,增加了3层服务,支持实例连接到私有网络。

这里我们选择选项2,选项2的部署包括选项1。

在控制节点上进行以下操作:

安装组件

# yum install openstack-neutron openstack-neutron-ml2

openstack-neutron-linuxbridge ebtables

配置服务器组件

编辑/etc/neutron/neutron.conf文件,并完成以下配置:

在[database]选项中,配置数据库连接:

[database]

# …

connection=mysql+pymysql://neutron:NEUTRON_DBPASS@controller/neutron

替换掉NEUTRON_DBPASS密码。注释掉或者删除[database]其他参数。

在[DEFAULT]选项中,开启ML2插件,路由服务以及overlapping IP地址,配置消息队列连接:

[DEFAULT]

# …

core_plugin=ml2

service_plugins=router

allow_overlapping_ips=true

transport_url=rabbit://openstack:RABBIT_PASS@controller

替换掉RABBIT_PASS

在[DEFAULT]选项和[keystone_authtoken]选项中,配置认证服务连接

[DEFAULT]

# …

auth_strategy=keystone

[keystone_authtoken]

# …

auth_uri=http://controller:5000

auth_url=http://controller:35357

memcached_servers=controller:11211

auth_type=password

project_domain_name=default

user_domain_name=default

project_name=service

username=neutron

password=NEUTRON_PASS

替换掉NEUTRON_PASS

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

在[DEFAULT]和[nova]选项中,配置网络来通知计算机网络拓扑的变换:

[DEFAULT]

# …

notify_nova_on_port_status_changes=true

notify_nova_on_port_data_changes=true

[nova]

# …

auth_url=http://controller:35357

auth_type=password

project_domain_name=default

user_domain_name=default

region_name=RegionOne

project_name=service

username=nova

password=NOVA_PASS

替换掉NOVA_PASS

在[oslo_concurrency]选项中,配置锁定地址:

[oslo_concurrency]

# …

lock_path=/var/lib/neutron/tmp

配置ML2

编辑/etc/neutron/plugins/ml2/ml2_conf.ini文件,在ml2选项中,开启flat,VLAN,以及VXLAN网络:

[ml2]

# …

type_drivers=flat,vlan,vxlan

开启VXLAN私有网络:

[ml2]

# …

tenant_network_types=vxlan

开启桥接和2层机制

[ml2]

# …

mechanism_drivers=linuxbridge,l2population

Linux桥接代理仅支持VXLAN覆盖网络,开启端口安全扩展驱动:

[ml2]

# …

extension_drivers=port_security

在选项中;配置公共虚拟网络作为扁平网络:

[ml2_type_flat]

# …

flat_networks=provider

为私有网络配置VXLAN网络识别范围

[ml2_type_vxlan]

# …

vni_ranges=1:1000

在[securitygroup]选项中,开启ipset增加安全组规则的高效性;

[securitygroup]

# …

enable_ipset=true

配置Linux 桥接代理

编辑/etc/neutron/plugins/ml2/linuxbridge_agent.ini文件

在[linux_bridge]选项中,映射公共虚拟网络到公共物理网络接口;

[linux_bridge]

physical_interface_mappings=provider:PROVIDER_INTERFACE_NAME

将PROVIDER_INTERFACE_NAME替换为公共网络网卡名字

在选项中,开始VXLAN覆盖网络,配置物理网络的IP地址,启用L2。

[vxlan]

enable_vxlan=true

local_ip=OVERLAY_INTERFACE_IP_ADDRESS

l2_population=true

将OVERLAY_INTERFACE_IP_ADDRESS替换为管理网络IP地址,即控制节点IP。(没有配置管理网络)

在[securitygroup]选项中,启用安全组并配置Linux桥接iptables防火墙驱动;

[securitygroup]

# …

enable_security_group=true

firewall_driver=neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

配置3层代理

编辑/etc/neutron/l3_agent.ini文件

在[DEFAULT]选项中,配置Linuxbridge驱动接口

[DEFAULT]

# …

interface_driver=linuxbridge

配置DHCP代理

编辑/etc/neutron/dhcp_agent.ini文件

在[DEFAULT]选项中,配置inuxbridge驱动接口,DHCP驱动并启用隔离元数据,这样在公共网络上的实例就可以通过网络来访问元数据

[DEFAULT]

# …

interface_driver=linuxbridge

dhcp_driver=neutron.agent.linux.dhcp.Dnsmasq

enable_isolated_metadata=true

配置元数据代理

在[DEFAULT]选项中,配置元数据主机和共享密码

[DEFAULT]

# …

nova_metadata_ip=controller

metadata_proxy_shared_secret=METADATA_SECRET

替换METADATA_SECRET为合适的密码

配置计算服务来使用网络

编辑/etc/nova/nova.conf文件

在[neutron]选项中,配置连接参数,启用元数据代理,配置密码:

[neutron]

# …

url=http://controller:9696

auth_url=http://controller:35357

auth_type=password

project_domain_name=default

user_domain_name=default

region_name=RegionOne

project_name=service

username=neutron

password=NEUTRON_PASS

service_metadata_proxy=true

metadata_proxy_shared_secret=METADATA_SECRET

替换NEUTRON_PASS,METADATA_SECRET

3、完成安装

建立符号链接

# ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

上传数据库

# su -s /bin/sh -c “neutron-db-manage –config-file /etc/neutron/neutron.conf

–config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head” neutron

重启计算API服务

# systemctl restart openstack-nova-api.service

启动网络服务并配置开机启动

# systemctl enable neutron-server.service

neutron-linuxbridge-agent.service neutron-dhcp-agent.service

neutron-metadata-agent.service

# systemctl start neutron-server.service

neutron-linuxbridge-agent.service neutron-dhcp-agent.service

neutron-metadata-agent.service

对于网络选项2,也要启用3层服务

# systemctl enable neutron-l3-agent.service

# systemctl start neutron-l3-agent.service

安装并配置计算节点1、安装组件

# yum install openstack-neutron-linuxbridge ebtables ipset

配置公共组件

编辑/etc/neutron/neutron.conf文件

在[database]中,注释掉任何的连接,因为计算节点不直接连接数据库。

在[DEFAULT],配置消息队列连接

[DEFAULT]

# …

transport_url=rabbit://openstack:RABBIT_PASS@controller

替换RABBIT_PASS

在[DEFAULT]和[keystone_authtoken]选项中

[DEFAULT]

# …

auth_strategy=keystone

[keystone_authtoken]

# …

auth_uri=http://controller:5000

auth_url=http://controller:35357

memcached_servers=controller:11211

auth_type=password

project_domain_name=default

user_domain_name=default

project_name=service

username=neutron

password=NEUTRON_PASS

替换NEUTRON_PASS密码

在[oslo_concurrency]选项中,配置锁定路径

[oslo_concurrency]

# …

lock_path=/var/lib/neutron/tmp

在计算节点上配置网络选项2

配置Linux桥接代理

编辑/etc/neutron/plugins/ml2/linuxbridge_agent.ini文件

在[linux_bridge]部分,映射公共虚拟网络到公共物理网络接口:

[linux_bridge]

physical_interface_mappings=provider:PROVIDER_INTERFACE_NAME

把PROVIDER_INTERFACE_NAME替换为物理网卡名字。

在[vxlan]部分,启用VXLAN覆盖网络,配置物理网络IP地址,启用l2_population:

[vxlan]

enable_vxlan=true

local_ip=OVERLAY_INTERFACE_IP_ADDRESS

l2_population=true

在[securitygroup]部分,启用安全组并配置Linux桥接iptables防火墙驱动:

[securitygroup]

# …

enable_security_group=true

firewall_driver=neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

为计算节点配置网络服务:

编辑/etc/nova/nova.conf文件

在[neutron]部分,配置连接参数;

[neutron]

# …

url=http://controller:9696

auth_url=http://controller:35357

auth_type=password

project_domain_name=default

user_domain_name=default

region_name=RegionOne

project_name=service

username=neutron

password=NEUTRON_PASS

替换NEUTRON_PASS

完成安装

重启计算服务:

# systemctl restart openstack-nova-compute.service

启动Linux桥接代理并配置开机启动:

# systemctl enable neutron-linuxbridge-agent.service

# systemctl start neutron-linuxbridge-agent.service

验证操作

获取admin权限

$ . admin-openrc

列出加载的扩展来验证neutron-server是否成功运行:

$ openstack extension list –network

验证网络:

在控制节点上,列出所有的代理:

$ openstack network agent list

输出应该是4个控制节点上的代理和一个计算节点上的代理。

六、Dashboard

安装和配置

验证操作

安装并配置组件

安装相关包

# yum install openstack-dashboard

编辑/etc/openstack-dashboard/local_settings文件,修改以下配置

注:以下的配置大部分在原配置文件中都包括,修改即可,不要直接添加。

配置dashboard在控制节点上使用OpenStack服务:

OPENSTACK_HOST=”controller”

允许主机连接到dashboard:

ALLOWED_HOSTS=[‘*,]

*表示允许所有主机连接dashboard,在生产环境中不建议这样做。

配置memcached存储服务:

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

CACHES={

‘default’:{

‘BACKEND’:’django.core.cache.backends.memcached.MemcachedCache’,

‘LOCATION’:’controller:11211′,

}

}

启用认证API版本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,

}

配置default作为用户通过dashboard创建的默认的域:

OPENSTACK_KEYSTONE_DEFAULT_DOMAIN=”default”

配置user作为用户创建的默认的角色:

OPENSTACK_KEYSTONE_DEFAULT_ROLE=”user”

可选的,可以配置时区:

TIME_ZONE=”TIME_ZONE”

替换掉TIME_ZONE,这里替换为:Asia/chongqing

完成安装:

重启web服务器以及会话存储服务:

# systemctl restart httpd.service memcached.service

验证操作:

使用浏览器连接http://controller/dashboard,如果无法连接,那么就将controller替换为IP地址。如下图;

使用admin或者demo用户和default域认证,如下图,登录成功:

openstack 创建云主机No valid host was found. There are not enough hosts available.

1.openstack创建云主机时界面报错:No valid host was found. There are not enough hosts available.

2.查看nova下的调度信息出现(nova-scheduler.log)

2016-12-08 09:40:57.394 1269 WARNING nova.scheduler.host_manager [req-c721e8e3-53b3-446a-a71c-5a185f1bc3a4 7858bcc09cd14e8fbbff141fc1e7181f c5daa5b11e9448a7a494901b8f25f2ae – – -] Host mitaka has more disk space than database expected (25 GB > 17 GB)

2016-12-08 09:40:57.394 1269 INFO nova.filters [req-c721e8e3-53b3-446a-a71c-5a185f1bc3a4 7858bcc09cd14e8fbbff141fc1e7181f c5daa5b11e9448a7a494901b8f25f2ae – – -] Filter DiskFilter returned 0 hosts

2016-12-08 09:40:57.395 1269 INFO nova.filters [req-c721e8e3-53b3-446a-a71c-5a185f1bc3a4 7858bcc09cd14e8fbbff141fc1e7181f c5daa5b11e9448a7a494901b8f25f2ae – – -] Filtering removed all hosts for the request with instance ID ‘a6b1e821-ee1d-4a01-b938-686dcad02c4e’. Filter results: [‘RetryFilter: (start: 1, end: 1)’, ‘AvailabilityZoneFilter: (start: 1, end: 1)’, ‘RamFilter: (start: 1, end: 1)’, ‘DiskFilter: (start: 1, end: 0)’]

3.解决方案:

修改nova的 配置文件,使得调度过滤器能够通过设置

#scheduler_default_filters=RetryFilter,AvailabilityZoneFilter,RamFilter,DiskFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter
添加本句设置:scheduler_default_filters=AllHostsFilter

如下例所示:

#scheduler_default_filters=RetryFilter,AvailabilityZoneFilter,RamFilter,DiskFilter,ComputeFilter,ComputeCapabilitiesFilter,ImagePropertiesFilter,ServerGroupAntiAffinityFilter,ServerGroupAffinityFilter

scheduler_default_filters=AllHostsFilter

openstack-service restart

重启服务可以创建新实例了

手动制作optnstack镜像

本文以制作Centos7.2镜像为例,详细介绍制作镜像的步骤,该镜像上传到Openstack Glance中,相对于官方镜像,增加如下几个功能:

  • 支持密码注入功能(nova boot时通过--admin-pass参数指定设置初始密码)
  • 支持根分区自动调整(根分区自动调整为flavor disk大小,而不是原始镜像分区大小)
  • 支持动态修改密码(使用nova set-password命令可以修改管理员密码)

本文制作镜像的宿主机操作系统为Ubuntu14.04,开启了VT功能(使用kvm-ok命令验证)并安装了libvirt系列工具,包括virshvirt-managerlibguestfs-tools等。

1.下载镜像

直接访问官方镜像地址下载,注意选择中国的镜像源,相对国外镜像下载速率比较快,进入后选择版本为7.2.1511,在isos目录下下载x86_64Minimal镜像,如果网速不给力,最好不要选择下载Netinstall镜像,因为这会在安装时联网下载大量的软件包,重新安装时需要重新下载这些软件包,浪费大量的时间。

2.创建虚拟机

首先需要创建一个qcow2格式镜像文件,用于作为虚拟机的磁盘,大小10G足矣。

qemu-img create -f qcow2 centos.qcow2 10G # create disk image

使用以下脚本快速创建并启动虚拟机:

NAME=centos
ROOT_DISK=centos.qcow2
CDROM=`pwd`/CentOS-7-x86_64-Minimal-1511.iso
sudo virt-install --virt-type kvm --name $NAME --ram 1024 \
  --disk $ROOT_DISK,format=qcow2 \
  --network network=default \
  --graphics vnc,listen=0.0.0.0 --noautoconsole \
  --os-type=linux --os-variant=rhel7 \
  --cdrom=$CDROM

启动完成后,使用vnc client连接,个人认为直接使用virt-manager或者virt-viewer更直接方便。

3. 安装OS

进入虚拟机控制台可以看到Centos的启动菜单,选择Install Centos 7,继续选择语言后将进入INSTALLION SUMMARY,其中大多数配置默认即可,SOFTWARE SELECTION选择Minimal InstallINSTALLATION DESTINATION需要选择手动配置分区,我们只需要一个根分区即可,不需要swap分区,文件系统选择ext4,存储驱动选择Virtio Block Device,如图:

分区表设置

配置完成后就可以开始安装了,在CONFIGURATION中设置root临时密码,自己记住即可,制作完后cloud-init将会重新设置root初始密码。

大约几分钟后,即可自动完成安装配置工作,最后点击右下角的reboot重启退出虚拟机。

4. 配置OS

安装好系统后,还需要进行配置才能作为glance镜像使用。首先需要启动虚拟机(虽然上一步执行的是reboot,但貌似并不会自动启动):

sudo virsh start centos

客户的云主机需要支持root ssh远程登录,因此需要开启root远程ssh登录功能,修改配置文件/etc/ssh/sshd_config并修改PermitRootLogin值为yes,重启ssh服务生效:

sudo systemctl restart sshd

接下来的所有操作均通过宿主机ssh登录到虚拟机执行,这样方便复制(默认终端不和宿主机共享粘贴缓冲区)。

为了加快安装速度,建议配置本地软件源仓库,若没有本地镜像仓库,则选择国内的软件源,会相对官网的速度下载要快,提高执行效率。

mv my_repo.repo /etc/yum.repos.d/

hypervisor通过发送对应的信号、事件等到虚拟机中,虚拟机根据接收的信号或者事件执行相应的操作,比如关机、重启等。虚拟机需要开启acpid(Advanced Configuration and Power Interface event daemon)服务,关于acpid的更多资料,参考Arch文档中关于acpid的介绍以及使用。为了开启该服务,首先需要安装acpid服务,并设置开机自启动:

yum install -y acpid
systemctl enable acpid

为了方便调试排错,虚拟机需要打开boot日志功能,并指定console,这样nova console-log才能获取虚拟机启动时的日志。修改配置文件/etc/default/grub,设置GRUB_CMDLINE_LINUX为:

GRUB_CMDLINE_LINUX="crashkernel=auto console=tty0 console=ttyS0,115200n8"

Openstack动态修改root密码以及密钥,需要虚拟机内部安装agent程序,agent会创建一个虚拟串行字符设备,用于和外部qemu通信,qemu通过这个虚拟字符设备向agent发送事件指令,agent接收事件并执行相应的指令完成用户功能,更多关于qemu-guest-agent请参考官方文档。ISO镜像中默认没有预安装agent,我们需要手动安装qemu-guest-agent:

yum install -y qemu-guest-agent

配置qemu-ga,修改/etc/sysconfig/qemu-ga,配置内容为:

TRANSPORT_METHOD="virtio-serial"
DEVPATH="/dev/virtio-ports/org.qemu.guest_agent.0"
LOGFILE="/var/log/qemu-ga/qemu-ga.log"
PIDFILE="/var/run/qemu-ga.pid"
BLACKLIST_RPC=""
FSFREEZE_HOOK_ENABLE=0

虚拟机需要从metadata服务中获取元数据,比如启动时的主机名、初始化密码等,为了使虚拟机能够和外部的metadata service通信,需要禁用默认的zeroconf route:

echo "NOZEROCONF=yes" >> /etc/sysconfig/network

最后安装cloud-init,cloud-init是虚拟机第一次启动时执行的脚本,主要负责从metadata服务中拉取配置信息,完成虚拟机的初始化工作,比如设置主机名、初始化密码以及注入密钥等。我们通常会实现自己的cloud-init,用来完成虚拟机的一些定制化初始化工作,如果没有自己的cloud-init,直接从官方源下载即可。

# yum install -y cloud-init-0.7.6-bzr1.el7.centos.noarch.rpm
yum install -y cloud-init

虚拟机制作镜像时指定了根分区大小(比如我们设置为10GB),为了使虚拟机能够自动调整为flavor disk指定的根磁盘大小,即自动扩容, 我们需要安装glowpart(老版本叫growroot)并完成以下配置:

yum update -y
yum install -y epel-release
yum install -y cloud-utils-growpart.x86.64
rpm -qa kernel | sed 's/^kernel-//'  | xargs -I {} dracut -f /boot/initramfs-{}.img {}

自此,镜像基本制作完成了,最后执行关机操作。

/sbin/shutdown -h now

5.清理工作

在宿主机上运行以下命名,移除宿主机信息,比如mac地址等。

virt-sysprep -d centos # cleanup tasks such as removing the MAC address references

最后,删除虚拟机,因为镜像已经制作完成,可以上传到glance了。

virsh undefine centos # 删除虚拟机

6.上传镜像

镜像制作完成,上传centos.qcow2glance服务中,如果使用ceph作为存储后端,为了提高上传速度(使用glance上传走的http方式,必然很慢),我们需要另辟蹊径,我们只使用glance创建实例记录,并不使用glance上传镜像,而是借用ceph rbd的import操作实现镜像上传,包括以下几个步骤:

  • 使用qemu-img转换qcow2格式为raw格式。
qemu-img convert -f qcow2 -O raw centos.qcow2 centos.raw
  • 使用glance create创建一条镜像记录并记录ID(不需要指定文件路径以及其他属性,只是占个坑)
glance image-create
  • 使用ceph import镜像并设置快照(glance实现)
rbd --pool=glance_images import  centos.raw  --image=$IMAGE_ID --new-format --order 24
rbd --pool=glance_images --image=$IMAGE_ID --snap=snap snap create
rbd --pool=glance_images --image=$IMAGE_ID --snap=snap snap protect
  • 使用glance命令设置镜像的location url:
FS_ROOT=`ceph -s | grep cluster | awk '{print $2}'`
glance location-add --url rbd://$FS_ROOT/glance_images/$IMAGE_ID/snap $IMAGE_ID
  • 完善镜像信息,比如name等其他属性:
glance image-update --name="centos-7.2-64bit" --disk-format=raw --container-format=bare

# 配置qemu-ga
glance image-update --property hw_qemu_guest_agent=yes $IMAGE_ID

# ... 其他属性配置

务必设置property的hw_qemu_guest_agent=yes,否则libvert启动虚拟机时不会生成qemu-ga配置项,导致虚拟机内部的qemu-ga由于找不到对应的虚拟串行字符设备而启动失败,提示找不到channel。

7.验证

首先使用创建的镜像启动一台新云主机(终于叫云主机,不叫虚拟机了==),如果使用nova CLI工具,需要传递--admin-pass参数并指定密码,并指定flavor,要求disk大小为20GB。如果使用Openstack dashborad创建,需要简单配置下dashborad使其支持配置云主机密码面板,如图:

设置密码面板

创建成功后进入控制台,使用root账号以及设置的新密码,如果使用创建时设置的密码登录成功,说明注入密码成功。

接下来运行以下命令检查磁盘是否自动调整大小:

lsblk
df -h

如图:

查看磁盘信息 镜像原始根分区大小为10GB,如果lsblk显示vda大小为20GB,说明文件系统自动识别了磁盘大小。如果df显示/dev/sda1size为20GB,说明根分区自动完成了扩容操作。

接下来测试动态修改密码,由于默认dashboard页面没有实现修改密码面板功能,我们需要在后台操作。

首先使用nova list获取云主机ID,然后调用nova set-password命令修改密码:

nova set-password $ID

重复输入两次新的密码,如果执行成功,不会有任何输出。

回到终端,退出之前的登录,然后使用新的密码重新登录,如果登录成功,则说明动态修改密码成功!

若以上其中一个步骤失败,则说明镜像制作失败,请检查以上步骤是否疏漏。