一、准备环境
openstack m版本部署安装
1、防火墙 关闭
2、主机规划:
3、主机名:
4、yum配置:
5、系统更新
6、时间同步,时间服务器 ntp
1、关闭防火墙
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# systemctl disable firewalld //禁止开机自启
[root@localhost ~]# setenforce 0 //关闭selinux
配置文件永久关闭selinux
[root@localhost ~]# vim /etc/selinux/config
SELINUX=disabled
2、静态IP地址配置
[root@localhost~]# vim/etc/sysconfig/network-scripts/ifcfg-eno16777736
HWADDR=00:0C:29:A9:29:A9
TYPE=Ethernet
BOOTPROTO=static
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME=eno16777736
UUID=69b7cbcb-4f9a-4a3e-85f1-332a76f233c4
ONBOOT=yes
IPADDR=192.168.11.86
NETMASK=255.255.255.0
GATEWAY=192.168.11.254
3、主机名设置
[root@localhost ~]# hostnamectl set-hostname controller
添加本地地址解析
[root@localhost ~]# vim /etc/hosts
192.168.11.86 controller
4、yum配置
[root@controller ~]# vim /etc/yum.repos.d/local.repo
[openstack-m]
name=openstack-m
baseurl=http://192.168.50.124/openstack-rpms/openstack-mitaka/openstack-mitaka/
gpgcheck=0
enabled=1
[base]
name=base
baseurl=http:// 192.168.50.124/centos-yum/7.2.1511/os/x86_64/
gpgcheck=0
enabled=1
[update]
bane=update
baseurl=http:// 192.168.50.124/centos-yum/7.2.1511/updates/x86_64/
gpgcheck=0
enabled=1
[extras]
bane=extras
baseurl=http:// 192.168.50.124/centos-yum/7.2.1511/extras/x86_64/
gpgcheck=0
enabled=1
检查yum源
[root@controller ~]# yum repolist
5、系统更新、时间同步服务端
[root@localhost yum.repos.d]# yum update
[root@controller ~]# yum install chrony
[root@controller ~]# vim /etc/chrony.conf 添加
server controller iburst //添加服务器主机
allow 192.168.11.0/24 // 设置允许访问地址
[root@controller ~]# systemctl enable chronyd.service //设置时钟同步服务开机自启
[root@controller ~]# systemctl start chronyd.service
6、OpenStack包
启用OpenStack库
# yum install centos-release-openstack-mitaka
安装 OpenStack 客户端:
# yum install python-openstackclient
安装 openstack-selinux 软件包以便自动管理 OpenStack 服务的安全策略:
# yum install openstack-selinux
7、安装数据库MySQL
[root@controller ~]# yum install mariadb mariadb-server python2-PyMySQL -y
###python2-PyMySQL用于python连接mysql数据库
[root@controller ~]# vim /etc/my.cnf.d/openstack.cnf
[mysqld]
bind-address = 192.168.11.86 ###控制节点的管理网络IP地址以使得其它节点可以通过管理网络访问数据库
default-storage-engine = innodb ###数据库引擎类型
innodb_file_per_table
max_connections = 4096
collation-server = utf8_general_ci
character-set-server = utf8 ####设置字符集,支持中文
启动数据库服务,并将其配置为开机自启:
# systemctl enable mariadb.service
# systemctl start mariadb.service
8、安装NoSQL 数据库
Telemetry 服务使用 NoSQL(非关系型数据库) 数据库来存储信息,典型地,这个数据库运行在控制节点上。向导中使用MongoDB。
1>、安装MongoDB包:
# yum install mongodb-server mongodb
2>、编辑 mongodb配置文件
vim /etc/mongodb.conf
配置 bind_ip 使用控制节点管理网卡的IP地址。
bind_ip = 192.168.11.86
启用小日志
smallfiles = true
3>、启动MongoDB 并配置它随系统启动:
# systemctl enable mongod.service
# systemctl start mongod.service
9、消息队列
OpenStack 使用 message queue 协调操作和各服务的状态信息。消息队列服务一般运行在控制节点上。OpenStack支持好几种消息队列服务包括 RabbitMQ, Qpid, 和 ZeroMQ。不过,大多数发行版本的OpenStack包支持特定的消息队列服务。本指南安装 RabbitMQ 消息队列服务,因为大部分发行版本都支持它。如果你想安装不同的消息队列服务,查询与之相关的文档。
安装RabbitMQ服务
# yum install rabbitmq-server
启动消息队列服务并将其配置为随系统启动
# systemctl enable rabbitmq-server.service
# systemctl start rabbitmq-server.service
添加 openstack 用户 指定密码(123456)
# rabbitmqctl add_user openstack 123456
Creating user "openstack" ...
...done.
给``openstack``用户配置写和读权限:
# rabbitmqctl set_permissions openstack ".*" ".*" ".*"
Setting permissions for user "openstack" in vhost "/" ...
...done.
10、Memcached
认证服务认证缓存使用Memcached缓存令牌。缓存服务memecached运行在控制节点。在生产部署中,我们推荐联合启用防火墙、认证和加密保证它的安全。
1>、安装memcahed软件包:
# yum install memcached python-memcached
2>、启动Memcached服务,并且配置它随机启动。
# systemctl enable memcached.service
# systemctl start memcached.service
二、安装keystone
OpenStack keystone中各个角色的理解
OpenStack Identity(Keystone)服务为运行OpenStack Compute上的OpenStack云提供了认证和管理用户、帐号和角色信息服务,并为OpenStack Object Storage提供授权服务。
Keystone体系结构
Keystone 有两个主要部件:验证和服务目录
验证:提供了一个基于令牌的验证服务,主要有以下几个概念:
租户(Tenant)
使用OpenStack相关服务的一个组织。一个租户映射到一个Nova的“project-id”,在对象存储中,一个租户可以有多个容器。根据不同的安装方式,一个租户可以代表一个客户、帐号、组织或项目。
用户(User)
代表一个个体,OpenStack以用户的形式来授权服务给它们。用户拥有证书(credentials),且可能分配给一个或多个租户。经过验证后,会为每个单独的租户提供一个特定的令牌。
证书(credentials)
为了给用户提供一个令牌,需要用证书来唯一标识一个Keystone用户的密码或其它信息
令牌(token)
一个令牌是一个任意比特的文本,用于与其它OpenStack服务来共享信息,Keystone以此来提供一个central location,以验证访问OpenStack服务的用户。一个令牌可以是“scoped”或“unscoped”。一个scoped令牌代表为某个租户验证过的用户,而unscoped令牌则仅代表一个用户。令牌的有效期是有限的,可以随时被撤回。
角色(Role)
一个角色是应用于某个租户的使用权限集合,以允许某个指定用户访问或使用特定操作。角色是使用权限的逻辑分组,它使得通用的权限可以简单地分组并绑定到与某个指定租户相关的用户。
服务目录(Service Catalog)
Keystone为OpenStack安装提供了一个REST API端点列表并以此作为决策参考。主要的概念包括:
服务(Service)
一个OpenStack服务,例如nova、swift、glance或keystone。一个服务可以拥有一个或多个端点,通过它用户可以与OpenStack的服务或资源交互。
端点(Endpoint)
一个可以通过网络访问的地址(典型地,一个URL),代表了OpenStack服务的API接口。端点也可以分组为模板,每个模板代表一组可用的OpenStack服务,这些服务是跨区域(regions)可用的。
模板(Template)
一个端点集合,代表一组可用的OpenStack服务端点。
Keystone的组件
Keystone包含一个命令行接口,可以与Keystone API交互以管理keystone和相关服务。
keystone - 运行keystone-admin和keystone-service
keystone-admin - 操作keystone的管理API
keystone-service - 用于验证的,面向用户的AP
keystone-manage - 管理keystone的命令行接口
Keystone还包括WSGI中间件以为Nova和Swift提供验证服务。
Keystone使用一个内置的SQLite数据库 - 为验证用户,将来也可能使用一个外部LDAP服务来代替存储证书
中间件(Middleware)
Keystone中间件位于OpenStack服务前面,处理进来的请求验证。中间件的设计遵循如下的规范。
中间件的源代码位于Keystone/middleware。
中间件支持两个接口:WSGI和REST/HTTP。
REST & HTTP API
如果进来一个未经认证的调用,中间件将响应一个401 Unautorized错误。根据每HTTP的标准,它也会返回一个WWW-Authenticate包头以通知调用者支持哪个协议。对于Keystone验证,响应的语法格式如下:
WWW-Authenticate: Keystone uri="url to Keystone server"The client can then make the necessary calls to the Keystone server, obtain a token, and retry the call with the token.
令牌使用 X-Auth-Toke包头传递。
WSGI API(包头)
当成功验证后中间件经为下行的WSGI应用发送如下包头:
X-Identity-Status
提供请求是否被验证的信息。
X-Tenant
提供了租户ID(在Keystone中以URL的形式出现)。在Keysotne转为采用ID/Name模式之前,它为租户提供了对任意遗留实现的支持。
X-Tenant-Id
唯一不变的租户ID。
X-Tenant-Name
唯一但可变的租户名字。
X-User
用于登录的用户名。
X-Roles
分配给用户的角色。
1、创建一个数据库和管理员令牌
用数据库连接客户端以 root 用户连接到数据库服务器:
$ mysql -u root -p
创建 keystone 数据库:
CREATE DATABASE keystone;
对``keystone``数据库创建访问用户并授权授
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'localhost' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'%' IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON keystone.* TO 'keystone'@'controller' IDENTIFIED BY '123456';
验证用户创建完成
> select * from mysql.user \G;
2、生成一个随机值在初始的配置中作为管理员的令牌。
$ openssl rand -hex 10
d935dc49e81b025ef913
3、安装keystone服务,
安装Apache HTTP服务器来服务认证服务请求,mod_wsgi是用于apache支持python wsgi协议的扩展
# yum install openstack-keystone httpd mod_wsgi
编辑keystone配置文件
vim /etc/keystone/keystone.conf
在``[DEFAULT]``部分,定义初始管理令牌的值:
[DEFAULT]
...
admin_token = d935dc49e81b025ef913
在 [database] 部分,配置数据库访问:
[database] ...
connection= mysql+pymysql://keystone:123456@controller/keystone
//mysql+pymysql : 指定数据库
// keystone : 123456@controller:指定数据库用户及密码
///keystone : 指定库
在``[token]``部分,配置Fernet UUID令牌的提供者
[token]
...
provider = fernet
初始化身份认证服务的数据库:
# su -s /bin/sh -c "keystone-manage db_sync" keystone
验证初始化成功,keystone 库里表创建完成。
mysql -uroot -p
>use keystone;
>show tables;
初始化Fernet keys:
# keystone-manage fernet_setup --keystone-user keystone --keystone-group keystone
4、配置 Apache HTTP 服务器¶
vim /etc/httpd/conf/httpd.conf
配置``ServerName`` 选项为控制节点:
ServerName controller
创建keystoner认证配置文件
vim /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>
启动 Apache HTTP 服务并配置其随系统启动:
# systemctl enable httpd.service
# systemctl start httpd.service
5、创建服务实体和API端点
先决条件:
export OS_TOKEN=d935dc49e81b025ef913 //配置认证令牌,和admin_token = d935dc49e81b025ef913
export OS_URL=http://controller:35357/v3 //配置端点URL
export OS_IDENTITY_API_VERSION=3 //配置认证 API 版本
在Openstack环境中,认证服务管理服务目录。服务使用这个目录来决定您的环境中可用的服务。
创建身份认证服务:
$ openstack service create --name keystone --description "OpenStack Identity" identity
验证: 只能有一个identity
[root@controller ~]# openstack service list
删除多出的
[root@controller ~]# openstack service delete e888e28f3f984274ad2e2c95a2645017
身份认证服务管理了一个与环境相关的 API 端点的目录。服务使用这个目录来决定如何与您环境中的其他服务进行通信。
OpenStack使用三个API端点变种代表每种服务:admin(管理),internal(内部)和public(公共)。默认情况下,管理API端点允许修改用户和租户而公共和内部APIs不允许这些操作。在生产环境中,处于安全原因,变种为了服务不同类型的用户可能驻留在单独的网络上。对实例而言,公共API网络为了让顾客管理他们自己的云在互联网上是可见的。管理API网络在管理云基础设施的组织中操作也是有所限制的。内部API网络可能会被限制在包含OpenStack服务的主机上。
实例化keystone服务:
创建admin(管理)认证服务的 API 端
$openstack endpoint create --region RegionOne identity admin http://controller:5000/v3
创建internal(内部)认证服务的 API 端点
$ openstack endpoint create --region RegionOne identity internal http://controller:5000/v3
创建public(公共)认证服务的 API 端点
$ openstack endpoint create --region RegionOne identity public http://controller:35357/v3
#验证:
[root@controller ~]# openstack endpoint list
6、创建域、项目、用户和角色
身份认证服务为每个OpenStack服务提供认证服务。认证服务使用 domains, projects (tenants),term:`users<user>`和 :term:`roles<role>`的组合。
用户(User)
1) 一个用户就是一个有身份验证信息的API消费实体;
2)一个用户可以属于多个租户/项目/组织, 角色;
租户(Tenant)
【修改后】租户也可以理解为一个项目(Project)。
用户通过租户访问计算管理资源(这里的计算管理资源可以理解为openstack服务),也就是说必须指定一个相应的租户才可以申请openstack服务。
各租户相互独立,在当前租户下无法查看其他租户信息。
用户(User)
1) 一个用户就是一个有身份验证信息的API消费实体;
2)一个用户可以属于多个租户/项目/组织, 角色;
角色(Role)
1)角色是可执行一特定系列操作的用户特性,角色规定了用户在某个租户中的一系列权利和特权。
2)一般默认有超级管理员权限admin和普通管理员权限member。
创建域``default``:
$ openstack domain create --description "Default Domain" default
#验证:
[root@controller ~]# openstack domain list
创建 admin 项目:
$ openstack project create --domain default \
--description "Admin Project" admin
#验证:
[root@controller ~]# openstack project list
创建 admin (管理)用户:
$ openstack user create --domain default \
--password-prompt admin
#验证:
[root@controller ~]# openstack user list
创建 admin 角色:
$ openstack role create admin
#验证:
[root@controller ~]# openstack role list
添加``admin`` 角色到 admin 项目和用户上:
$ openstack role add --project admin --user admin admin
#创建服务项目
[root@controller ~]# openstack project create --domain default --description "Service Project" service
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Service Project |
| domain_id | 904d501c4e7545b5a532b11838648a89 |
| enabled | True |
| id | ebdc49f3845248818e2cf83a26adf2f5 |
| is_domain | False |
| name | service |
| parent_id | 904d501c4e7545b5a532b11838648a89 |
+-------------+----------------------------------+
创建 demo(演示,普通用户)用户
[root@controller ~]# openstack project create --domain default --description "Demo Project" demo
+-------------+----------------------------------+
| Field | Value |
+-------------+----------------------------------+
| description | Demo Project |
| domain_id | 904d501c4e7545b5a532b11838648a89 |
| enabled | True |
| id | 44d8fbbb7d0340fb832e082a8c6537c9 |
| is_domain | False |
| name | demo |
| parent_id | 904d501c4e7545b5a532b11838648a89 |
+-------------+----------------------------------+
#创建demo用户
[root@controller ~]# openstack user create --domain default --password-prompt demo
User Password:
Repeat User Password:
+-----------+----------------------------------+
| Field | Value |
+-----------+----------------------------------+
| domain_id | 904d501c4e7545b5a532b11838648a89 |
| enabled | True |
| id | 1ad0bbfa8b044d5da05157859acefb1b |
| name | demo |
+-----------+----------------------------------+
#创建demo 角色
[root@controller ~]# openstack role create user
+-----------+----------------------------------+
| Field | Value |
+-----------+----------------------------------+
| domain_id | None |
| id | f1a40d9c758d473e8cab974897849e78 |
| name | user |
+-----------+----------------------------------+
添加``demo`` 角色到 demo 项目和用户上:
[root@controller ~]# openstack role add --project demo --user demo user
############################################
查看详情:# openstack project show admin
############################################
7、验证操作
在安装其他服务之前确认身份认证服务的操作。
1> 因为安全性的原因,关闭临时认证令牌机制:(keystone服务端)
编辑vim /etc/keystone/keystone-paste.ini 文件,
从``[pipeline:public_api]``,[pipeline:admin_api]``和``[pipeline:api_v3]``部分删除``admin_token_auth``。
2> 重置``OS_TOKEN``和``OS_URL`` 环境变量,卸载令牌认证:(keystone客户端)
$ unset OS_TOKEN OS_URL
3> 使用admin 用户及密码,请求认证令牌
$ openstack --os-auth-url http://controller:35357/v3 \
--os-project-domain-name default --os-user-domain-name default \
--os-project-name admin --os-username admin token issue
Password:
4> 使用demo 用户及密码,请求认证令牌
$ openstack --os-auth-url http://controller:5000/v3 \
--os-project-domain-name default --os-user-domain-name default \
--os-project-name demo --os-username demo token issue
Password:
OpenStack token issue 令牌问题,期号
8、创建 OpenStack 客户端环境脚本
创建 admin项目和用户创建客户端环境变量脚本。
[root@controller ~]# vim admin.sh
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=admin
export OS_USERNAME=admin
export OS_PASSWORD=123456
export OS_AUTH_URL=http://controller:35357/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
创建 demo项目和用户创建客户端环境变量脚本。
[root@controller ~]# vim demo.sh
export OS_PROJECT_DOMAIN_NAME=default
export OS_USER_DOMAIN_NAME=default
export OS_PROJECT_NAME=demo
export OS_USERNAME=demo
export OS_PASSWORD=123456
export OS_AUTH_URL=http://controller:5000/v3
export OS_IDENTITY_API_VERSION=3
export OS_IMAGE_API_VERSION=2
镜像服务
1、创建glance数据库
$ mysql -u root -p
> CREATE DATABASE glance;
对``glance``数据库创建用户并授予恰当的权限
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'localhost' \
IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'%' \
IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON glance.* TO 'glance'@'controller' \
IDENTIFIED BY '123456';
2、获得 admin 凭证来获取只有管理员能执行的命令的访问权限
# bash admin.sh
创建 glance 用户:
$ openstack user create --domain default --password-prompt glance
openstack user create --domain default --password-prompt glance
User Password:
Repeat User Password:
添加 admin 角色到 glance 用户和 service 项目上。
$ openstack role add --project service --user glance admin
创建``glance``服务实体
$ openstack service create --name glance \
--description "OpenStack Image" image
创建镜像服务的 API 端点:
创建public(公共)镜像服务的 API 端点
$ openstack endpoint create --region RegionOne \
image public http://controller:9292
创建internal(内部)镜像服务的 API 端点
$ openstack endpoint create --region RegionOne \
image internal http://controller:9292
创建admin(管理)镜像服务的 API 端点
$ openstack endpoint create --region RegionOne \
image admin http://controller:9292
3、安全并配置组件
安装软件包:
# yum install openstack-glance
编辑配置文件
vim /etc/glance/glance-api.conf
在 [database] 部分,配置数据库访问
[database]
...
connection = mysql+pymysql://glance:123456@controller/glance
在 [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 = 123456
[paste_deploy]
flavor = keystone
在 [glance_store] 部分,配置本地文件系统存储和镜像文件位置:
[glance_store]
stores = file,http
default_store = file
filesystem_store_datadir = /var/lib/glance/images/
编辑配置文件
vim /etc/glance/glance-registry.conf
在 [database] 部分,配置数据库访问
[database]
connection = mysql+pymysql://glance:123456@controller/glance
在 [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 = 123456
[paste_deploy]
flavor = keystone
写入镜像服务数据库:
# su -s /bin/sh -c "glance-manage db_sync" glance
启动镜像服务、配置他们随机启动:
# systemctl enable openstack-glance-api.service \
openstack-glance-registry.service
# systemctl start openstack-glance-api.service \
openstack-glance-registry.service
验证操作
1> 获得 admin 凭证来获取只有管理员能执行的命令的访问权限:
# . admin.sh
2> 下载源镜像:
yum -y install wget
[root@controller ~]#
wget http://10.1.1.161/openstack-images/cirros-0.3.4-x86_64-disk.img
3> 使用 QCOW2 磁盘格式, bare 容器格式上传镜像到镜像服务并设置公共可见,这样所有的项目都可以访问它:
[root@controller ~]# openstack image create "cirros" --file cirros-0.3.4-x86_64-disk.img --disk-format qcow2 --container-format bare --public
4> 确认镜像的上传并验证属性:
$ openstack image list
计算服务
一、简介
Open Stack Compute Infrastructure (Nova)
Nova是OpenStack云中的计算组织控制器。支持OpenStack云中实例(instances)生命周期的所有活动都由Nova处理。这样使得Nova成为一个负责管理计算资源、网络、认证、所需可扩展性的平台。但是,Nova自身并没有提供任何虚拟化能力,相反它使用libvirt API来与被支持的Hypervisors交互。Nova 通过一个与Amazon Web Services(AWS)EC2 API兼容的web services API来对外提供服务。
功能和特点:
实例生命周期管理
管理计算资源
网络和认证管理
REST风格的API
异步的一致性通信
Hypervisor透明:支持Xen,XenServer/XCP, KVM, UML, VMware vSphere and Hyper-V
OpenStack计算的组成:
Nova 云架构包括以下主要组件:
API Server (nova-api)
Message Queue (rabbit-mq server)
Compute Workers (nova-compute)
Network Controller (nova-network)
Volume Worker (nova-volume)
Scheduler (nova-scheduler)
API Server(nova-api)
API Server对外提供一个与云基础设施交互的接口,也是外部可用于管理基础设施的唯一组件。管理使用EC2 API通过web services调用实现。然后API Server通过消息队列(Message Queue)轮流与云基础设施的相关组件通信。作为EC2 API的另外一种选择,OpenStack也提供一个内部使用的“OpenStack API”。
Message Queue(Rabbit MQ Server)
OpenStack 节点之间通过消息队列使用AMQP(Advanced Message Queue Protocol)完成通信。Nova 通过异步调用请求响应,使用回调函数在收到响应时触发。因为使用了异步通信,不会有用户长时间卡在等待状态。这是有效的,因为许多API调用预期的行为都非常耗时,例如加载一个实例,或者上传一个镜像。
Compute Worker(nova-compute)
Compute Worker处理管理实例生命周期。他们通过Message Queue接收实例生命周期管理的请求,并承担操作工作。在一个典型生产环境的云部署中有一些compute workers。一个实例部署在哪个可用的compute worker上取决于调度算法。
Network Controller(nova-network)
Network Controller 处理主机地网络配置。它包括IP地址分配、为项目配置VLAN、实现安全组、配置计算节点网络。
Volume Workers(nova-volume)
Volume Workers用来管理基于LVM(Logical Volume Manager)的实例卷。Volume Workers有卷的相关功能,例如新建卷、删除卷、为实例附加卷,为实例分离卷。卷为实例提供一个持久化存储,因为根分区是非持久化的,当实例终止时对它所作的任何改变都会丢失。当一个卷从实例分离或者实例终止(这个卷附加在该终止的实例上)时,这个卷保留着存储在其上的数据。当把这个卷重附加载相同实例或者附加到不同实例上时,这些数据依旧能被访问。
一个实例的重要数据几乎总是要写在卷上,这样可以确保能在以后访问。这个对存储的典型应用需要数据库等服务的支持。
Scheduler(nova-scheduler)
调度器Scheduler把nova-API调用映射为OpenStack组件。调度器作为一个称为nova-schedule守护进程运行,通过恰当的调度算法从可用资源池获得一个计算服务。Scheduler会根据诸如负载、内存、可用域的物理距离、CPU构架等作出调度决定。nova scheduler实现了一个可插入式的结构。
当前nova-scheduler实现了一些基本的调度算法:
随机算法:计算主机在所有可用域内随机选择
可用域算法:跟随机算法相仿,但是计算主机在指定的可用域内随机选择。
简单算法:这种方法选择负载最小的主机运行实例。负载信息可通过负载均衡器获得。
OpenStack中Nova相关的服务
nova-compute:运行虚拟机实例最主要的服务。
nova-scheduler:管理调度服务器满足对运行虚拟机的请求。
nova-api:处理对OpenStack的请求,并运行相应的服务。
nova-network:控制DHCP、DNS、路由的网络服务。
nova-objectstore:文件存储服务。
nova-common:OpenStack环境的基础Python库。
nova-cert:Nova证书管理服务,用来为Nova提供身份验证。
glance:镜像注册与传输服务。
rabbitmq-server:消息队列服务。
mysql-server:保存所有OpenStack服务数据的数据库服务,例如可用的计算节点、实例状态等。
ntp:网络时间协议,它在多节点的环境中十分重要,可以让计算节点保持相同的时钟。(可容忍的误差在5秒以内,否则将会出现不可预知的结果)
dnsmasq:前向DNS和DHCP服务,用来为实例分配地址。
安装控制节点
先决条件
创建 nova_api 和 nova 数据库:
$ mysql -u root -p
> CREATE DATABASE nova_api;
> CREATE DATABASE nova;
对数据库进行正确的授权:
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' \
IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' \
IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'controller' \
IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' \
IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'controller' \
IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \
IDENTIFIED BY '123456';
获得 admin 凭证来获取只有管理员能执行的命令的访问权限:
bash admin.sh
创建 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 \
--description "OpenStack Compute" compute
创建API 端点 :
创建public(公共)Compute 服务的 API 端点
openstack endpoint create --region RegionOne \
compute public http://controller:8774/v2.1/%\(tenant_id\)s
创建internal(内部)Compute 服务的 API 端点
$ openstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1/%\(tenant_id\)s
创建admin(管理)Compute 服务的 API 端点
$ 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]
enabled_apis = osapi_compute,metadata //只启用计算和元数据API
rpc_backend = rabbit //消息队列访问
auth_strategy = keystone //认证服务
my_ip = 192.168.11.86 //配置控制节点的管理接口的IP 地址
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver
//使能 Networking 服务
[api_database]
connection = mysql+pymysql://nova:123456@controller/nova_api
//配置nova数据库的连接:
[database]
connection = mysql+pymysql://nova:123456@controller/nova
//配置nova_api数据库的连接:
配置 “RabbitMQ” 消息队列访问:
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = 123456
配置认证服务访问:
[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 = 123456
配置VNC代理使用控制节点的管理接口IP地址 :
[vnc]
vncserver_listen = $my_ip
vncserver_proxyclient_address = $my_ip
在 [glance] 区域,配置镜像服务 API 的位置:
[glance]
api_servers = http://controller:9292
在 [oslo_concurrency] 部分,配置锁路径:
[oslo_concurrency]
lock_path = /var/lib/nova/tmp
同步Compute 数据库:
# su -s /bin/sh -c "nova-manage api_db sync" nova
# su -s /bin/sh -c "nova-manage db sync" nova
完成安装
启动 Compute 服务并将其设置为随系统启动:
# 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
安装和配置计算节点
安装软件包:
# yum install openstack-nova-compute
编辑配置文件
vim /etc/nova/nova.conf
[DEFAULT]
rpc_backend = rabbit //消息队列访问
auth_strategy = keystone //认证服务
my_ip = 192.168.11.24 //配置计算节点的管理接口的IP 地址
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver
//使能 Networking 服务
配置 “RabbitMQ” 消息队列访问:
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = 123456
配置认证服务访问:
[keystone_authtoken]
auth_url = 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 = 123456
配置VNC代理使用控制节点的管理接口IP地址 :
[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
完成安装
确定您的计算节点是否支持虚拟机的硬件加速。
$ egrep -c '(vmx|svm)' /proc/cpuinfo
如果这个命令返回了 one or greater 的值,那么你的计算节点支持硬件加速且不需要额外的配置。
如果这个命令返回了 zero 值,那么你的计算节点不支持硬件加速。你必须配置 libvirt 来使用 QEMU 去代替 KVM
在 /etc/nova/nova.conf 文件的 [libvirt] 区域做出如下的编辑:
[libvirt]
virt_type = qemu
启动计算服务及其依赖,并将其配置为随系统自动启动
# Systemctl enable libvirtd.service openstack-nova-compute.service
# systemctl start libvirtd.service openstack-nova-compute.service
验证操作(控制节点)
1、获得 admin 凭证来获取只有管理员能执行的命令的访问权限
bash admin.sh
2、列出服务组件,以验证是否成功启动并注册了每个进程
$ openstack compute service list
该输出应该显示三个服务组件在控制节点上启用,一个服务组件在计算节点上启用。
网络服务
概述及概念
OpenStack Networking(neutron),允许创建、插入接口设备,这些设备由其他的OpenStack服务管理。插件式的实现可以容纳不同的网络设备和软件,为OpenStack架构与部署提供了灵活性。
它包含下列组件:
neutron-server
接收和路由API请求到合适的OpenStack网络插件,以达到预想的目的。
OpenStack网络插件和代理
插拔端口,创建网络和子网,以及提供IP地址,这些插件和代理依赖于供应商和技术而不同,OpenStack网络基于插件和代理为Cisco 虚拟和物理交换机、NEC OpenFlow产品,Open vSwitch,Linux bridging以及VMware NSX 产品穿线搭桥。
常见的代理L3(3层),DHCP(动态主机IP地址),以及插件代理。
消息队列
大多数的OpenStack Networking安装都会用到,用于在neutron-server和各种各样的代理进程间路由信息。也为某些特定的插件扮演数据库的角色,以存储网络状态
OpenStack网络主要和OpenStack计算交互,以提供网络连接到它的实例。
OpenStack网络(neutron)管理OpenStack环境中所有虚拟网络基础设施(VNI),物理网络基础设施(PNI)的接入层。OpenStack网络允许租户创建包括像 firewall, :term:`load balancer(负载平衡)`和 :term:`virtual private network (VPN)`等这样的高级虚拟网络拓扑。
网络服务提供网络,子网以及路由这些对象的抽象概念。每个抽象概念都有自己的功能,可以模拟对应的物理设备:网络包括子网,路由在不同的子网和网络间进行路由转发。
对于任意一个给定的网络都必须包含至少一个外部网络。不想其他的网络那样,外部网络不仅仅是一个定义的虚拟网络。相反,它代表了一种OpenStack安装之外的能从物理的,外部的网络访问的视图。外部网络上的IP地址可供外部网络上的任意的物理设备所访问
外部网络之外,任何 Networking 设置拥有一个或多个内部网络。这些软件定义的网络直接连接到虚拟机。仅仅在给定网络上的虚拟机,或那些在通过接口连接到相近路由的子网上的虚拟机,能直接访问连接到那个网络上的虚拟机。
如果外部网络想要访问实例或者相反实例想要访问外部网络,那么网络之间的路由就是必要的了。每一个路由都配有一个网关用于连接到外部网络,以及一个或多个连接到内部网络的接口。就像一个物理路由一样,子网可以访问同一个路由上其他子网中的机器,并且机器也可以访问路由的网关访问外部网络。
另外,你可以将外部网络的IP地址分配给内部网络的端口。不管什么时候一旦有连接连接到子网,那个连接被称作端口。你可以给实例的端口分配外部网络的IP地址。通过这种方式,外部网络上的实体可以访问实例.
网络服务同样支持安全组。安全组允许管理员在安全组中定义防火墙规则。一个实例可以属于一个或多个安全组,网络为这个实例配置这些安全组中的规则,阻止或者开启端口,端口范围或者通信类型。
每一个Networking使用的插件都有其自有的概念。虽然对操作VNI和OpenStack环境不是至关重要的,但理解这些概念能帮助你设置Networking。所有的Networking安装使用了一个核心插件和一个安全组插件(或仅是空操作安全组插件)。另外,防火墙即服务(FWaaS)和负载均衡即服务(LBaaS)插件是可用的
二、安装并配置控制节点
1、先决条件
创建neutron数据库
$ mysql -u root -p
CREATE DATABASE neutron;
对``neutron`` 数据库授予合适的访问权限
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' \
IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'controller' \
IDENTIFIED BY '123456';
GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' \
IDENTIFIED BY '123456';
获得 admin 凭证来获取只有管理员能执行的命令的访问权限:
bash admin.sh
创建``neutron``用户:
$ openstack user create --domain default --password-prompt neutron
添加``admin`` 角色到``neutron`` 用户:
$ openstack role add --project service --user neutron admin
创建``neutron``服务实体:
$ openstack service create --name neutron \
--description "OpenStack Networking" network
创建网络服务API端点
$ openstack endpoint create --region RegionOne \
network public http://controller:9696
$ openstack endpoint create --region RegionOne \
network internal http://controller:9696
$ openstack endpoint create --region RegionOne \
network admin http://controller:9696
2:网络选项>私有网络
安装组件
# yum install openstack-neutron openstack-neutron-ml2 \
openstack-neutron-linuxbridge ebtables
配置服务组件
vim /etc/neutron/neutron.conf
配置数据库访问:
[database]
connection = mysql+pymysql://neutron:123456@controller/neutron //数据库密码
启用Modular Layer 2 (ML2)插件,路由服务和重叠的IP地址:
[DEFAULT]
core_plugin = ml2
service_plugins = router
allow_overlapping_ips = True
配置 “RabbitMQ” 消息队列的连接:
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = 123456 //RabbitMQ中为用户``openstack``的密码
配置认证服务访问:
[DEFAULT]
auth_strategy = keystone
[keystone_authtoken]
auth_url = 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 = 123456 //neutron 用户的密码
配置网络服务来通知计算节点的网络拓扑变化:
[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 = 123456 //身份认证服务中``nova`` 用户的密码
配置锁路径:
[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
配置 Modular Layer 2 (ML2) 插件
ML2插件使用Linuxbridge机制来为实例创建layer-2虚拟网络基础设施
vim /etc/neutron/plugins/ml2/ml2_conf.ini
启用flat,VLAN以及VXLAN网络:
[ml2]
type_drivers = flat,vlan,vxlan
启用VXLAN私有网络:
[ml2]
tenant_network_types = vxlan
启用Linuxbridge和layer-2机制:
[ml2]
mechanism_drivers = linuxbridge,l2population
启用端口安全扩展驱动:
[ml2]
extension_drivers = port_security
配置公共虚拟网络为flat网络
[ml2_type_flat]
flat_networks = provider
为私有网络配置VXLAN网络识别的网络范围:
[ml2_type_vxlan]
vni_ranges = 1:1000
启用 ipset 增加安全组规则的高效性:
[securitygroup]
enable_ipset = True
配置Linuxbridge代理
Linuxbridge代理为实例建立layer-2虚拟网络并且处理安全组规则。
vim /etc/neutron/plugins/ml2/linuxbridge_agent.ini
将公共虚拟网络和公共物理网络接口对应起来:
[linux_bridge]
physical_interface_mappings = provider:eno16777736 //底层的物理公共网络接口
启用VXLAN覆盖网络,配置覆盖网络的物理网络接口的IP地址,启用layer-2 population:
[vxlan]
enable_vxlan = True
local_ip = 192.168.11.86 //覆盖网络的物理网络接口的IP地址
l2_population = True
启用安全组并配置 Linuxbridge iptables firewall driver:
[securitygroup]
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
配置layer-3代理
Layer-3代理为私有虚拟网络提供路由和NAT服务
vim /etc/neutron/l3_agent.ini
配置Linuxbridge接口驱动和外部网络网桥:
[DEFAULT]
interface_driver=neutron.agent.linux.interface.BridgeInterfaceDriver
external_network_bridge = //选项特意设置成缺省值,这样就可以在一个代理上允许多种外部网络
配置DHCP代理
vim /etc/neutron/dhcp_agent.ini
配置Linuxbridge驱动接口,DHCP驱动并启用隔离元数据,这样在公共网络上的实例就可以通过网络来访问元数据
[DEFAULT]
interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver
dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq
enable_isolated_metadata = True
配置元数据代理
<Metadata agent>`负责提供配置信息
vim /etc/neutron/metadata_agent.ini
配置元数据主机以及共享密码:
[DEFAULT]
nova_metadata_ip = controller
metadata_proxy_shared_secret = 123456 //为元数据代理设置的密码
为计算节点配置网络服务
vim /etc/nova/nova.conf
配置访问参数,启用元数据代理并设置密码:
[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 = 123456 //neutron用户密码
service_metadata_proxy = True
metadata_proxy_shared_secret = 123456 //元数据代理密码
完成安装
创建软连接/etc/neutron/plugin.ini``指向ML2插件配置文件/etc/neutron/plugins/ml2/ml2_conf.ini
ln -s /etc/neutron/plugins/ml2/ml2_conf.ini /etc/neutron/plugin.ini
同步数据库
# 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
当系统启动时,启动 Networking 服务并配置它启动。
# 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,同样启用layer-3服务并设置其随系统自启动
# systemctl enable neutron-l3-agent.service
# systemctl start neutron-l3-agent.service
三、安装和配置计算节点
1、安装组件
yum install openstack-neutron-linuxbridge ebtables ipset
配置通用组件
vim /etc/neutron/neutron.conf
在``[database]`` 部分,注释所有``connection`` 项,因为计算节点不直接访问数据库。
配置 “RabbitMQ” 消息队列的连接:
[DEFAULT]
rpc_backend = rabbit
[oslo_messaging_rabbit]
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = 123456 //RabbitMQ中``openstack用户的密码
配置认证服务访问:
[DEFAULT]
auth_strategy = keystone
[keystone_authtoken]
auth_url = 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 = 123456
配置锁路径:
[oslo_concurrency]
lock_path = /var/lib/neutron/tmp
网络选项
配置Linuxbridge代理
vim /etc/neutron/plugins/ml2/linuxbridge_agent.ini
将公共虚拟网络和公共物理网络接口对应起来:
[linux_bridge]
physical_interface_mappings = provider:eno16777736
启用VXLAN覆盖网络,配置覆盖网络的物理网络接口的IP地址,启用layer-2 population:
[vxlan]
enable_vxlan = True
local_ip = 192.168.11.24
l2_population = True
启用安全组并配置 Linuxbridge iptables firewall driver:
[securitygroup]
enable_security_group = True
firewall_driver = neutron.agent.linux.iptables_firewall.IptablesFirewallDriver
4、为计算节点配置网络服务
vim /etc/nova/nova.conf
[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 = 123456
5、完成安装
重启计算服务:
# systemctl restart openstack-nova-compute.service
启动Linuxbridge代理并配置它开机自启动:
# systemctl enable neutron-linuxbridge-agent.service
# systemctl start neutron-linuxbridge-agent.service
验证操作
在控制节点上执行
获得 admin 凭证来获取只有管理员能执行的命令的访问权限:
$ bash admin-openrc
列出加载的扩展来验证``neutron-server``进程是否正常启动:
$ neutron ext-list
列出代理以验证启动 neutron 代理是否成功:
$ neutron agent-list
如果上面列表中有未启动的成功的,可以先查看:
[root@controller ~]# systemctl | grep neutron
启动服务后在查看
[root@controller ~]# systemctl restart neutron-l3-agent.service
[root@controller ~]# systemctl | grep neutron
Dashboard仪表盘
Dashboard(horizon)是一个web接口,使得云平台管理员以及用户可以管理不同的Openstack资源以及服务。这个部署示例使用的是 Apache Web 服务器。
一、安装配置
1、安装软件包:
# yum install openstack-dashboard
2、编辑配置文件
vim /etc/openstack-dashboard/local_settings
在 controller 节点上配置仪表盘以使用 OpenStack 服务:
OPENSTACK_HOST = "controller" //修改
允许所有主机访问仪表板:
ALLOWED_HOSTS = ['*', ] //修改
配置 memcached 会话存储服务:
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': 'controller:11211',
}
}
启用第3版认证API:
OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST
启用对域的支持
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
配置API版本:
OPENSTACK_API_VERSIONS = {
"identity": 3,
"image": 2,
"volume": 2,
}
通过仪表盘创建用户时的默认域配置为 default :
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "default"
通过仪表盘创建的用户默认角色配置为 user :
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
如果您选择网络参数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 = "+8:00"
3、重启web服务器以及会话存储服务:
# systemctl restart httpd.service memcached.service
二、验证操作
在浏览器中输入控制节点IP, http://192.168.11.86/dashboard访问仪表盘。
http://10.211.55.17/dashboard/auth/login/?next=/dashboard/
验证使用 admin 或者``demo``用户凭证和``default``域凭证。
块存储Cinder
一、概览
OpenStack块存储服务(cinder)为虚拟机添加持久的存储,块存储提供一个基础设施为了管理卷,以及和OpenStack计算服务交互,为实例提供卷。此服务也会激活管理卷的快照和卷类型的功能。
块存储服务通常包含下列组件:
cinder-api
接受API请求,并将其路由到``cinder-volume``执行。
cinder-volume
与块存储服务和例如``cinder-scheduler``的进程进行直接交互。它也可以与这些进程通过一个消息队列进行交互。``cinder-volume``服务响应送到块存储服务的读写请求来维持状态。它也可以和多种存储提供者在驱动架构下进行交互。
cinder-scheduler守护进程
选择最优存储提供节点来创建卷。其与``nova-scheduler``组件类似。
cinder-backup daemon
``cinder-backup``服务提供任何种类备份卷到一个备份存储提供者。就像``cinder-volume``服务,它与多种存储提供者在驱动架构下进行交互。
消息队列
在块存储的进程之间路由信息。
安装并配置控制节点
先决条件
创建cinder数据库
$ mysql -u root -p
mysql> CREATE DATABASE cinder;
给予 cinder 数据库合适的访问权限
mysql> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'localhost' \
IDENTIFIED BY '123456';
mysql> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'controller' \
IDENTIFIED BY '123456';
mysql> GRANT ALL PRIVILEGES ON cinder.* TO 'cinder'@'%' \
IDENTIFIED BY '123456';
获得 admin 凭证来获取只有管理员能执行的命令的访问权限:
$ bash admin.sh
创建一个 cinder 用户:
$ openstack user create --domain default --password-prompt cinder
添加 admin 角色到 cinder 用户上。
$ openstack role add --project service --user cinder admin
创建 cinder 和 cinderv2 服务实体:
$ openstack service create --name cinder \
--description "OpenStack Block Storage" volume
$ openstack service create --name cinderv2 \
--description "OpenStack Block Storage" volumev2
注解
块设备存储服务要求两个服务实体
创建块设备存储服务的 API 入口点:
$ openstack endpoint create --region RegionOne volume public http://controller:8776/v1/%\(tenant_id\)s
$ openstack endpoint create --region RegionOne volume internal http://controller:8776/v1/%\(tenant_id\)s
$ openstack endpoint create --region RegionOne \
volume admin http://controller:8776/v1/%\(tenant_id\)s
$ openstack endpoint create --region RegionOne \
volumev2 public http://controller:8776/v2/%\(tenant_id\)s
$ openstack endpoint create --region RegionOne volumev2 internal http://controller:8776/v2/%\(tenant_id\)s
$ openstack endpoint create --region RegionOne \
volumev2 admin http://controller:8776/v2/%\(tenant_id\)s
安全并配置组件
安装软件包:
# yum install openstack-cinder
编辑 配置文件
vim /etc/cinder/cinder.conf
[DEFAULT]
...
rpc_backend = rabbit
auth_strategy = keystone
my_ip = 192.168.11.86
[database]
...
connection = mysql+pymysql://cinder:123456@controller/cinder
[oslo_messaging_rabbit]
...
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = 123456
[keystone_authtoken]
...
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = cinder
password = 123456
[oslo_concurrency]
...
lock_path = /var/lib/cinder/tmp
初始化块设备服务的数据库:
# su -s /bin/sh -c "cinder-manage db sync" cinder
3、配置计算节点以使用块设备存储
编辑配置文件并添加如下到其中:
vim /etc/nova/nova.conf
[cinder]
os_region_name = RegionOne
重启计算API 服务:
# systemctl restart openstack-nova-api.service
4、完成安装
启动块设备存储服务,并将其配置为开机自启:
# systemctl enable openstack-cinder-api.service openstack-cinder-scheduler.service
# systemctl start openstack-cinder-api.service openstack-cinder-scheduler.service
安装并配置一个存储节点
先决条件
装支持的工具包:
安装 LVM 包:
# yum install lvm2
启动LVM的metadata服务并且设置该服务随系统启动:
# systemctl enable lvm2-lvmetad.service
# systemctl start lvm2-lvmetad.service
创建LVM 物理卷 /dev/sdb /dev/sdc:
# pvcreate /dev/sdb /dev/sdc
Physical volume "/dev/sdb" successfully created
Physical volume "/dev/sdc" successfully created
创建 LVM 卷组 cinder-volumes:
# vgcreate cinder-volumes /dev/sdb /dev/sdc
Volume group "cinder-volumes" successfully created
编辑配置文件
vim /etc/lvm/lvm.conf
在``devices``部分,添加一个过滤器,接受``/dev/sdb /dev/sdc``设备,拒绝其他所有设备:
devices {
...
filter = [ "a/sdb/", "a/sdc/", "r/.*/"] //添加
}
每个过滤器组中的元素都以``a``开头,即为 accept,或以 r 开头,即为**reject**,并且包括一个设备名称的正则表达式规则。过滤器组必须以``r/.*/``结束,过滤所有保留设备。您可以使用 :命令:`vgs -vvvv` 来测试过滤器。
安全并配置组件
安装软件包
# yum install openstack-cinder targetcli python-keystone
编辑配置文件
vim /etc/cinder/cinder.conf
[DEFAULT]
...
rpc_backend = rabbit
auth_strategy = keystone
my_ip = 192.16811.86
enabled_backends = lvm
glance_api_servers = http://controller:9292
[database]
...
connection = mysql+pymysql://cinder:123456@controller/cinder
[oslo_messaging_rabbit]
...
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = 123456
[keystone_authtoken]
...
auth_uri = http://controller:5000
auth_url = http://controller:35357
memcached_servers = controller:11211
auth_type = password
project_domain_name = default
user_domain_name = default
project_name = service
username = cinder
password = 123456
[lvm]
...
volume_driver = cinder.volume.drivers.lvm.LVMVolumeDriver
volume_group = cinder-volumes
iscsi_protocol = iscsi
iscsi_helper = lioadm
[oslo_concurrency]
...
lock_path = /var/lib/cinder/tmp
3、完成安装
启动块存储卷服务及其依赖的服务,并将其配置为随系统启动:
systemctl enable openstack-cinder-volume.service target.service
systemctl start openstack-cinder-volume.service target.service
验证操作
获得 admin 凭证来获取只有管理员能执行的命令的访问权限:
$ bash Admin.sh
列出服务组件以验证是否每个进程都成功启动:
$ cinder service-list
启动一个实例
创建虚拟网络
1、提供者网络
在启动实例之前,您必须创建必须的虚拟机网络设施。对于网络选项1,实例使用提供者(外部)网络,提供者网络通过L2(桥/交换机)设备连接到物理网络。这个网络包括为实例提供IP地址的DHCP服务器。“admin”或者其他权限用户必须创建这个网络,因为它直接连接到物理网络设施。
在控制节点上,加载 admin 凭证来获取管理员能执行的命令访问权限:
$ bash admin.sh
创建网络:
neutron net-create --shared --provider:physical_network provider \
--provider:network_type flat provider
在网络上创建一个子网:
公共网络192.168.11.0/24的网关为192.168.11.254。DHCP服务为每个实例分配IP,IP从192.168.11.130 到 192.168.11.170。所有实例的DNS使用8.8.4.4。
neutron subnet-create --name provider \
--allocation-pool start=10.211.55.130,end=10.211.55.170 \
--dns-nameserver 8.8.4.4 --gateway 10.211.55.1 \
provider 10.211.55.0/24
自服务网络
在控制节点上,获得 admin 凭证来获取只有管理员能执行的命令的访问权限:
$ bash admin.sh
创建网络:
$ neutron net-create selfservice
创建一个子网
自服务网络使用172.16.1.0/24 网关172.16.1.1。DHCP服务负责为每个实例从172.16.1.2 到172.16.1.254中分配IP地址。所有实例使用8.8.4.4作为DNS。
neutron subnet-create --name selfservice \
--dns-nameserver 8.8.4.4 --gateway 172.16.1.1 \
selfservice 172.16.1.0/24
3、创建路由
在控制节点上,加载 admin 凭证来获取管理员能执行的命令访问权限:
$ bash Admin.sh
添加 router:external 到 provider 网络
$ neutron net-update provider --router:external
Updated network: provider
加载 demo 证书获得用户能执行的命令访问权限:
$ bash demo.sh 如果此项无法创建,则改用admin.sh加载证书
创建路由:
$ openstack router create router
给路由器添加一个私网子网的接口:
$ neutron router-interface-add router selfservice
Added interface bff6605d-824c-41f9-b744-21d128fc86e1 to router router.
给路由器设置公有网络的网关:
$ neutron router-gateway-set router provider
Set gateway for router router
3、验证操作
我们推荐您在操作之前,确认并修复问题。以下步骤将使用网络和子网创建示例中的IP地址。
在控制节点上,加载 admin 凭证来获取管理员能执行的命令访问权限:
$ bash admin.sh
列出网络命名空间。你应该可以看到一个 qrouter 命名空间和两个qdhcp 命名空间
$ ip netns
qrouter-89dd2083-a160-4d75-ab3a-14239f01ea0b
qdhcp-7c6f9b37-76b4-463e-98d8-27e5686ed083
qdhcp-0e62efcd-8cee-46c7-b163-d8df05c3c5ad
列出路由器上的端口来确定公网网关的IP 地址:
$ neutron router-port-list router
从控制节点或任意公共物理网络上的节点Ping这个IP地址:
$ ping -c 4 192.168.11.132
PING 203.0.113.102 (203.0.113.102) 56(84) bytes of data.
64 bytes from 203.0.113.102: icmp_req=1 ttl=64 time=0.619 ms
64 bytes from 203.0.113.102: icmp_req=2 ttl=64 time=0.189 ms
64 bytes from 203.0.113.102: icmp_req=3 ttl=64 time=0.165 ms
64 bytes from 203.0.113.102: icmp_req=4 ttl=64 time=0.216 ms
二、创建m1.nano类型
默认的最小规格的主机需要512 MB内存。对于环境中计算节点内存不足4 GB的,我们推荐创建只需要64 MB的``m1.nano``规格的主机。若单纯为了测试的目的,请使用``m1.nano``规格的主机来加载CirrOS镜像
$ openstack flavor create --id 0 --vcpus 1 --ram 64 --disk 1 m1.nano
三、生成一个键值对
大部分云镜像支持 :term:`public key authentication`而不是传统的密码登陆。在启动实例前,你必须添加一个公共密钥到计算服务。
导入admin项目凭证
$ bash admin.sh
生成和添加秘钥对:
$ ssh-keygen -q -N ""
$ openstack keypair create --public-key ~/.ssh/id_rsa.pub mykey
验证公钥的添加:
$ openstack keypair list
四、增加安全组规则
默认情况下, ``default``安全组适用于所有实例并且包括拒绝远程访问实例的防火墙规则。对诸如CirrOS这样的Linux镜像,我们推荐至少允许ICMP (ping) 和安全shell(SSH)规则。
添加规则到 default 安全组。
Permit ICMP (ping):
$ openstack security group rule create --proto icmp default
允许安全 shell (SSH) 的访问:
$ openstack security group rule create --proto tcp --dst-port 22 default
启动一个实例(共有网络)
1、获取权限
在控制节点上,获得 admin 凭证来获取只有管理员能执行的命令的访问权限:
bash admin.sh
2、列出可用类型
$ openstack flavor list
3、列出可用镜像
$ openstack image list
这个实例使用``cirros``镜像。
4、列出可用网络
$ openstack network list
这个实例使用 ``provider``公有网络。 你必须使用ID而不是名称才可以使用这个网络。
注解:如果你选择选项2,输出信息应该也包含私网``selfservice``的信息。
5、列出可用的安全组
$ openstack security group list
6、启动云主机
启动实例:
使用``provider``公有网络的ID替换``PUBLIC_NET_ID``。
注解
如果你选择选项1并且你的环境只有一个网络,你可以省去``–nic`` 选项因为OpenStack会自动选择这个唯一可用的网络。
$ openstack server create --flavor m1.nano --image cirros \
--nic net-id=PROVIDER_NET_ID --security-group default \
--key-name mykey provider-instance
7、检查实例的状态
$ openstack server list
8、使用虚拟控制台访问实例
获取你势力的 Virtual Network Computing (VNC) 会话URL并从web浏览器访问它:
$ openstack console url show provider-instance
注解:如果你运行浏览器的主机无法解析``controller`` 主机名,你可以将 ``controller``替换为你控制节点管理网络的IP地址。
9、验证
能否ping通公有网络的网关:
验证能否连接到互联网
验证控制节点或者其他公有网络上的主机能否ping通实例
在控制节点或其他公有网络上的主机使用 SSH远程访问实例:
$ ssh cirros@192.168.11.86
启动一个实例(私有网络)
1、确定实例选项
启动一台实例,您必须至少指定一个类型、镜像名称、网络、安全组、密钥和实例名称。
在控制节点上,获得 admin 凭证来获取只有管理员能执行的命令的访问权限:
$ bash admin.sh
一个实例指定了虚拟机资源的大致分配,包括处理器、内存和存储。
2、列出可用类型
$ openstack flavor list
3、列出可用镜像
$ openstack image list
这个实例使用``cirros``镜像。
4、列出可用网络
$ openstack network list
这个实例使用 ``provider``公有网络。 你必须使用ID而不是名称才可以使用这个网络。
注解:如果你选择选项2,输出信息应该也包含私网``selfservice``的信息。
5、列出可用的安全组
$ openstack security group list
6、启动实例
使用``selfservice ``网络的ID替换``SELFSERVICE_NET_ID ``。
$ openstack server create --flavor m1.nano --image cirros \
--nic net-id=SELFSERVICE_NET_ID --security-group default \
--key-name mykey selfservice-instance
7、检查实例的状态
$ openstack server list
8、使用虚拟控制台访问实例
获取你势力的 Virtual Network Computing (VNC) 会话URL并从web浏览器访问它:
$ openstack console url show selfservice-instance
注解:如果你运行浏览器的主机无法解析``controller`` 主机名,你可以将 ``controller``替换为你控制节点管理网络的IP地址。
能否ping通私有网络的网关:
验证能否连接到互联网
9、 验证能否远程访问实例
在公有网络上创建浮动IP地址池:
$ openstack floating ip create provider
为实例分配浮动IP:
$ openstack server add floating ip selfservice-instance 192.168.11.133
检查这个浮动 IP 地址的状态:
$ openstack server list
验证控制节点或者其他公有网络上的主机通过浮动IP地址ping通实例
在控制节点或其他公有网络上的主机使用 SSH远程访问实例:
$ ssh cirros@192.168.11.134
块设备存储
1、新建卷
加载 admin证书,作为非管理员项目执行下面的步骤:
$ bash admin.sh
创建一个 1 GB 的卷:
$ openstack volume create --size 1 volume1
过会,卷状态应该从``creating`` 变成``available``:
$ openstack volume list
2、附加卷到一个实例上
附加卷到一个实例上:
$ openstack server add volume INSTANCE_NAME VOLUME_NAME
使用实例名称替换 INSTANCE_NAME 并使用你想要附加卷的名称替换``VOLUME_NAME ``。
附加 volume1 ``卷到 ``provider-instance 云主机:
$ openstack server add volume provider-instance volume1
列出卷:
$ openstack volume list
使用SSH方式访问你的实力,并使用``fdisk`` 命令验证`/dev/vdb`块存储设备作为卷存在。
$ sudo fdisk -l
Disk /dev/vda: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders, total 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Device Boot Start End Blocks Id System
/dev/vda1 * 16065 2088449 1036192+ 83 Linux
Disk /dev/vdb: 1073 MB, 1073741824 bytes
16 heads, 63 sectors/track, 2080 cylinders, total 2097152 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/vdb doesn't contain a valid partition table
注解:你必须在设备上创建文件系统并挂载它,才能使用这个卷。