六、NOVA
6.1、NOVA详解
6.1.1、Nova概述
Nova和Swift是openstack最早的两个组件,nova分为控制节点和计算节点,计算节点通过nova computer进行虚拟机创建,通过libvirt调用kvm创建虚拟机,nova之间通信通过rabbitMQ队列进行通信。
Nova(OpenStack Compute Service)是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源,同时管理虚拟机生命周期。
6.1.2、Nova架构图
API:用于接收HTTP请求、转换命令、通过消息队列或HTTP与其他组件通信。
Conductor:处理需要协调(构建虚拟机或调整虚拟机大小)的请求,充当数据库代理或者处理对象转换。
Scheduler:用于决定哪台计算节点承载计算实例。
Compute:管理虚拟机管理器与虚拟机之间通信。
DB:用于数据存储的SQL数据库,通常是MariaDB。
6.1.3、Nova组件详解
6.1.3.1、nova-api
nova-api 作为 Nova 组件对外的唯一窗口,向客户暴露 Nova 能够提供的功能。 当客户需要执行虚机相关的操作,能且只能向 nova-api 发送 REST 请求。
设计 API 前端服务的好处在于: 1. 对外提供统一接口,隐藏实现细节 2. API 提供 REST 标准调用服务,便于与第三方系统集成 3. 可以通过运行多个 API 服务实例轻松实现 API 的高可用,比如运行多个 nova-api 进程。
6.1.3.2、nova-compute
nova-compute 在计算节点上运行,负责管理节点上的实例。OpenStack 对实例的操作,最后都是交给 nova-compute 来完成。nova-compute 与 Hypervisor 一起实现 OpenStack 对实例生命周期的管理。
nova-compute 的功能可以分为两类:
定时向 OpenStack 报告计算节点的状态
每隔一段时间,nova-compute 就会报告当前计算节点的资源使用情况和 nova-compute 服务状态。这样OpenStack 就能得知每个计算节点的 vcpu、ram、disk 等信息。nova-scheduler 的很多 Filter 才能根据计算节点的资源使用情况进行过滤,选择符合 flavor 要求的计算节点。
实现实例生命周期的管理
OpenStack 对实例最主要的操作都是通过 nova-compute 实现的,包括实例的启动、关闭、重启、暂停、恢复、删除、调整实例大小、迁移、创建快照等。
6.1.3.3、nova-conductor
为计算节点提供数据库访问支持。
nova-compute服务和数据库之间的中间件。
实现更高的系统安全性
在 OpenStack 的早期版本中,nova-compute 可以直接访问数据库,但这样存在非常大的安全隐患。因为 nova-compute 这个服务是部署在计算节点上的,为了能够访问控制节点上的数据库,就必须在计算节点的 /etc/nova/nova.conf 中配置访问数据库的连接信息。如果任意一个计算节点被黑客入侵,都会导致部署在控制节点上的数据库面临极大风险。
为了解决这个问题,从 G 版本开始,Nova 引入了一个新服务 nova-conductor,将 nova-compute 访问数据库的全部操作都放到 nova-conductor 中,而且 nova-conductor 是部署在控制节点上的。这样就避免了 nova-compute 直接访问数据库,增加了系统的安全性。
实现更好的系统伸缩性
nova-compute 与 nova-conductor 是通过消息中间件交互的。这种松散的架构允许配置多个 nova-conductor 实例。在一个大规模的 OpenStack 部署环境里,管理员可以通过增加 nova-conductor 的数量来应对日益增长的计算节点对数据库的访问。
6.1.3.4、nova-scheduler
将创建新虚拟机的请求分发到正确的节点。
当创建实例时,用户会提出资源需求,例如 CPU、内存、磁盘各需要多少。OpenStack 将这些需求定义在 flavor 中,用户只需要指定用哪个 flavor 就可以了。nova-scheduler 会按照 flavor 去选择合适的计算节点。
FilterScheduler调度过程分为两步:
通过过滤(filtering)选择满足条件的计算节点。
通过权重计算(weighting)选择在最优(权重值最大)的计算节点上创建实例。
6.1.3.5、nova-novncproxy
为浏览器提供VNC代理,允许VNC控制台访问虚拟机。
6.2部署NOVA
6.2.1、部署NOVA控制节点(controller节点)
6.2.1.1、创建数据库并配权限
mysql -uroot -p123456
CREATE DATABASE nova_api;
CREATE DATABASE nova;
CREATE DATABASE nova_cell0;
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' IDENTIFIED BY 'nova123';
GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' IDENTIFIED BY ' nova123';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' IDENTIFIED BY ' nova123';
GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' IDENTIFIED BY ' nova123';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' IDENTIFIED BY ' nova123';
GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' IDENTIFIED BY ' nova123';
flush privileges;
6.2.1.2、创建nova用户
openstack user create --domain default --password-prompt nova
或者
openstack user create --domain default --password nova123 nova
6.2.1.3、添加管理员角色给nova
openstack role add --project service --user nova admin
6.2.1.4、创建nova服务
openstack service create --name nova --description "OpenStack Compute" compute
6.2.1.5、给Nova服务关联endpoint(端点)
openstack endpoint create --region RegionOne compute public http://controller1:8774/v2.1
openstack endpoint create --region RegionOne compute internal http://controller1:8774/v2.1
openstack endpoint create --region RegionOne compute admin http://controller1:8774/v2.1
6.2.1.6、安装和配置服务
6.2.1.6.1、安装nova组件(nova-api、nova-conductor、nova-novncproxy、nova-scheduler)
yum install openstack-nova-api openstack-nova-conductor openstack-nova-novncproxy openstack-nova-scheduler -y
//openstack-nova-conductor:提供数据库连接
//openstack-nova-novncproxy:访问云主机的vnc
//openstack-nova-scheduler:提供调度服务
6.2.1.6.2、备份原文件
cp -a /etc/nova/nova.conf{,.bak}
6.2.1.6.3、配置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:nova123@controller1/nova_api
openstack-config--set /etc/nova/nova.conf database connectionmysql+pymysql://nova:nova123@controller1/nova
openstack-config--set /etc/nova/nova.conf DEFAULT transport_urlrabbit://openstack:openstack123@controller1:5672/
这里需要修改自己rabbitmq的openstack密码
openstack-config--set /etc/nova/nova.conf api auth_strategy keystone
openstack-config--set /etc/nova/nova.conf keystone_authtoken www_authenticate_urihttp://controller1:5000/
openstack-config--set /etc/nova/nova.conf keystone_authtoken auth_url http://controller1:5000/
openstack-config--set /etc/nova/nova.conf keystone_authtoken memcached_servers controller1: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 nova123
这里修改自己keystone认证的nova密码。
openstack-config--set /etc/nova/nova.conf DEFAULT my_ip 192.168.56.11
这里填自己的管理IP地址
openstack-config--set /etc/nova/nova.conf DEFAULT use_neutron true
openstack-config--set /etc/nova/nova.conf DEFAULT firewall_drivernova.virt.firewall.NoopFirewallDriver
openstack-config--set /etc/nova/nova.conf vnc enabled true
openstack-config--set /etc/nova/nova.conf vnc server_listen 192.168.56.11
openstack-config--set /etc/nova/nova.conf vnc server_proxyclient_address 192.168.56.11
填自己的IP
openstack-config--set /etc/nova/nova.conf glance api_servers http://controller1:9292
openstack-config--set /etc/nova/nova.conf oslo_concurrency lock_path /var/lib/nova/tmp
openstack-config--set /etc/nova/nova.conf placement region_name RegionOne
openstack-config--set /etc/nova/nova.conf placement project_domain_name Default
openstack-config--set /etc/nova/nova.conf placement project_name service
openstack-config--set /etc/nova/nova.conf placement auth_type password
openstack-config--set /etc/nova/nova.conf placement user_domain_name Default
openstack-config--set /etc/nova/nova.conf placement auth_url http://controller1:5000/v3
openstack-config--set /etc/nova/nova.conf placement username placement
openstack-config--set /etc/nova/nova.conf placement password placement123
这里换成自己keystone中placement的密码
openstack-config--set /etc/nova/nova.conf scheduler discover_hosts_in_cells_interval 300
默认每次添加个计算节点,在控制端就需要执行一次扫描,这样会很麻烦,所以可以修改控制端nova的配置文件,设置为以秒为单位的时间间隔来配置周期性任务,以使Nova自动发现新主机。
6.2.1.6.4、配置nova.conf方法一
vim /etc/nova/nova.conf
1:[DEFAULT]
……
508:my_ip=192.168.56.11
……
816:use_neutron=true
……
1169:firewall_driver=nova.virt.firewall.NoopFirewallDriver
……
1364:enabled_apis=osapi_compute,metadata
……
1590:transport_url=rabbit://openstack:openstack123@controller1:5672/
……
1632:[api]
……
1649:auth_strategy=keystone
……
1834:[api_database]
……
1849:connection=mysql+pymysql://nova:nova123@controller1/nova_api
……
2320:[database]
……
2339:connection=mysql+pymysql://nova:nova123@controller1/nova
……
2631:[glance]
……
2642:api_servers=http://controller1:9292
……
3208:[keystone_authtoken]
……
3223:www_authenticate_uri=http://controller1:5000/
……
3239:auth_url=http://controller1:5000/
……
3286:memcached_servers=controller1:11211
……
3367:auth_type=password
3368:project_domain_name=Default
3369:user_domain_name=Default
3370:project_name=service
3371:username=nova
3372:password=nova123
……
4252:[oslo_concurrency]
……
4266:lock_path=/var/lib/nova/tmp
……
4758:[placement]
……
4789:auth_type=password
……
4796:auth_url=http://controller1:5000/v3
……
4812:project_name=service
……
4819:project_domain_name=Default
……
4840:username=placement
……
4847:user_domain_name=Default
……
4851:password=placement123
……
4870:region_name=RegionOne
……
5226:[scheduler]
……
5260:discover_hosts_in_cells_interval=300
……
5893:[vnc]
……
5907:enabled=true
……
5931:server_listen=192.168.56.11
……
5939:server_proxyclient_address=192.168.56.11
6.2.1.6.5、同步nova-api的数据库
su -s/bin/sh -c "nova-manage api_db sync" nova
6.2.1.6.6、注册cell0数据库
su -s/bin/sh -c "nova-manage cell_v2 map_cell0" nova
6.2.1.6.7、创建cell1单元格
su -s/bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose"nova
6.2.1.6.8、同步nova数据库
su -s/bin/sh -c "nova-manage db sync" nova
6.2.1.6.9、验证nova cell0和cell1已正确注册
su -s /bin/sh-c "nova-manage cell_v2 list_cells" nova
6.2.1.6.10、开启服务完成安装
systemctlenable openstack-nova-api.service openstack-nova-scheduler.serviceopenstack-nova-conductor.service openstack-nova-novncproxy.service
systemctlstart openstack-nova-api.service openstack-nova-scheduler.serviceopenstack-nova-conductor.service openstack-nova-novncproxy.service
6.2.2、部署NOVA计算节点(compute节点)
6.2.2.1、计算安装软件包
yum install openstack-nova-compute -y
6.2.2.2、备份原配置文件
cp -a /etc/nova/nova.conf{,.bak}
6.2.2.3、修改计算节点nova.conf配置文件-方法一
vim /etc/nova/nova.conf
1:[DEFAULT]
……
508:my_ip=192.168.56.21
……
816:use_neutron=true
……
1169:firewall_driver=nova.virt.firewall.NoopFirewallDriver
……
1364:enabled_apis=osapi_compute,metadata
……
1590:transport_url=rabbit://openstack:openstack123@controller1
……
1632:[api]
……
1649:auth_strategy=keystone
……
2629:[glance]
……
2640:api_servers=http://controller1:9292
……
3206:[keystone_authtoken]
……
3221:www_authenticate_uri=http://controller1:5000/
……
3237:auth_url=http://controller1:5000/
……
3284:memcached_servers=controller1:11211
……
3365:auth_type=password
3366:project_domain_name=Default
3367:user_domain_name=Default
3368:project_name=service
3369:username=nova
3370:password=nova123
……
3376:[libvirt]
……
3415:virt_type=qemu
#若计算节点不支持硬件加速(虚拟化),则此参数设置为qume。
#使用以下命令确定计算节点是否支持虚拟机的硬件加速:
egrep -c '(vmx|svm)' /proc/cpuinfo
如果此命令返回1或更大的值,则计算节点支持硬件加速,通常不需要额外配置
如果此命令返回的值为0,则计算节点不支持硬件加速,必须将libvirt配置为使用QEMU而不是KVM。
……
4251:[oslo_concurrency]
……
4265:lock_path=/var/lib/nova/tmp
……
4757:[placement]
……
4788:auth_type=password
……
4795:auth_url=http://controller1:5000/v3
……
4811:project_name=service
……
4818:project_domain_name=Default
……
4839:username=placement
……
4846:user_domain_name=Default
……
4850:password=placement123
……
4869:region_name=RegionOne
……
5891:[vnc]
……
5905:enabled=true
……
5929:server_listen=0.0.0.0
……
5937:server_proxyclient_address=192.168.56.21
……
5943:novncproxy_base_url=http://controller1:6080/vnc_auto.html
6.2.2.4、修改计算节点nova.conf配置文件-方法二
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 DEFAULT transport_url rabbit://openstack:openstack123@controller1
openstack-config --set /etc/nova/nova.conf DEFAULT my_ip 192.168.56.21
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 api auth_strategy keystone
openstack-config --set /etc/nova/nova.conf keystone_authtoken www_authenticate_uri http://controller1:5000/
openstack-config --set /etc/nova/nova.conf keystone_authtoken auth_url http://controller1:5000/
openstack-config --set /etc/nova/nova.conf keystone_authtoken memcached_servers controller1: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 nova123
openstack-config --set /etc/nova/nova.conf vnc enabled true
openstack-config --set /etc/nova/nova.conf vnc server_listen 0.0.0.0
openstack-config --set /etc/nova/nova.conf vnc server_proxyclient_address 192.168.56.21
openstack-config --set /etc/nova/nova.conf novncproxy_base_url http://controller1:6080/vnc_auto.html
openstack-config --set /etc/nova/nova.conf glance api_servers http://controller1:9292
openstack-config --set /etc/nova/nova.conf oslo_concurrency lock_path /var/lib/nova/tmp
openstack-config --set /etc/nova/nova.conf placement region_name RegionOne
openstack-config --set /etc/nova/nova.conf placement project_domain_name Default
openstack-config --set /etc/nova/nova.conf placement project_name service
openstack-config --set /etc/nova/nova.conf placement auth_type password
openstack-config --set /etc/nova/nova.conf placement user_domain_name Default
openstack-config --set /etc/nova/nova.conf placement auth_url http://controller1:5000/v3
openstack-config --set /etc/nova/nova.conf placement password placement123
openstack-config --set /etc/nova/nova.conf placement username placement
openstack-config --set /etc/nova/nova.conf libvirt virt_type qemu
6.2.2.5、启动服务
systemctl enable libvirtd.service openstack-nova-compute.service
systemctl start libvirtd.service openstack-nova-compute.service
6.2.2.6、启动openstack-nova-compute报错案例
systemctl start openstack-nova-compute.service
Job for openstack-nova-compute.service failed because the control process exited with error code. See "systemctl status openstack-nova-compute.service" and "journalctl -xe" for details.
查看报错日志:
tail /var/log/nova/nova-compute.log
分析日志及排查nova.conf配置文件内容确定为,[placement]模块中placement的账号密码写错。
6.2.2.7、在控制节点验证计算节点是否添加成功
. admin-openrc
openstack compute service list --service nova-compute
若控制节点的nova.conf文件中[scheduler]模块未配置自动发现计算节点参数(discover_hosts_in_cells_interval = 300,单位为秒),可执行一下命令手动添加:
su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova
验证计算节点服务:
openstack compute service list #检查 nova 的各个服务是否都是正常,以及 compute 服务是否注册成功
openstack catalog list #查看各个组件的 api 是否正常
openstack image list #查看是否能够拿到镜像
nova-status upgrade check #查看cell的api和placement的api是否正常,只要其中一个有误,后期无法创建虚拟机