一、nova介绍:
Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源。OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的。
用途与功能 :
1) 实例生命周期管理
2) 管理计算资源
3) 网络和认证管理
4)REST 风格的 API
5) 异步的一致性通信
6)Hypervisor 透明:支持Xen,XenServer/XCP,KVM, UML, VMware vSphere and Hyper-V
在上图中可以看到,Nova 处于 Openstak 架构的中心,其他组件都为 Nova 提供支持: Glance 为 VM 提供 image Cinder 和 Swift 分别为 VM 提供块存储和对象存储 Neutron 为 VM 提供网络连接。
二. Nova 架构
Nova 的架构比较复杂,包含很多组件。 这些组件以子服务(后台 deamon 进程)的形式运行,可以分为以下几类:
1.API
nova-api
是整个 Nova 组件的门户,接收和响应客户的 API 调用。所有对 Nova 的请求都首先由 nova-api 处理。nova-api 向外界暴露若干 HTTP REST API 接口 在 keystone 中我们可以查询 nova-api 的 endponits。
客户端就可以将请求发送到 endponits 指定的地址,向 nova-api 请求操作。 当然,作为最终用户的我们不会直接发送 Rest AP I请求。 OpenStack CLI,Dashboard 和其他需要跟 Nova 交换的组件会使用这些 API。
Nova-api 对接收到的 HTTP API 请求会做如下处理:
1. 检查客户端传入的参数是否合法有效
2. 调用 Nova 其他子服务的处理客户端 HTTP 请求
3. 格式化 Nova 其他子服务返回的结果并返回给客户端
nova-api 接收哪些请求?
简单的说,只要是跟虚拟机生命周期相关的操作,nova-api 都可以响应。 大部分操作都可以在 Dashboard 上找到。打开Instance管理界面
除了提供 OpenStack 自己的API,nova-api 还支持 Amazon EC2 API。 也就是说,如果客户以前使用 Amazon EC2,并且用 EC2 的 API 开发了些工具来管理虚机,那么如果现在要换成 OpenStack,这些工具可以无缝迁移到 OpenStack,因为 nova-api 兼容 EC2 API,无需做任何修改。
2.Compute Core
1.nova-scheduler:
虚机调度服务,负责决定在哪个计算节点上运行虚机。创建 Instance 时,用户会提出资源需求,例如 CPU、内存、磁盘各需要多少。OpenStack 将这些需求定义在 flavor 中,用户只需要指定用哪个 flavor 就可以了。
可用的 flavor 在 System->Flavors 中管理。
下面介绍 nova-scheduler 是如何实现调度的。在 /etc/nova/nova.conf 中,nova 通过 driver=filter_scheduler 这个参数来配置 nova-scheduler。
driver=filter_scheduler
1
1
driver=filter_scheduler
Filter scheduler
Filter scheduler 是 nova-scheduler 默认的调度器,调度过程分为两步:
1. 通过过滤器(filter)选择满足条件的计算节点(运行 nova-compute)
2. 通过权重计算(weighting)选择在最优(权重值最大)的计算节点上创建 Instance。
Nova 允许使用第三方 scheduler,配置 scheduler_driver 即可。 这又一次体现了OpenStack的开放性。Scheduler 可以使用多个 filter 依次进行过滤,过滤之后的节点再通过计算权重选出最适合的节点。
2.nova-compute:
nova-compute 是管理虚机的核心服务,在计算节点上运行。通过调用Hypervisor API实现节点上的 instance的生命周期管理。 OpenStack 对 instance 的操作,最后都是交给 nova-compute 来完成的。 nova-compute 与 Hypervisor 一起实现 OpenStack 对 instance 生命周期的管理。
通过Drive1r架构支持多种Hypervisor
Hyp
ervisor是计算节点上跑的虚拟化管理程序,虚机管理最底层的程序。 不同虚拟化技术提供自己的 Hypervisor。 常用的 Hypervisor 有 KVM,Xen, VMWare 等。nova-compute 为这些 Hypervisor 定义了统一的接口,Hypervisor 只需要实现这些接口,就可以 Driver 的形式即插即用到 OpenStack 系统中。 下面是Nova Driver的架构示意图:
前面大家已经看到 Nova 由很多子服务组成,我们也知道 OpenStack 是一个分布式系统,可以部署到若干节点上,那么接下来大家可能就会问:Nova 的这些服务在物理上应该如何部署呢?
对于 Nova,这些服务会部署在两类节点上:计算节点和控制节点。
计算节点上安装了 Hypervisor,上面运行虚拟机。 由此可知:
1. 只有 nova-compute 需要放在计算节点上。
2. 其他子服务则是放在控制节点上的。
下面我们可以看看实验环境的具体部署情况。 通过在计算节点和控制节点上运行
ps -elf | grep nova 来查看运行的 nova 子服务
计算节点compute只运行了nova-compute子服务
来源: http://learn.yunwei.edu/openstack-learn/nova.html
3.nova—conductor
nova-compute 经常需要更新数据库,比如更新和获取虚机的状态。 出于安全性和伸缩性的考虑,nova-compute 并不会直接访问数据库,而是将这个任务委托给 nova-conductor。3.Console Interface
nova-console: 用户可以通过多种方式访问虚机的控制台:
nova-novncproxy: 基于 Web 浏览器的 VNC 访问
nova-spicehtml5proxy: 基于 HTML5 浏览器的 SPICE 访问
nova-xvpnvncproxy: 基于 Java 客户端的 VNC 访问
nova-consoleauth: 负责对访问虚机控制台请求提供 Token 认证
nova-cert: 提供 x509 证书支持
4.Database
Nova 会有一些数据需要存放到数据库中,一般使用 MySQL。数据库安装在控制节点上。 Nova 使用命名为 “nova” 的数据库。
5.Message Queue
在前面我们了解到 Nova 包含众多的子服务,这些子服务之间需要相互协调和通信。为解耦各个子服务,Nova 通过 Message Queue 作为子服务的信息中转站。 所以在架构图上我们看到了子服务之间没有直接的连线,是通过 Message Queue 联系的。
三.Nova 组件如何协同工作
1.Nova 物理部署方案
前面大家已经看到 Nova 由很多子服务组成,我们也知道 OpenStack 是一个分布式系统,可以部署到若干节点上,那么接下来大家可能就会问:Nova 的这些服务在物理上应该如何部署呢?
对于 Nova,这些服务会部署在两类节点上:计算节点和控制节点。
计算节点上安装了 Hypervisor,上面运行虚拟机。 由此可知:
1. 只有 nova-compute 需要放在计算节点上。
2. 其他子服务则是放在控制节点上的。
下面我们可以看看实验环境的具体部署情况。 通过在计算节点和控制节点上运行
ps -elf | grep nova 来查看运行的 nova 子服务
计算节点compute只运行了nova-compute子服务
控制节点controller运行了若干nova-*子服务
RabbitMQ 和 MySQL 也是放在控制节点上的。可能细心的同学已经发现我们的控制节点上也运行了 nova-compute。 这实际上也就意味着 devstack-controller 既是一个控制节点,同时也是一个计算节点,也可以在上面运行虚机
这也向我们展示了 OpenStack 这种分布式架构部署上的灵活性: 可以将所有服务都放在一台物理机上,作为一个 All-in-One 的测试环境; 也可以将服务部署在多台物理机上,获得更好的性能和高可用。
另外,也可以用 nova service-list 查看 nova-* 子服务都分布在哪些节点上
2.从虚机创建流程看 nova-* 子服务如何协同工作
- 客户(可以是 OpenStack 最终用户,也可以是其他程序)向 API(nova-api)发送请求:“帮我创建一个虚机”
- API 对请求做一些必要处理后,向 Messaging(RabbitMQ)发送了一条消息:“让 Scheduler 创建一个虚机”
- Scheduler(nova-scheduler)从 Messaging 获取到 API 发给它的消息,然后执行调度算法,从若干计算节点中选出节点 A
- Scheduler 向 Messaging 发送了一条消息:“在计算节点 A 上创建这个虚机”
- 计算节点 A 的 Compute(nova-compute)从 Messaging 中获取到 Scheduler 发给它的消息,然后在本节点的 Hypervisor 上启动虚机。
- 在虚机创建的过程中,Compute 如果需要查询或更新数据库信息,会通过 Messaging 向 Conductor(nova-conductor)发送消息,Conductor 负责数据库访问。
四.Nova的配置文件
[DEFAULT]
my_ip=172.16.254.63
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver
enabled_apis=osapi_compute,metadata
[api]
auth_strategy = keystone
[api_database]
connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova_api
[barbican]
[cache]
[cells]
[cinder]
os_region_name = RegionOne
[cloudpipe]
[conductor]
[console]
[consoleauth]
[cors]
[cors.subdomain]
[crypto]
[database]
connection = mysql+pymysql://nova:NOVA_DBPASS@controller/nova
[ephemeral_storage_encryption]
[filter_scheduler]
[glance]
api_servers = http://controller:9292
[guestfs]
[healthcheck]
[hyperv]
[image_file_url]
[ironic]
[key_manager]
[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
[libvirt]
virt_type=qemu
[matchmaker_redis]
[metrics]
[mks]
[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
service_metadata_proxy = true
metadata_proxy_shared_secret = METADATA_SECRET
[notifications]
[osapi_v21]
[oslo_concurrency]
lock_path=/var/lib/nova/tmp
[oslo_messaging_amqp]
[oslo_messaging_kafka]
[oslo_messaging_notifications]
[oslo_messaging_rabbit]
[oslo_messaging_zmq]
[oslo_middleware]
[oslo_policy]
[pci]
[placement]
os_region_name = RegionOne
auth_type = password
auth_url = http://controller:35357/v3
project_name = service
project_domain_name = Default
username = placement
password = placement
user_domain_name = Default
[quota]
[rdp]
[remote_debug]
[scheduler]
[serial_console]
[service_user]
[spice]
[ssl]
[trusted_computing]
[upgrade_levels]
[vendordata_dynamic_auth]
[vmware]
[vnc]
enabled=true
vncserver_listen=$my_ip
vncserver_proxyclient_address=$my_ip
novncproxy_base_url = http://172.16.254.63:6080/vnc_auto.html
[workarounds]
[wsgi]
[xenserver]
[xvp]
五.Nova服务的搭建
1.建立Nova数据库
mysql -u root -p
MariaDB [(none)]> CREATE DATABASE nova_api; # 建立nova_api库
MariaDB [(none)]> CREATE DATABASE nova; #建立Nova数据库
MariaDB [(none)]> CREATE DATABASE nova_cell0; # 建立安全认证的库
#用Nova库宣告权限
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' \
IDENTIFIED BY 'NOVA_DBPASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' \IDENTIFIED BY 'NOVA_DBPASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' \IDENTIFIED BY 'NOVA_DBPASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \IDENTIFIED BY 'NOVA_DBPASS';MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' \IDENTIFIED BY 'NOVA_DBPASS';
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' \IDENTIFIED BY 'NOVA_DBPASS';
x
1
mysql -u root -p
2
MariaDB [(none)]> CREATE DATABASE nova_api; # 建立nova_api库
3
MariaDB [(none)]> CREATE DATABASE nova; #建立Nova数据库
4
MariaDB [(none)]> CREATE DATABASE nova_cell0; # 建立安全认证的库
5
#用Nova库宣告权限
6
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' \
7
IDENTIFIED BY 'NOVA_DBPASS';
8
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' \
9
IDENTIFIED BY 'NOVA_DBPASS';
10
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' \
11
IDENTIFIED BY 'NOVA_DBPASS';
12
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \
13
IDENTIFIED BY 'NOVA_DBPASS';
14
15
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' \
16
IDENTIFIED BY 'NOVA_DBPASS';
17
MariaDB [(none)]> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' \
18
IDENTIFIED BY 'NOVA_DBPASS';
2.宣告环境变量
source openrc
3. 创建Nova用户
openstack user create --domain default --password-prompt nova
4.添加管理员为Nova数据库
openstack role add --project service --user nova admin
5.建立Nova的服务
openstack service create --name nova \--description "OpenStack Compute" compute
1
openstack service create --name nova \
2
--description "OpenStack Compute" compute
检查服务列表
openstack service list
6. 建立Nova的服务端点
openstack endpoint create --region RegionOne \
compute public http://controller:8774/v2.1
openstack endpoint create --region RegionOne \
compute internal http://controller:8774/v2.1
openstack endpoint create --region RegionOne \
compute admin http://controller:8774/v2.1
注意:controller 替换成本机的主机名
7.建立user为placement的普通用户
openstack user create --domain default --password-prompt placement
8 把placement 也设为user 的管理员
openstack role add --project service --user placement admin
9, 建立api 服务
openstack service create --name placement --description "Placement API" placement
10.宣告placement 的服务端点
openstack endpoint create --region RegionOne placement public http://controller:8778
openstack endpoint create --region RegionOne placement internal http://controller:8778
openstack endpoint create --region RegionOne placement admin http://controller:8778
11.安装服务
yum install openstack-nova-api openstack-nova-conductor \ openstack-nova-console openstack-nova-novncproxy \ openstack-nova-scheduler openstack-nova-placement-api
12 编辑/etc/nova/nova.conf 配置文件
建议 mv nova.conf nova.conf.bak 然后可以直接复制Nova的配置文件
vim noca.conf 加入Nova的配置文件 (详情四)
注意 my_ip 更改为自己的IP
末行模式:%s/controller/yun/g
其中一些内容的含义:
use_neutron = ture 是否使用网络
firewall_dirver 防火墙的驱动
enabled-apis 是否打开apis
transport_url rabbitmq的地址
[api]
auth_strategy = keystone 验证方式
[api_database]
nova_api的数据库的地址
[cinder]
处在哪一个region(域),负责后端存储的
[database]
nova的数据库的地址
[glance]
api的地址
[keystone_authtoken]
认证的地址
memcached_servers缓存服务
auth_type = password验证类型=密码
project_domain_name = default 项目的名字
user_domain_name = default用户所在的域
project_name = service 项目名称
[libvirt]
virt_type=qemu 后台调用的虚拟化(使用kvm做的写qemu,也可能用kvm)
[neutron]
service_metadata_proxy = true 是否开启metadata源数据代理
metadata_proxy_shared_secret = METADATA_SECRET 数据代理验证的密码
[vnc]
vncserver_listen=$my_ip 监听的地址
vncserver_proxyclient_address=$my_ip 客户端的监听地址
novncproxy_base_url = http://192.168.124.128:6080/vnc_auto.html 提供的服务地址
编辑http服务的配置文件
vim /etc/httpd/conf.d/00-nova-placement-api.conf
添加
<Directory /usr/bin>
<IfVersion >= 2.4>
Require all granted
</IfVersion>
<IfVersion < 2.4>
Order allow,deny
Allow from all
</IfVersion>
</Directory>
重启http服务
systemctl restart httpd
同步nova数据库
su -s /bin/sh -c "nova-manage api_db sync" nova
会弹出一些内容,是正常情况
su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
su -s /bin/sh -c "nova-manage db sync" nova
查看一下验证的名字
nova-manage cell_v2 list_cells
启动开机自启
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
查看状态
systemctl status openstack-nova-api.service \
openstack-nova-consoleauth.service openstack-nova-scheduler.service \
openstack-nova-conductor.service openstack-nova-novncproxy.service
如果状态出现 则查看一下nova服务的运行情况 nova service-list 我们看到状态是down,说明服务没起来 查看日志 cd /var/log/nova/ vim nova-consoleauth.log 进去后看最后一条日志,发现ERROR和AMQPLAIN两个关键词 查看AMQ相关 rabbitmqctl list_users 发现rabbitmq里边openstack用户没有了 重新添加用户 rabbitmqctl add_user openstack admin rabbitmqctl set_permissions openstack ".*" ".*" ".*" rabbitmqctl set_user_tags openstack administrator 重启服务 systemctl restart openstack-nova-api.service \ openstack-nova-consoleauth.service openstack-nova-scheduler.service \ openstack-nova-conductor.service openstack-nova-novncproxy.service |
再查看一下状态
nova service-list
如果没有启动失败的情况则继续下边的步骤
安装openstack-nova-compute服务
yum install openstack-nova-compute
安装的时候会提示缺少y依赖
这时我们解压家目录的压缩包openstack_app.tar.gz
cd openstack-ocata
cd openstack-compute-yilai/
本地安装
yum localinstall -y *
这时我们再安装openstack-nova-compute服务
yum install openstack-nova-compute
配置计算节点的配置文件
因为本次配置,计算节点与控制节点在同一台虚拟机上
所以将不同于控制节点的计算节点的内容添加到控制节点的配置文件即可
[libvirt]
virt_type=qemu
要先打开libvirtd服务然后再启动nova-conpute服务
systemctl enable libvirtd.service openstack-nova-compute.service
systemctl start libvirtd.service openstack-nova-compute.service
计算节点只需要启动这两个服务
再查看一下服务列示
nova service-list
用openstack命令查看计算节点服务(与nova service-list作用相同)
openstack compute service list
查看一下nova用的hypervisor的类型
openstack hypervisor list
可以看到类型是qemu,运行在192.168.124.128的节点上,状态是开启的
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
来自为知笔记(Wiz)