OpenStack平台部署

OpenStack简介

OpenStack是一个开源的云计算管理平台项目,是一系列软件开源项目的组合。由NASA(美国国家航空航天局)和Rackspace合作研发并发起,以Apache许可证(Apache软件基金会发布的一个自由软件许可证)授权的开源代码项目。

OpenStack为私有云和公有云提供可扩展的弹性的云计算服务。项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。

OpenStack基础环境

基础环境介绍

主机名 操作系统 CPU 内存 磁盘 网卡1
Controller Centos7.5 2核 4G 100G 192.168.52.161
Computer Centos7.5 2核 4G 100G 192.168.52.162
  • 两台centos7服务器,一台作为控制节点(4G内存),一台作为计算节点(2G内存);
  • centos7.5镜像,OpenStack-mitaka版镜像;两台Centos7.5虚拟机(需要两个光盘用来挂载centos7和openstack-mitaka的镜像);
  • 控制节点IP地址192.168.52.161,计算节点IP地址192.168.52.162;修改主机名;设置hosts文件解析;
  • 配置控制节点和计算节点的本地yum仓库(centos本地仓库和openstack-mitaka本地仓库);
  • 关闭防火墙和selinux。

安装时间同步服务器

  • 安装chrony时间同步服务(控制节点和计算节点都要安装)。
#所有节点都需要安装;
yum -y install chrony

#控制节点;
vim /etc/chrony.conf
    server ntp6.aliyun.com iburst
    allow 192.168.52.0/24

#重启restart服务,并设置开机自启;
systemctl restart chronyd

systemctl enable chronyd

#计算节点;
vim /etc/chrony.conf
    server 192.168.52.162 iburst

#重启服务,设置开机自启;
systemctl restart chronyd

systemctl enable chronyd

安装openstack客户端

#所有节点都需要安装;
yum -y install python-openstackclient openstack-selinux

安装mysql数据库

#控制节点
yum -y install mariadb mariadb-server python2-PyMySQL 

#如果安装报错下面信息需执行:yum -y remove mariadb-libs;
Transaction check error:
  file /usr/lib64/mysql/plugin/dialog.so from install of mariadb-
common-1:10.1.12-4.el7.x86_64 conflicts with file from package 
mariadb-libs-1:5.5.56-2.el7.x86_64
  file /usr/lib64/mysql/plugin/mysql_clear_password.so from
install of mariadb-common-1:10.1.12-4.el7.x86_64 conflicts with 
file from package mariadb-libs-1:5.5.56-2.el7.x86_64

#创建并编辑 /etc/my.cnf.d/openstack.cnf,然后完成如下动作;

#在 [mysqld] 部分,设置 ``bind-address``值为控制节点的管理网络IP地址以使得其它节点可以通过管理网络访问数据库,设置如下键值来启用一起有用的选项和 UTF-8 字符集;
echo '[mysqld]
bind-address = 192.168.52.161
default-storage-engine = innodb
innodb_file_per_table
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8' > /etc/my.cnf.d/openstack.cnf

#启动mariadb服务,设置开机自启;
systemctl enable mariadb

systemctl start mariadb

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

安装消息队列

#控制节点;
yum -y install rabbitmq-server

#启动rabbitmq服务,设置开机自启;
systemctl enable rabbitmq-server.service

systemctl start rabbitmq-server.service

#添加 openstack 用户,密码为“1”;给``openstack``用户配置写和读权限;
rabbitmqctl add_user openstack 1
rabbitmqctl set_permissions openstack ".*" ".*" ".*"

#开启rabbitmq web界面插件;
rabbitmq-plugins enable rabbitmq_management

配置memcached服务实现认证缓存

  • memcached缓存token。
#控制节点;
yum -y install memcached python-memcached

#修改memcached监听地址;
vim /etc/sysconfig/memcached
    OPTIONS="-l 127.0.0.1,::1,192.168.52.161"

#启动memcached服务,设置开机自启;
systemctl enable memcached.service

systemctl start memcached.service

keystone认证服务

keystone服务介绍

Keystone是Openstack的组件之一,用于为Openstack家族中的其它组件成员提供统一的认证服务,包括身份验证,令牌的发放和校验,服务列表,用户权限的定义等。Openstack中任何组件均依赖与Keystone提供的服务。

  • openstack架构图:

architecture.png

  • 功能:认证功能,授权管理,服务目录;
  • 认证:账号密码;
  • 授权:授权管理;
  • 服务目录:相当于电话本,记录其他服务的web管理界面。

openstack服务安装的通用步骤

  • 1、创库授权;
  • 2、在keystone服务上创建用户,关联角色;
  • 3、在keystone服务上创建服务,注册api;
  • 4、安装服务相关的软件包;
  • 5、修改配置;
    • 数据库的连接
    • keystone认证授权信息
    • rabbitmq连接信息
    • 其他配置
  • 6、同步数据库,创建表;
  • 7、启动服务。

