Nova计算服务的安装与配置
Message Queue(RabbitMQ Server)
OpenSatck节点之间通过消息队列使用AMPQ(Advanced Message Queue Protocol,高级消息队列协议)完成通信。Nova通过异步调用请求响应,使用回调函数在收到响应时触发。因为使用了异步通信,所以不会有用户长时间卡在等待状态。这是有效的,因为许多API调用预期的行为都非常耗时,例如加载一个云主机,或者上传一个镜像。
Compute Worker(Nova-compute)
Compute Worker处理管理云主机生命周期。它们通过消息队列服务接收云主机生命周期管理的请求,并承担操作工作。在一个典型生产环境的云部署中有一些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-schduler)
调度器Scheduler把Nova-API调用映射为OpenStack组件。调度器作为一个称为Nova-scheduler的守护进程运行,通过恰当的调度算法从可用资源池获得一个计算服务。Scheduler会根据负载、内存、可用域的物理距离、CPU架构等做出调度决定。Nova-scheduler实现了一个可插入式的结构。
当前,Nova-scheduler实现了一些基本的调度算法:①随机算法,计算主机在所有可用域内随机选择;②可用域算法,与随机算法相仿,但是计算主机在指定的可用域内随机选择;③简单算法,这种方法选择负载最小的主机运行云主机。负载信息可通过负载均衡器获得。
总的来说,Nova的各个组件(如下图所示)是以数据库和队列为中心进行通信的,下面对其中的几个组件进行简单介绍:
(1)API
Nova-api:接收和响应客户的API调用。
(2)Console Interface
Nova-console:用户可以通过多种方式访问虚拟机的控制台;
Nova-novncproxy:基于Web浏览器的VNC访问;
Nova-spicehtml5proxy:基于HTML5浏览器的SPICE访问;
Nova-xvpnvncproxy:基于Java客户端的VNC访问;
Nova-consoleauth:负责对访问虚拟机控制台提供Token认证;
Nova-cert:提供x509证书支持。
(3)Database
Nova会有一些数据需要存放到数据库中,一般使用MySQL。一般数据库安装在控制节点上。
(4)Message Queue
前面介绍了Nova包含众多的子服务,这些子服务之间需要相互协调和通信。
为解耦各个子服务,Nova通过Message Queue作为子服务的信息中转站。
所以,在架构图上看到了子服务之间没有直接的连线,它们都通过Message Queue联系。
OpenStack默认是用RabbitMQ作为Message Queue。
(5)Compute Core
Nova-scheduler:虚拟机调度服务,负责决定在哪个计算节点上运行虚拟机。
Nova-compute:管理虚拟机的核心服务,通过调用Hypervisor API实现虚拟机生命周期管理;
Hypervisor:计算节点上跑的虚拟化管理程序,虚拟机管理底层的程序。
不同虚拟化技术提供自己的Hypervisor。常用的Hypervisor有KVM、Xen、VMWare等。
Nova-conductor:Nova-compute经常需要更新数据库,比如更新虚拟机状态。出于安全性和伸缩性考虑,Nova-compute并不会直接访问数据库,而是将这个任务委托给Nova-conductor。
以下步骤在controller节点
1、创建nova和 nova_api数据库并授权
mysql -uroot -p0
> create database nova;
> create database nova_api;
> grant all privileges on nova.* to 'nova'@'localhost' identified by '0';
> grant all privileges on nova.* to 'nova'@'%' identified by '0';
> grant all privileges on nova_api.* to 'nova'@'localhost' identified by '0';
> grant all privileges on nova_api.* to 'nova'@'%' identified by '0';
2、获得admin凭证来获取只有管理员能执行的命令的访问权限
. /root/admin-openrc
3、创建服务凭证
#1.添加nova用户
openstack user create --domain default --password 0 nova
#2.添加admin角色到nova用户和service项目上
openstack role add --project service --user nova admin
#3.创建nova服务实体
openstack service create --name nova --description "OpenStack Compute" compute
4、创建Compute服务API端点
#1.创建公共端点
openstack endpoint create --region RegionOne compute public http://controller:8774/v2.1/%\(tenant_id\)s
#2.创建外部端点
openstack endpoint create --region RegionOne compute internal http://controller:8774/v2.1/%\(tenant_id\)s
#3.创建管理端点
openstack endpoint create --region RegionOne compute admin http://controller:8774/v2.1/%\(tenant_id\)s
5、安装并配置Nova服务
#1.创建nova服务
yum install -y openstack-nova-api openstack-nova-conductor openstack-nova-console openstack-nova-novncproxy openstack-nova-scheduler
#2.配置nova所需组件,修改/etc/nova/nova.conf配置文件
cp /etc/nova/nova.conf{,.bak}
vim /etc/nova/nova.conf
#(1)启用计算和元数据API
#在[DEFAULT]下添加:
enabled_apis = osapi_compute,metadata
#(2)配置数据库连接
#在[api_database]下添加:
connection = mysql+pymysql://nova:0@controller/nova_api
#在[database]下添加:
connection = mysql+pymysql://nova:0@controller/nova
#(3)配置RabbitMQ消息服务器连接
#在[DEFAULT]下添加:
rpc_backend = rabbit
#在[oslo_messaging_rabbit]下添加:
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = 0
#(4)配置Keystone身份认证
#在[DEFAULT]下添加:
auth_strategy = keystone
#在[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 = 0
#(5)配置管理IP地址和启用网络服务
#在[DEFAULT]下添加:
my_ip = 192.168.100.10
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver
#(6)配置VNC代理使用控制节点的管理接口IP地址
在[vnc]下添加:
vncserver_listen = 192.168.100.10
vncserver_proxyclient_address = 192.168.100.10
#(7)配置镜像服务API端点
#在[glance]下添加:
api_servers = http://controller:9292
#(8)配置loca_path锁路径
#在[oslo_concurrency]下添加:
lock_path = /var/lib/nova/tmp
6、同步数据库
su -s /bin/sh -c "nova-manage api_db sync" nova
su -s /bin/sh -c "nova-manage db sync" nova
#注:进入Nova数据库查看是否有数据库表,验证是否同步成功,这里就不展示了
7、启动并设置自启动
systemctl enable --now openstack-nova-api.service openstack-nova-consoleauth.service openstack-nova-scheduler.service openstack-nova-conductor.service openstack-nova-novncproxy.service
以下步骤在compute节点
8、安装并配置Nova-compute服务
#1.安装nova-compute服务
yum install -y openstack-nova-compute
#2.配置nova-compute所需组件,修改 /etc/nova/nova.conf 配置文件
cp /etc/nova/nova.conf{,.bak}
vim /etc/nova/nova.conf
#(1)配置RabbitMQ消息服务器连接
#在[DEFAULT]下添加:
rpc_backend = rabbit
#在[oslo_messaging_rabbit]下添加:
rabbit_host = controller
rabbit_userid = openstack
rabbit_password = 0
#(2)配置认证服务访问
#在[DEFAULT]下添加:
auth_strategy = keystone
#在[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 = 0
#(3)配置管理IP地址和启用网络服务支持
#在[DEFAULT]下添加:
my_ip = 192.168.100.20
use_neutron = True
firewall_driver = nova.virt.firewall.NoopFirewallDriver
#(4)启用并配置远程控制台的访问
#在[vnc]下添加:
enabled = True
vncserver_listen = 0.0.0.0
vncserver_proxyclient_address = 192.168.100.20
novncproxy_base_url = http://192.168.100.10:6080/vnc_auto.html
#(5)配置镜像服务 API 的位置
#在[glance]下添加:
api_servers = http://controller:9292
#(6)配置lock_path锁路径
#在[oslo_concurrency]下添加:
lock_path = /var/lib/nova/tmp
9、检查主机是否支持虚拟硬件加速
egrep -c '(vmx|svm)' /proc/cpuinfo
4
#这里为4,是因为一开始创建的时候在CPU选项部分勾选了虚拟化服务,所以是这样
① 如果这个命令返回了 1 或者大于 1 的值,那么你的计算节点支持硬件加速且不需要额外的配置。
② 如果这个命令返回了 0 值,那么你的计算节点不支持硬件加速。你必须配置 libvirt 来使用 QEMU 去代替 KVM,参考一下命令。
#编辑/etc/nova/nova.conf 文件的 [libvirt]
cp /etc/nova/nova.conf{,.bak}
vim /etc/nova/nova.conf
#在[libvirt]下添加:
virt_type = qemu
10、启动并设置自启动
systemctl enable --now libvirtd.service openstack-nova-compute.service
systemctl status libvirtd.service
systemctl status openstack-nova-compute.service
以下步骤在controller节点
11、验证操作
. /root/admin-openrc
#列出服务组件,查看是否成功注册并启动服务进程
openstack compute service list