简介
nova 是 openstack 最早的组件之一,nova 分为控制节点和计算节点,计算节点通过 nova computer 进行虚拟机创建,通过 libvirt 调用 kvm 创建虚拟机,nova 之间通信通过 rabbitMQ 队列进行通信,其组件和功能如下:
API:负责接收和响应外部请求。监听端口为 8774、8775、6080;
Scheduler:负责调度虚拟机所在的物理机。
Conductor:计算节点访问数据库的中间件。当计算节点创建好虚拟机后,会把虚拟机的元数据发送到消息队列中,由控制节点监听消息队列,控制节点会通过 nova Conductor 组件,将虚拟机的元数据(地址、类型、在哪个node节点运行)写入到mysql;node节点不能直接连接mysql;
Consoleauth:用于控制台的授权认证。新版本已经没有此组件;
Novncproxy:VNC 代理,用于显示虚拟机操作终端。通过vnc协议去连接,但是vnc不能直接在终端执行粘贴复制;通过VNC连接访问正在运行的实例的代理;
nova-spicehtml5proxy:提供用于通过SPICE连接访问正在运行的实例的代理。支持基于浏览器的HTML5客户端。
控制端需要安装nova控制端服务,Node节点需要安装nova客户端服务;
(03)
使用dashboard或者命令通过nova api去请求创建虚拟机,nova api会把创建虚拟机的请求放到消息队列中,由nova schedule接收请求并进行筛选出一个可用的node节点;
将筛选后的结果写入到消息队列中,最终会写入到mysql,nova neutron会监听消息队列,给虚拟机创建请求分配一个ip地址,并将虚拟机的ip地址写入到mysql中;
nova-volume也会监听消息队列,给虚拟机分配一个存储,nova-volume会调用外部存储给虚拟机进行分配,结果会写到mysql;
最终会由nova compute在宿主机上执行虚拟机的创建,nova compute也会监听消息队列,node节点执行创建虚拟机时,会通过glance api获取到镜像,glance api会从镜像存储中获取到镜像;
此图适用于早期版本,有的组件名称已经改变,有的组件已经删除;
Nova-API 的功能:
Nova-api 组件实现了 restful API 的功能,接收和响应来自最终用户的计算 API 请求,接收外部的请求并通过 message queue 将请求发动给其他服务组件,同时也兼容 EC2 API(国外公有云api),所以也可以使用 EC2 的管理工具对 nova 进行日常管理。Nova-api是接收外部请求,实现对虚拟机的增、删、改、查;
nova scheduler:
nova scheduler 模块在 openstack 中的作用是决策虚拟机创建在哪个主机(计算节点)上。决策一个虚拟机应该调度到某物理节点,需要分为两个步骤:
1、过滤(filter),过滤出可以创建虚拟机的主机,通过一些策略进行过滤,如创建在哪个组中,通过对组内的node节点进行权重评估,对硬件信息进行打分(cpu、内存、存储);(04)
2、计算权值(weight),根据权重大小进行分配,默认根据资源可用空间进行权重排序,如cpu、内存越多,评分就越高,则创建虚拟机的可能性也就越大(05)
对于nova管理端来说,是接收外部创建请求,通过 nova scheduler 筛选出node节点,并下发指令到node节点,由node节点创建虚拟机;控制端筛选出node节点后,会把创建虚拟机的请求发送到 rabbitmq 中,各个node节点都会监听 rabbitmq 中的队列,最终在node节点上是由 nova compute 调用 libvirt,libvirt 调用 kvm 创建虚拟机
https://docs.openstack.org/nova/train/install/get-started-compute.html #简介参考
部署nova-controller
https://docs.openstack.org/nova/train/install/controller-install-rdo.html #nova-controller部署
1、. admin-openrc.sh
2、openstack user create --domain default --password-prompt nova #创建认证账号
3、openstack role add --project service --user nova admin
#把nova用户添加到service项目,拥有admin权限
4、openstack service create --name nova --description "OpenStack Compute" compute
#创建nova服务
5、openstack endpoint create --region RegionOne compute public http://openstack-vip.linux.local:8774/v2.1
openstack endpoint create --region RegionOne compute internal http://openstack-vip.linux.local:8774/v2.1
openstack endpoint create --region RegionOne compute admin http://openstack-vip.linux.local:8774/v2.1
#给nova服务关联endpoint
6、openstack endpoint list #验证
7、yum install openstack-nova-api openstack-nova-conductor openstack-nova-novncproxy openstack-nova-scheduler -y
8、vim /etc/nova/nova.conf
[DEFAULT]
enabled_apis = osapi_compute,metadata #支持的api类型;开启之后,就可以通过dashboard或命令行访问
transport_url = rabbit://openstack:openstack123@openstack-vip.linux.local:5672/ #配置RabbitMQ消息队列访问
use_neutron = true #使用neutron获取网络信息
firewall_driver = nova.virt.firewall.NoopFirewallDriver
#通过此驱动程序与neutron进行交互,其实就是一个python文件;/usr/lib/python2.7/site-packages/ pythone模块都放在此目录下
[api_database]
connection = mysql+pymysql://nova:nova123@openstack-vip.linux.local/nova_api
[database]
connection = mysql+pymysql://nova:nova123@openstack-vip.linux.local/nova
[api]
auth_strategy = keystone #nova认证方式采用keystone认证
[keystone_authtoken]
www_authenticate_uri = http://openstack-vip.linux.local:5000/ #指定keystone地址
auth_url = http://openstack-vip.linux.local:5000/
memcached_servers = openstack-vip.linux.local:11211 #指定memcache地址
auth_type = password
project_domain_name = Default
user_domain_name = Default
project_name = service
username = nova
password = nova
[vnc] #只有vnc配置正确,后期才可以通过浏览器管理虚拟机,否则报1006或者1005状态码,即vnc配置错误
enabled = true
server_listen = 172.31.7.101 #controller端,监听地址都为本机
server_proxyclient_address = 172.31.7.101
[glance] #nova需要连接glance获取镜像
api_servers = http://openstack-vip.linux.local:9292
[oslo_concurrency] #指定锁路径
lock_path = /var/lib/nova/tmp #锁的作用是创建虚拟机时,在执行某个操作的时候,需要等此步骤执行完后才能执行下一个步骤,不能并行执行,保证操作是一步一步的执行
[placement] #通过调用placement服务,获取当前可用的主机列表
region_name = RegionOne
project_domain_name = Default
project_name = service
auth_type = password
user_domain_name = Default
auth_url = http://openstack-vip.linux.local:5000/v3 #通过此地址调用placement服务
username = placement
password = placement
9、su -s /bin/sh -c "nova-manage api_db sync" nova #初始化nova_api数据库
10、su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova
#注册cell0数据库;nova服务内部把资源划分到不同的cell中,把计算节点划分到不同的cell中;openstack内部基于cell把计算节点进行逻辑上的分组
11、su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova
#创建cell1单元格;
12、su -s /bin/sh -c "nova-manage db sync" nova
#初始化nova数据库;可以通过 /var/log/nova/nova-manage.log 日志判断是否初始化成功
13、su -s /bin/sh -c "nova-manage cell_v2 list_cells" nova
#验证cell0和cell1组件是否注册成功
14、systemctl start #开启服务
openstack-nova-api.service
openstack-nova-scheduler.service
openstack-nova-conductor.service
openstack-nova-novncproxy.service
15、systemctl enable
openstack-nova-api.service
openstack-nova-scheduler.service
openstack-nova-conductor.service
openstack-nova-novncproxy.service #vnc会监听6080端口
16、tail -f /var/log/nova/nova-*.log
#确保nova在启动过程中没有任何报错;日志中可能会出现关于mysql连接错误,此报错是因为nova是通过haproxy代理与mysql进行连接的,一但haproxy到了超时时间,nova没有与mysql进行交互,则会自动断开连接(重启nova服务后,日志中就不会出现该报错),想要让该报错少一些的话,可以修改haproxy配置文件中的配置:timeout client、timeout server、timeout http-keep-alive
17、vim nova-restart.sh #编写一个重启nova的脚本
#!/bin/bash
systemctl restart openstack-nova-api.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
mysql需要做的配置
1、CREATE DATABASE nova_api;
CREATE DATABASE nova;
CREATE DATABASE nova_cell0;
2、GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY 'nova123';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY 'nova123';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY 'nova123';
haproxy配置
1、vim /etc/haproxy/haproxy.cfg
listen openstack-nova-controller-8774
mode tcp
bind 172.31.7.248:8774
server 172.31.7.101 172.31.7.101:8774 check inter 3s fall 3 rise 5
listen openstack-nova-controller-8775
mode tcp
bind 172.31.7.248:8775
server 172.31.7.101 172.31.7.101:8775 check inter 3s fall 3 rise 5
#虚拟机通过请求nova API获取当前虚拟机的元数据,如公钥(获取到到的公钥会写入到虚拟机镜像中,用于ssh连接)、实例类型等,以实现让虚拟机进行磁盘空间拉伸
listen openstack-nova-novncproxy-6080
mode tcp
bind 172.31.7.248:6080
server 172.31.7.101 172.31.7.101:6080 check inter 3s fall 3 rise 5
2、systemctl restart haproxy.service