控制节点数据库配置

#在控制节点上创建keystone数据库,并授权;
 mysql -u root -p1;

#创建keystone数据库;
CREATE DATABASE keystone;

#对``keystone``数据库授予恰当的权限,用合适的密码替换1;
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' \
  IDENTIFIED BY '1';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' \
  IDENTIFIED BY '1';

安装配置keystone服务

#安装keystone相关软件包;
yum -y install openstack-keystone httpd mod_wsgi

#修改/etc/keystone/keystone.conf配置文件;
#首先备份配置文件,过滤配置文件去除注释行;
cp /etc/keystone/keystone.conf /etc/keystone/keystone.conf.bak

grep -Ev "^$|^#" /etc/keystone/keystone.conf.bak > /etc/keystone/keystone.conf

#修改配置文件;
vim /etc/keystone/keystone.conf
[DEFAULT]
admin_token = ADMIN_TOKEN
[database]
connection = mysql+pymysql://keystone:1@controller/keystone
[token]
provider = fernet

#修改配置文件也可以使用openstack-utils插件;
yum -y install openstack-utils

openstack-config --set /etc/keystone/keystone.conf DEFAULT admin_token ADMIN_TOKEN

openstack-config --set /etc/keystone/keystone.conf database connection mysql+pymysql://keystone:1@controller/keystone

openstack-config --set /etc/keystone/keystone.conf token provider fernet

#写入keystone服务的数据库(同步数据库);
su -s /bin/sh -c "keystone-manage db_sync" keystone

#查看keystone数据库,是否有表,有表为成功,空的为失败;
mysql -uroot -p1 keystone -e 'show tables'

#初始化Fernet keys,初始化完成后/etc/keystone/下会出现一个fernet-keys目录;
keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone

#配置httpd;
echo 'ServerName controller' >> /etc/httpd/conf/httpd.conf

#用下面的内容创建文件/etc/httpd/conf.d/wsgi-keystone.conf;
Listen 5000
Listen 35357

<VirtualHost *:5000>
    WSGIDaemonProcess keystone-public processes=5 threads=1 user=keystone group=keystone display-name=%{GROUP}
    WSGIProcessGroup keystone-public
    WSGIScriptAlias / /usr/bin/keystone-wsgi-public
    WSGIApplicationGroup %{GLOBAL}
    WSGIPassAuthorization On
    ErrorLogFormat "%{cu}t %M"
    ErrorLog /var/log/httpd/keystone-error.log
    CustomLog /var/log/httpd/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/httpd/keystone-error.log
    CustomLog /var/log/httpd/keystone-access.log combined

    <Directory /usr/bin>
        Require all granted
    </Directory>
</VirtualHost>

#启动httpd服务,设置开机自启;
systemctl enable httpd.service

systemctl start httpd.service

创建keystone服务实体,注册api

#声明管理员token的环境变量;
#配置认证令牌;
export OS_TOKEN=ADMIN_TOKEN

#配置端点URL;
export OS_URL=http://controller:35357/v3

#配置认证 API 版本;
export OS_IDENTITY_API_VERSION=3

#创建openstack认证服务实体,注册api;
#创建认证服务keystone;
openstack service create \
  --name keystone --description "OpenStack Identity" identity

#注册认证服务api;
#公共的;
openstack endpoint create --region RegionOne \
  identity public http://controller:5000/v3

#内部的;
openstack endpoint create --region RegionOne \
  identity internal http://controller:5000/v3

#有管理员的;
openstack endpoint create --region RegionOne \
  identity admin http://controller:35357/v3

创建域,项目,用户和角色

#创建域(名为default);
openstack domain create --description "Default Domain" default

#在default域中创建项目(名为admin);
openstack project create --domain default \
  --description "Admin Project" admin

#在default域中创建用户(名为admin);
openstack user create --domain default \
  --password "1" admin

#创建角色(名为admin);
openstack role create admin

#关联项目,用户,角色;
#添加``admin`` 角色到 admin 项目和admin用户上;
openstack role add --project admin --user admin admin

#创建一个名为server的项目,用于存放其他openstack服务的信息;
openstack project create --domain default \
  --description "Service Project" service

测试,使用创建的用户获取token

#先取消管理员token的环境变量;
unset OS_TOKEN
unset OS_URL
unset OS_IDENTITY_API_VERSION

#使用admin用户获取token;
#声明admin用户的环境变量
export OS_USERNAME=admin
export OS_PASSWORD=1
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=admin
export OS_PROJECT_DOMAIN_NAME=default
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
export OS_AUTH_URL=http://controller:35357/v3

#向keystone服务申请一个token;
openstack token issue

#如果不声明环境变量那么每次执行openstack命令就需要加选项和参数;
openstack --os-username admin \
--os-password 1 \
--os-user-domain-name default \
--os-project-name admin \
--os-project-domain-name default \
--os-identity-api-version 3 \
--os-image-api-version 2 \
--os-auth-url http://controller:35357/v3 \
token issue

