openstack核心组件-nova-计算服务

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-api: 发出请求给 openstack 来操作一个服务,调用该服务来启动一个新的 nova 实例。

nova-scheduler:nova 调度器 , 用于选择某个服务器相应运行实例的请求。

nova-compute :管理虚机的核心服务,通过调用 Hypervisor API 实现虚机生命周期管理

nova-conductor :nova-compute 经常需要更新数据库,比如更新虚机的状态。出于安全性和伸缩性的考虑,

nova-compute 并不会直接访问数据库,而是将这个任务委托给 nova-conductor

nova-novncproxy:基于 Web 浏览器的 VNC 访问

nova-consoleauth :负责对访问虚机控制台请求提供 Token 认证

Nova 的架构比较复杂,包含很多组件。 这些组件以子服务(后台 deamon 进程)的形式运行,可以分为以下几类:

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管理界面

在这里插入图片描述

Compute Core

nova-scheduler:

虚机调度服务,负责决定在哪个计算节点上运行虚机。创建 Instance(实例) 时,用户会提出资源需求,例如 CPU、内存、磁盘各需要多少。OpenStack 将这些需求定义在 flavor 中,用户只需要指定用哪个 flavor(可指定cpu、内存、磁盘) 就可以了

下面介绍 nova-scheduler 是如何实现调度的。在 /etc/nova/nova.conf 中,nova 通过 driver=filter_scheduler 这个参数来配置 nova-scheduler。

Filter scheduler
Filter scheduler 是 nova-scheduler 默认的调度器,调度过程分为两步:

  1. 通过过滤器(filter)选择满足条件的计算节点(运行 nova-compute)
  2. 通过权重计算(weighting)选择在最优(权重值最大)的计算节点上创建 Instance。

Nova 允许使用第三方 scheduler,配置 scheduler_driver 即可。 这又一次体现了OpenStack的开放性。Scheduler 可以使用多个 filter 依次进行过滤,过滤之后的节点再通过计算权重选出最适合的节点。

nova-compute:

nova-compute 是管理虚机的核心服务,在计算节点上运行。通过调用Hypervisor API实现节点上的 instance的生命周期管理。 OpenStack 对 instance 的操作,最后都是交给 nova-compute 来完成的。 nova-compute 与 Hypervisor 一起实现 OpenStack 对 instance 生命周期的管理。

通过Driver架构支持多种Hypervisor
Hypervisor是计算节点上跑的虚拟化管理程序,虚机管理最底层的程序。 不同虚拟化技术提供自己的 Hypervisor。 常用的 Hypervisor 有 KVM,Xen, VMWare 等。nova-compute 为这些 Hypervisor 定义了统一的接口,Hypervisor 只需要实现这些接口,就可以 Driver 的形式即插即用到 OpenStack 系统中。 下面是Nova Driver的架构示意图:
在这里插入图片描述

nova-conductor:

nova-compute 经常需要更新数据库,比如更新和获取虚机的状态。 出于安全性和伸缩性的考虑,nova-compute 并不会直接访问数据库,而是将这个任务委托给 nova-conductor。
在这里插入图片描述

这样做有两个显著好处:

  1. 更高的系统安全性
  2. 更好的系统伸缩性

Console Interface

nova-console: 用户可以通过多种方式访问虚机的控制台
nova-novncproxy: 基于 Web 浏览器的 VNC 访问
nova-spicehtml5proxy: 基于 HTML5 浏览器的 SPICE 访问
nova-xvpnvncproxy: 基于 Java 客户端的 VNC 访问
nova-consoleauth: 负责对访问虚机控制台请求提供 Token 认证
nova-cert: 提供 x509 证书支持

Database

Nova 会有一些数据需要存放到数据库中,一般使用 MySQL。数据库安装在控制节点上。 Nova 使用命名为 “nova” 的数据库。

Message Queue

在前面我们了解到 Nova 包含众多的子服务,这些子服务之间需要相互协调和通信。为解耦各个子服务,Nova 通过 Message Queue 作为子服务的信息中转站。 所以在架构图上我们看到了子服务之间没有直接的连线,是通过 Message Queue 联系的。

在这里插入图片描述

OpenStack 默认是用 RabbitMQ 作为 Message Queue。 MQ 是 OpenStack 的核心基础组件,我们后面也会详细介绍。

从虚机创建流程看 nova-* 子服务如何协同工作 子服务如何协同工作

在这里插入图片描述

1,客户(可以是 OpenStack 最终用户,也可以是其他程序)向 API(nova-api)发送请求:“帮我创建一个虚机”

2,API 对请求做一些必要处理后,向 Messaging(RabbitMQ)发送了一条消息:“让 Scheduler 创建一个虚机”

3,Scheduler(nova-scheduler)从 Messaging 获取到 API 发给它的消息,然后执行调度算法,从若干计算节点中选出节点 A

4,Scheduler 向 Messaging 发送了一条消息:“在计算节点 A 上创建这个虚机”

5,计算节点 A 的 Compute(nova-compute)从 Messaging 中获取到 Scheduler 发给它的消息,然后在本节点的 Hypervisor 上启动虚机。

6,在虚机创建的过程中,Compute 如果需要查询或更新数据库信息,会通过 Messaging 向 Conductor(nova-conductor)发送消息,Conductor 负责数据库访问。