#环境变量每次断开shell时就会重置,所以创建一个脚本存放环境变量;
echo 'export OS_USERNAME=admin
export OS_PASSWORD=1
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=admin
export OS_PROJECT_DOMAIN_NAME=default
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
export OS_AUTH_URL=http://controller:35357/v3' > ./admin-openstack

#运行环境变量脚本;
source admin-openstack

#用户登陆时自动运行环境变量脚本;
echo 'source admin-openstack' >> /root/.bashrc

#测试环境变量脚本能否自动运行;
#断开shell连接,重新登陆,运行openstack token issue命令;
#直接运行成功说明环境变量脚本配置成功。

glance镜像服务

glance服务介绍

Glance是Openstack项目中负责镜像管理的模块,其功能包括虚拟机镜像的查找、注册和检索等。 Glance提供Restful API可以查询虚拟机镜像的metadata及获取镜像。 Glance可以将镜像保存到多种后端存储上,比如简单的文件存储或者对象存储。

Glance服务是负责管理镜像,不负责提供镜像的存储空间,它要把镜像存储到Glance服务运行的服务器的某一个目录下面,或者对接不同的后端。所以搭完Glance服务后要给它指定镜像保存的方式。

控制节点数据库配置

#在控制节点上创建glance数据库,并授权;
mysql -uroot -p1

CREATE DATABASE glance;

GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' \
  IDENTIFIED BY '1';

GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' \
  IDENTIFIED BY '1';

keystone端配置glance服务用户

#在keystone上创建服务证书;
#在default域创建glance用户;
openstack user create --domain default --password "1" glance

#添加 admin 角色到 glance 用户和 service 项目上;
openstack role add --project service --user glance admin

keystone端创建glance服务实体,注册api

#创建glance服务实体;

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

#注册api;
#公共的;
openstack endpoint create --region RegionOne \
  image public http://controller:9292

#内部的;
openstack endpoint create --region RegionOne \
  image internal http://controller:9292

#有管理员的;
openstack endpoint create --region RegionOne \
  image admin http://controller:9292

安装配置glance镜像服务

#安装glance服务;
yum -y install openstack-glance

#修改 /etc/glance/glance-api.conf配置文件;
cp /etc/glance/glance-api.conf /etc/glance/glance-api.conf.bak

grep -Ev "^$|^#" /etc/glance/glance-api.conf.bak > /etc/glance/glance-api.conf

openstack-config --set /etc/glance/glance-api.conf database connection mysql+pymysql://glance:1@controller/glance

openstack-config --set /etc/glance/glance-api.conf keystone_authtoken auth_uri http://controller:5000

openstack-config --set /etc/glance/glance-api.conf keystone_authtoken auth_url http://controller:35357

openstack-config --set /etc/glance/glance-api.conf keystone_authtoken memcached_servers controller:11211

openstack-config --set /etc/glance/glance-api.conf keystone_authtoken auth_type password

openstack-config --set /etc/glance/glance-api.conf keystone_authtoken project_domain_name default

openstack-config --set /etc/glance/glance-api.conf keystone_authtoken user_domain_name default

openstack-config --set /etc/glance/glance-api.conf keystone_authtoken project_name service

openstack-config --set /etc/glance/glance-api.conf keystone_authtoken username glance

openstack-config --set /etc/glance/glance-api.conf keystone_authtoken password 1

openstack-config --set /etc/glance/glance-api.conf paste_deploy flavor keystone

openstack-config --set /etc/glance/glance-api.conf glance_store stores file,http

openstack-config --set /etc/glance/glance-api.conf glance_store default_store file

openstack-config --set /etc/glance/glance-api.conf glance_store filesystem_store_datadir /var/lib/glance/images/

#修改/etc/glance/glance-registry.conf配置文件;
cp /etc/glance/glance-registry.conf /etc/glance/glance-registry.conf.bak

grep -Ev "^$|^#" /etc/glance/glance-registry.conf.bak > /etc/glance/glance-registry.conf

openstack-config --set /etc/glance/glance-registry.conf database connection mysql+pymysql://glance:1@controller/glance

openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken auth_uri http://controller:5000

openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken auth_url http://controller:35357

openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken memcached_servers controller:11211

openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken auth_type password

openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken project_domain_name default

openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken user_domain_name default

openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken project_name service

openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken username glance

openstack-config --set /etc/glance/glance-registry.conf keystone_authtoken password 1

openstack-config --set /etc/glance/glance-registry.conf paste_deploy flavor keystone

#写入glance服务数据库(同步数据库);
su -s /bin/sh -c "glance-manage db_sync" glance

#查看glance数据库,是否有表,有表为成功,空的为失败;
mysql -uroot -p1 glance -e "show tables;"

#启动glance服务,设置开机自启;
systemctl enable openstack-glance-api.service \
openstack-glance-registry.service

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

测试,上传一个镜像到glance服务

openstack image create "cirros" \
--file cirros-0.4.0-i386-disk.img \
--disk-format qcow2 \
--container-format bare \
--public

nova计算服务

nova服务介绍

Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源。OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的。计算资源只是内存跟cpu。

  • nova-api:接受并相应所有的计算服务请求,管理虚拟机(云主机)生命周期;
  • nova-compute(可以有多个):真正管理虚拟机(nova-compute调用libvirt);
  • nova-nova-scheduler:nova调度器(挑选出最合适的nova-compute来创建虚拟机);
  • nova-conductor:帮助nova-compute代理修改数据库中虚拟机的状态;
  • nova-network:早期openstack版本管理虚拟机网络(已弃用,neutron);
  • nova-consoleauth和nova-novncproxy:web版的vnc用来直接在web界面操作虚拟机;
    • nova-novncproxy:web版vnc客户端;
  • nova-api-metadata:接受来自虚拟机发送的元数据请求(配合neutron-metadata-agent,来实现虚拟机定制化)。

控制节点数据库配置

#在控制节点上创建nova数据库,并授权;
mysql -uroot -p1

CREATE DATABASE nova_api;
CREATE DATABASE nova;

GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' \
IDENTIFIED BY '1';

GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' \
IDENTIFIED BY '1';

GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost'\
IDENTIFIED BY '1';

GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \
IDENTIFIED BY '1';

keystone端配置nova服务用户

openstack user create --domain default \
  --password "1" nova

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

keystone端创建nova服务实体,注册api

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

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

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

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

安装配置nova控制节点

#安装nova控制节点服务
yum -y install openstack-nova-api \
openstack-nova-scheduler \
openstack-nova-conductor \
openstack-nova-console \
openstack-nova-novncproxy

#修改/etc/nova/nova.conf配置文件
cp /etc/nova/nova.conf /etc/nova/nova.conf.bak

grep -Ev "^$|^#" /etc/nova/nova.conf.bak > /etc/nova/nova.conf

openstack-config --set /etc/nova/nova.conf DEFAULT enabled_apis osapi_compute,metadata

openstack-config --set /etc/nova/nova.conf api_database connection mysql+pymysql://nova:1@controller/nova_api

openstack-config --set /etc/nova/nova.conf database connection mysql+pymysql://nova:1@controller/nova

openstack-config --set /etc/nova/nova.conf DEFAULT rpc_backend rabbit

openstack-config --set /etc/nova/nova.conf oslo_messaging_rabbit rabbit_host controller

openstack-config --set /etc/nova/nova.conf oslo_messaging_rabbit rabbit_userid openstack

openstack-config --set /etc/nova/nova.conf oslo_messaging_rabbit rabbit_password 1

openstack-config --set /etc/nova/nova.conf DEFAULT auth_strategy keystone

openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_uri http://controller:5000

openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_url http://controller:35357

openstack-config --set /etc/nova/nova.conf keystone_authtoken memcached_servers controller:11211

openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_type password

openstack-config --set /etc/nova/nova.conf keystone_authtoken project_domain_name default

openstack-config --set /etc/nova/nova.conf keystone_authtoken user_domain_name default

openstack-config --set /etc/nova/nova.conf keystone_authtoken project_name service

openstack-config --set /etc/nova/nova.conf keystone_authtoken username nova

openstack-config --set /etc/nova/nova.conf keystone_authtoken password 1

openstack-config --set /etc/nova/nova.conf DEFAULT my_ip 10.0.0.11

openstack-config --set /etc/nova/nova.conf DEFAULT use_neutron True

openstack-config --set /etc/nova/nova.conf DEFAULT firewall_driver nova.virt.firewall.NoopFirewallDriver

openstack-config --set /etc/nova/nova.conf vnc vncserver_listen '$my_ip'

openstack-config --set /etc/nova/nova.conf vnc vncserver_proxyclient_address '$my_ip'

openstack-config --set /etc/nova/nova.conf glance api_servers http://controller:9292

openstack-config --set /etc/nova/nova.conf oslo_concurrency lock_path /var/lib/nova/tmp

#写入nova服务数据库(同步数据库);
su -s /bin/sh -c "nova-manage api_db sync" nova
su -s /bin/sh -c "nova-manage db sync" nova

##查看nova数据库,是否有表,有表为成功,空的为失败;
mysql -uroot -p1 nova_api -e 'show tables;'
mysql -uroot -p1 nova -e 'show tables;'

#启动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

测试,请求nova控制节点服务状态

#有三个服务up状态;
nova service-list

netstat -lntup | grep 6080

安装配置nova计算节点

#安装nova计算节点服务;
yum -y install openstack-nova-compute

#编辑/etc/nova/nova.conf配置文件;
cp /etc/nova/nova.conf /etc/nova/nova.conf.bak

grep -Ev "^$|^#" /etc/nova/nova.conf.bak > /etc/nova/nova.conf