7,以上是创建虚机最核心的步骤, 这几个步骤向我们展示了 nova-* 子服务之间的协作的方式,也体现了 OpenStack 整个系统的分布式设计思想,掌握这种思想对我们深入理解 OpenStack 会非常有帮助。

openstack虚拟机启动流程

在这里插入图片描述

配置

控制节点

#mysql -u root -p

创建库

> CREATE DATABASE nova_api;
> CREATE DATABASE nova;
> CREATE DATABASE nova_cell0;

设置权限

> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'localhost' \
IDENTIFIED BY 'NOVA_DBPASS';
> GRANT ALL PRIVILEGES ON nova_api.* TO 'nova'@'%' \
IDENTIFIED BY 'NOVA_DBPASS';

> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'localhost' \
IDENTIFIED BY 'NOVA_DBPASS';
> GRANT ALL PRIVILEGES ON nova.* TO 'nova'@'%' \
IDENTIFIED BY 'NOVA_DBPASS';

> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'localhost' \
IDENTIFIED BY 'NOVA_DBPASS';
> GRANT ALL PRIVILEGES ON nova_cell0.* TO 'nova'@'%' \
IDENTIFIED BY 'NOVA_DBPASS';

创建用户

#openstack user create --domain default --password=nova nova

设置nova为管理员

#openstack role add --project service --user nova admin

创建服务

#openstack service create --name nova \
--description "OpenStack Compute" compute

创建服务端点

#openstack endpoint create --region RegionOne \
compute public http://pikachu1:8774/v2.1
#openstack endpoint create --region RegionOne \
compute internal http://pikachu1:8774/v2.1
#openstack endpoint create --region RegionOne \
compute admin http://pikachu1:8774/v2.1

创建placement用户

#openstack user create --domain default --password=placement placement

设置为管理员

#openstack role add --project service --user placement admin

创建服务

#openstack service create --name placement --description "Placement API" placement

创建服务端点

#openstack endpoint create --region RegionOne placement public http://pikachu1:8778
#openstack endpoint create --region RegionOne placement internal http://pikachu1:8778
#openstack endpoint create --region RegionOne placement admin http://pikachu1:8778

软件安装

#yum install openstack-nova-api openstack-nova-conductor \
openstack-nova-console openstack-nova-novncproxy \
openstack-nova-scheduler openstack-nova-placement-api

修改配置文件

#cp /etc/nova/nova.conf /etc/nova/nova.conf.bak
#vim /etc/nova/nova.conf

[DEFAULT]
my_ip=192.168.146.51
控制节点集群网网卡ip
use_neutron = True
网络服务开启
firewall_driver = nova.virt.firewall.NoopFirewallDriver
防火墙驱动
enabled_apis=osapi_compute,metadata
打开api接口
transport_url = rabbit://openstack:admin@pikachu1
传输端口rabbitmq

[api]
auth_strategy = keystone

[api_database]
connection = mysql+pymysql://nova:NOVA_DBPASS@pikachu1/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@pikachu1/nova

[ephemeral_storage_encryption]

[filter_scheduler]

[glance]
api_servers = http://pikachu1:9292

[guestfs]

[healthcheck]

[hyperv]

[image_file_url]

[ironic]

[key_manager]

[keystone_authtoken]
auth_uri = http://pikachu1:5000
验证keystone地址
auth_url = http://pikachu1:35357
memcached_servers = pikachu1: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://pikachu1:9696
#auth_url = http://pikachu1: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://pikachu1:35357/v3
project_name = service
project_domain_name = Default
username = placement
password = placement
user_domain_name = Default

[quota]

[rdp]

[remote_debug]

[scheduler]
#discover_hosts_in_cells_interval = 300

[serial_console]

[service_user]

[spice]

[ssl]

[trusted_computing]

[upgrade_levels]

[vendordata_dynamic_auth]

[vmware]

[vnc]
远程控制界面
enabled=true
vncserver_listen=$my_ip
监听地址 控制节点集群网网卡ip
vncserver_proxyclient_address=$my_ip
客户端地址
#novncproxy_base_url = http://192.168.146.51:6080/vnc_auto.html

[workarounds]

[wsgi]

[xenserver]

[xvp]

修改httpd

#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>

#systemctl restart httpd

导入nova-api数据库

#su -s /bin/sh -c "nova-manage api_db sync" nova

导入证书的库

#su -s /bin/sh -c "nova-manage cell_v2 map_cell0" nova

创建cell1证书

#su -s /bin/sh -c "nova-manage cell_v2 create_cell --name=cell1 --verbose" nova

导入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


#openstack compute service list

计算节点

#yum install openstack-nova-compute
要解决依赖关系

控制节点
#scp /etc/nova/nova.conf pikachu2:/etc/nova/nova.conf
#vim /etc/nova/nova.conf

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#egrep -c '(vmx|svm)' /proc/cpuinfo
打开虚拟机的虚拟化

启动服务

#systemctl enable libvirtd.service openstack-nova-compute.service
#systemctl enable libvirtd.service openstack-nova-compute.service

#openstack hypervisor list

控制节点刷新数据库

#su -s /bin/sh -c "nova-manage cell_v2 discover_hosts --verbose" nova

控制节点配置文件
[scheduler]
discover_hosts_in_cells_interval = 300
自动发现计算节点

查看日志服务列表

#openstack catalog list

安全检查

#nova-status upgrade check

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/PpikachuP/article/details/89219016