#安装openstack-utils插件,使用命令修改配置文件;
yum -y install openstack-utils.noarch

openstack-config --set /etc/nova/nova.conf DEFAULT rpc_backend rabbit

openstack-config --set /etc/nova/nova.conf oslo_messaging_rabbit rabbit_host controller

openstack-config --set /etc/nova/nova.conf oslo_messaging_rabbit rabbit_userid openstack

openstack-config --set /etc/nova/nova.conf oslo_messaging_rabbit rabbit_password 1

openstack-config --set /etc/nova/nova.conf DEFAULT auth_strategy keystone

openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_uri http://controller:5000

openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_url http://controller:35357

openstack-config --set /etc/nova/nova.conf keystone_authtoken memcached_servers controller:11211

openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_type password

openstack-config --set /etc/nova/nova.conf keystone_authtoken project_domain_name default

openstack-config --set /etc/nova/nova.conf keystone_authtoken user_domain_name default

openstack-config --set /etc/nova/nova.conf keystone_authtoken project_name service

openstack-config --set /etc/nova/nova.conf keystone_authtoken username nova

openstack-config --set /etc/nova/nova.conf keystone_authtoken password 1

openstack-config --set /etc/nova/nova.conf DEFAULT my_ip 192.168.52.162

openstack-config --set /etc/nova/nova.conf DEFAULT use_neutron True

openstack-config --set /etc/nova/nova.conf DEFAULT firewall_driver nova.virt.firewall.NoopFirewallDriver

openstack-config --set /etc/nova/nova.conf vnc enabled True

openstack-config --set /etc/nova/nova.conf vnc vncserver_listen 0.0.0.0

openstack-config --set /etc/nova/nova.conf vnc vncserver_proxyclient_address '$my_ip'

openstack-config --set /etc/nova/nova.conf vnc novncproxy_base_url http://controller:6080/vnc_auto.html

openstack-config --set /etc/nova/nova.conf glance api_servers http://controller:9292

openstack-config --set /etc/nova/nova.conf oslo_concurrency lock_path /var/lib/nova/tmp

#查看计算节点是否支持虚拟机硬件加速;
#如果这个命令返回了1或者其他的值时,那么你的计算节点支持硬件加速且不需要额外的配置;
#如果这个命令返回了0值,那么你的计算节点不支持硬件加速,你必须配置libvirt来使用QEMU去代替KVM。
egrep -c '(vmx|svm)' /proc/cpuinfo

openstack-config --set /etc/nova/nova.conf libvirt virt_type kvm

#启动nova计算节点服务,设置开机自启;
systemctl enable libvirtd.service openstack-nova-compute.service

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

测试,请求nova控制节点服务状态

#有四个服务up状态;
#多了一个nova-compute服务;
nova service-list

neutron网络服务

neutron服务介绍

OpenStack网络服务已由Quantum改名为Neutron。Neutron是OpenStack核心项目之一,提供云计算环境下的虚拟网络功能服务。

Neutron的设计目标是实现“网络即服务(Networking as a Service)”。为了达到这一目标,在设计上遵循了基于SDN(Software-Defined Networking,软件定义网络)实现网络虚拟化的原则,在实现上充分利用了Linux系统上的各种网络相关的技术。

Neutron网络允许用户创建和管理网络对象,如网络(Net)、子网(Subnet)、端口(Port),这些对象可以被其他OpenStack服务所利用。插件架构模式增强了OpenStack架构和部署的柔韧性,可以适应不同的网络设备和软件。

Neutron为整个OpenStack环境提供网络支持,包括二层交换,三层路由,负载均衡,防火墙和*** 等。Neutron提供了一个灵活的框架,通过配置,无论是开源还是商业软件都可以被用来实现这些功能。

  • neutron-server:接受和响应外部的网络管理请求(端口9696);
  • neutron-linuxbridge-agent:负责创建桥接网卡;
  • neutron-dhcp-agent:分配IP地址;
  • neutron-metadata-agent:配合nova-metadata-api实现虚拟机的定制化操作;
  • L3-agent:实现三层网络vxlan(网络层)。

控制节点数据库配置

#在控制节点上创建neutron数据库,并授权;
mysql -uroot -p1 

CREATE DATABASE neutron;

GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' \
IDENTIFIED BY '1';

GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' \
IDENTIFIED BY '1';

keystone端配置neutron服务用户

openstack user create --domain default \
--password '1' neutron

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

keystone端创建neutron服务实体,注册api

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

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

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

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

安装配置neutron控制节点

#安装neutron控制节点服务;
yum -y install openstack-neutron \
openstack-neutron-ml2 \
openstack-neutron-linuxbridge \
ebtables

#neutron网络服务分为公共网络和私有网络;
#公共网络是二层网络,私有网络是三层网络;
#选择你需要的网络进行搭建;

#这里使用公共网络演示配置;
#修改/etc/neutron/neutron.conf配置文件;
cp /etc/neutron/neutron.conf /etc/neutron/neutron.conf.bak

grep -Ev "^$|^#" /etc/neutron/neutron.conf.bak > /etc/neutron/neutron.conf

openstack-config --set /etc/neutron/neutron.conf database connection mysql+pymysql://neutron:1@controller/neutron

#配置启用ML2插件,禁用其他插件;
openstack-config --set /etc/neutron/neutron.conf DEFAULT core_plugin ml2

openstack-config --set /etc/neutron/neutron.conf DEFAULT service_plugins

#配置RabbitMQ消息队列连接;
openstack-config --set /etc/neutron/neutron.conf DEFAULT rpc_backend rabbit

openstack-config --set /etc/neutron/neutron.conf oslo_messaging_rabbit rabbit_host controller

openstack-config --set /etc/neutron/neutron.conf oslo_messaging_rabbit rabbit_userid openstack

openstack-config --set /etc/neutron/neutron.conf oslo_messaging_rabbit rabbit_password 1

#配置keystone认证服务访问
openstack-config --set /etc/neutron/neutron.conf DEFAULT auth_strategy keystone

openstack-config --set /etc/neutron/neutron.conf keystone_authtoken auth_uri http://controller:5000

openstack-config --set /etc/neutron/neutron.conf keystone_authtoken auth_url http://controller:35357

openstack-config --set /etc/neutron/neutron.conf keystone_authtoken memcached_servers controller:11211

openstack-config --set /etc/neutron/neutron.conf keystone_authtoken auth_type password

openstack-config --set /etc/neutron/neutron.conf keystone_authtoken project_domain_name default

openstack-config --set /etc/neutron/neutron.conf keystone_authtoken user_domain_name default

openstack-config --set /etc/neutron/neutron.conf keystone_authtoken project_name service

openstack-config --set /etc/neutron/neutron.conf keystone_authtoken username neutron

openstack-config --set /etc/neutron/neutron.conf keystone_authtoken password 1

#配置网络服务来通知计算节点的网络拓扑变化;
openstack-config --set /etc/neutron/neutron.conf DEFAULT notify_nova_on_port_status_changes True

openstack-config --set /etc/neutron/neutron.conf DEFAULT notify_nova_on_port_data_changes True

openstack-config --set /etc/neutron/neutron.conf nova auth_url http://controller:35357

openstack-config --set /etc/neutron/neutron.conf nova auth_type password

openstack-config --set /etc/neutron/neutron.conf nova project_domain_name default

openstack-config --set /etc/neutron/neutron.conf nova user_domain_name default

openstack-config --set /etc/neutron/neutron.conf nova region_name RegionOne

openstack-config --set /etc/neutron/neutron.conf nova project_name service

openstack-config --set /etc/neutron/neutron.conf nova username nova

openstack-config --set /etc/neutron/neutron.conf nova password 1

#配置锁路径;
openstack-config --set /etc/neutron/neutron.conf
 oslo_concurrency lock_path /var/lib/neutron/tmp

#修改/etc/neutron/plugins/ml2/ml2_conf.ini配置文件;
#配置 Modular Layer 2 (ML2) 插件;

cp /etc/neutron/plugins/ml2/ml2_conf.ini  /etc/neutron/plugins/ml2/ml2_conf.ini.bak

grep -Ev "^$|^#" /etc/neutron/plugins/ml2/ml2_conf.ini.bak > /etc/neutron/plugins/ml2/ml2_conf.ini

#启用flat和VLAN网络;
openstack-config --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 type_drivers flat,vlan

#禁用私有网络;
openstack-config --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 tenant_network_types

#启用Linuxbridge机制;
openstack-config --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 mechanism_drivers linuxbridge

#启用端口安全扩展驱动;
openstack-config --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 extension_drivers port_security

#配置公共虚拟网络为flat网络;
openstack-config --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2_type_flat flat_networks provider

#启用 ipset 增加安全组规则的高效性;
openstack-config --set /etc/neutron/plugins/ml2/ml2_conf.ini securitygroup enable_ipset True

#修改/etc/neutron/plugins/ml2/linuxbridge_agent.ini配置文件;
#配置Linuxbridge代理;

cp /etc/neutron/plugins/ml2/linuxbridge_agent.ini /etc/neutron/plugins/ml2/linuxbridge_agent.ini.bak

grep -Ev "^$|^#" /etc/neutron/plugins/ml2/linuxbridge_agent.ini.bak > /etc/neutron/plugins/ml2/linuxbridge_agent.ini

#将公共虚拟网络和公共物理网络接口对应起来;
openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini linux_bridge physical_interface_mappings provider:ens33

#禁止VXLAN覆盖网络;
openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini vxlan enable_vxlan False

#启用安全组并配置;
openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini securitygroup enable_security_group True

openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini securitygroup firewall_driver neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

#修改/etc/neutron/dhcp_agent.ini配置文件;
#配置DHCP代理;

cp /etc/neutron/dhcp_agent.ini /etc/neutron/dhcp_agent.ini.bak

grep -Ev "^$|^#" /etc/neutron/dhcp_agent.ini.bak > /etc/neutron/dhcp_agent.ini

#配置Linuxbridge驱动接口,DHCP驱动并启用隔离元数据,这样在公共网络上的实例就可以通过网络来访问元数据。
openstack-config --set /etc/neutron/dhcp_agent.ini DEFAULT interface_driver neutron.agent.linux.interface.BridgeInterfaceDriver

openstack-config --set /etc/neutron/dhcp_agent.ini DEFAULT dhcp_driver neutron.agent.linux.dhcp.Dnsmasq

openstack-config --set /etc/neutron/dhcp_agent.ini DEFAULT enable_isolated_metadata True

#修改/etc/neutron/metadata_agent.ini配置文件;
#配置元数据代理;
#负责提供配置信息,例如:访问实例的凭证;

cp /etc/neutron/metadata_agent.ini /etc/neutron/metadata_agent.ini.bak

grep -Ev "^$|^#" /etc/neutron/metadata_agent.ini.bak > /etc/neutron/metadata_agent.ini

#配置元数据主机以及共享密码;
openstack-config --set /etc/neutron/metadata_agent.ini DEFAULT nova_metadata_ip controller

openstack-config --set /etc/neutron/metadata_agent.ini DEFAULT metadata_proxy_shared_secret 1

#修改/etc/nova/nova.conf配置文件;
#为计算服务控制端配置网络服务;

#启用元数据代理并设置密码;
openstack-config --set /etc/nova/nova.conf neutron url http://controller:9696

openstack-config --set /etc/nova/nova.conf neutron auth_url http://controller:35357

openstack-config --set /etc/nova/nova.conf neutron auth_type password

openstack-config --set /etc/nova/nova.conf neutron project_domain_name default

openstack-config --set /etc/nova/nova.conf neutron user_domain_name default

openstack-config --set /etc/nova/nova.conf neutron region_name RegionOne

openstack-config --set /etc/nova/nova.conf neutron project_name service

openstack-config --set /etc/nova/nova.conf neutron username neutron

openstack-config --set /etc/nova/nova.conf neutron password 1

openstack-config --set /etc/nova/nova.conf neutron service_metadata_proxy True

openstack-config --set /etc/nova/nova.conf neutron metadata_proxy_shared_secret 1

#写入neutron服务数据库(同步数据库);
#网络服务初始化脚本需要一个超链接 /etc/neutron/plugin.ini``指向ML2插件配置文件;
ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini

#同步数据库,出现ok即为成功;
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

#启动neutron控制节点服务,设置开机自启;
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

#如果neutron服务配置的是私有网络,则还需要启用layer-3服务;
systemctl enable neutron-l3-agent.service

systemctl start neutron-l3-agent.service

测试,请求neutron控制节点服务状态;

#服务启动后等待几分钟;
#使用下面命令查看neutron服务状态,共三个服务;
#如果alive列全部为笑脸状的标志表示成功,如果为xxx则失败;
neutron agent-list

安装配置neutron计算节点

#安装neutron计算节点服务;
yum -y install openstack-neutron-linuxbridge ebtables ipset

#修改/etc/neutron/neutron.conf配置文件;
#配置通用组件;
#Networking 通用组件的配置包括认证机制、消息队列和插件;

cp /etc/neutron/neutron.conf /etc/neutron/neutron.conf.bak

grep -Ev "^$|^#" /etc/neutron/neutron.conf.bak > /etc/neutron/neutron.conf

#在``[database]`` 部分,注释所有``connection`` 项,因为计算节点不直接访问数据库。

#配置 “RabbitMQ” 消息队列的连接;
openstack-config --set /etc/neutron/neutron.conf DEFAULT rpc_backend rabbit

openstack-config --set /etc/neutron/neutron.conf oslo_messaging_rabbit rabbit_host controller

openstack-config --set /etc/neutron/neutron.conf oslo_messaging_rabbit rabbit_userid openstack

openstack-config --set /etc/neutron/neutron.conf oslo_messaging_rabbit rabbit_password 1

#配置keystone认证服务访问;
openstack-config --set /etc/neutron/neutron.conf DEFAULT auth_strategy keystone

openstack-config --set /etc/neutron/neutron.conf keystone_authtoken auth_uri http://controller:5000

openstack-config --set /etc/neutron/neutron.conf keystone_authtoken auth_url http://controller:35357

openstack-config --set /etc/neutron/neutron.conf keystone_authtoken memcached_servers controller:11211

openstack-config --set /etc/neutron/neutron.conf keystone_authtoken auth_type password

openstack-config --set /etc/neutron/neutron.conf keystone_authtoken project_domain_name default

openstack-config --set /etc/neutron/neutron.conf keystone_authtoken user_domain_name default

openstack-config --set /etc/neutron/neutron.conf keystone_authtoken project_name service

openstack-config --set /etc/neutron/neutron.conf keystone_authtoken username neutron

openstack-config --set /etc/neutron/neutron.conf keystone_authtoken password 1

#配置锁路径;
openstack-config --set /etc/neutron/neutron.conf oslo_concurrency lock_path /var/lib/neutron/tmp

#配置网络选项;
#选择公共网络和私有网络,和neutron控制节点保持一致;
#公共网络;
#修改/etc/neutron/plugins/ml2/linuxbridge_agent.ini配置文件;
#配置Linuxbridge代理;

cp /etc/neutron/plugins/ml2/linuxbridge_agent.ini /etc/neutron/plugins/ml2/linuxbridge_agent.ini.bak

grep -Ev "^$|^#" /etc/neutron/plugins/ml2/linuxbridge_agent.ini.bak > /etc/neutron/plugins/ml2/linuxbridge_agent.ini

#将公共虚拟网络和公共物理网络接口对应起来;
openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini linux_bridge physical_interface_mappings provider:ens33

#禁止VXLAN覆盖网络;
openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini vxlan enable_vxlan False

#启用安全组并配置;
openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini securitygroup enable_security_group True

openstack-config --set /etc/neutron/plugins/ml2/linuxbridge_agent.ini securitygroup firewall_driver neutron.agent.linux.iptables_firewall.IptablesFirewallDriver

#修改/etc/nova/nova.conf配置文件;
#为计算节点配置网络服务;
#配置访问参数;
openstack-config --set /etc/nova/nova.conf neutron url http://controller:9696

openstack-config --set /etc/nova/nova.conf neutron auth_url http://controller:35357

openstack-config --set /etc/nova/nova.conf neutron auth_type password

openstack-config --set /etc/nova/nova.conf neutron project_domain_name default

openstack-config --set /etc/nova/nova.conf neutron user_domain_name default

openstack-config --set /etc/nova/nova.conf neutron region_name RegionOne

openstack-config --set /etc/nova/nova.conf neutron project_name service

openstack-config --set /etc/nova/nova.conf neutron username neutron

openstack-config --set /etc/nova/nova.conf neutron password 1

#重启计算节点nova计算服务;
systemctl restart openstack-nova-compute.service

#启动neutron计算节点Linuxbridge代理并配置它开机自启动;
systemctl enable neutron-linuxbridge-agent.service

systemctl start neutron-linuxbridge-agent.service

测试,在控制节点请求neutron控制节点服务状态

#计算节点服务启动后等待几分钟;
#使用下面命令查看neutron服务状态;
#会多出一个Linux bridge agent服务,主机名为computer,alive列是笑脸;
neutron agent-list

#也可使用下面命令列出加载的扩展来验证;
#有结果即为成功;
neutron ext-list

Dashboard(Horizon)图形化服务

Dashboard(horizon)是一个web接口,使得云平台管理员以及用户可以管理不同的Openstack资源以及服务。

  • 提供一个Web界面操作OpenStack系统
  • 使用Django框架基于OpenStack API开发
  • 支持将session存储在DB、Memcached
  • 支持集群

安装配置dashboard服务

#安装dashboard服务;
yum -y install openstack-dashboard

#vim编辑/etc/openstack-dashboard/local_settings文件修改内容;
#配置仪表盘以使用 OpenStack 服务;
OPENSTACK_HOST = "controller"

#允许所有主机访问仪表板;
ALLOWED_HOSTS = ['*', ]

#配置 memcached 会话存储服务;
#将其他的会话存储服务配置注释。
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

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

#启用第3版认证API;
OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST

#启用对域的支持;
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True

#配置API版本;
OPENSTACK_API_VERSIONS = {
    "identity": 3,
    "image": 2,
    "volume": 2,
}

#通过仪表盘创建用户时的默认域配置为 default;
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "default"

#通过仪表盘创建的用户默认角色配置为 user ;
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"

#如果您选择网络参数1,禁用支持3层网络服务;
OPENSTACK_NEUTRON_NETWORK = {
    'enable_router': False,
    'enable_quotas': False,
    'enable_distributed_router': False,
    'enable_ha_router': False,
    'enable_lb': False,
    'enable_firewall': False,
    'enable_vpn': False,
    'enable_fip_topology_check': False,
}

#可以选择性地配置时区;
TIME_ZONE = "Asia/Shanghai"

#修改httpd服务的openstack-dashboard配置文件;
echo 'WSGIApplicationGroup %{GLOBAL}' > /etc/httpd/conf.d/openstack-dashboard.conf

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

测试,在浏览器访问dashboard服务

#浏览器输入http://openstack控制节点IP地址/dashboard
#keystone服务所在节点就是openstack控制节点。
#登陆默认域为:default
#默认用户:admin
#默认密码:1