nova-compute
nova-compute (openstack ESSEX)
工作流程
请求:nova boot –image ttylinux –flavor 1 i-01
nova-api 接受请求,一个tcp REST请求.
nova-api 发送一个创建虚拟机的请求到消息队列,并会存数据库,带uuid.
nova-scheduler 接受这个消息,并进行过滤,根据请求的虚拟资源,即flavor的信息.
scheduler会找到一个可用的主机(装有nova-compute的物理主机),如果没有找到就虚拟机的状态设置成ERROR,
如果有可用主机,就发消息到nova-network,就进入下一步,配置网络,注:此过程虚拟机处于scheduling任务状态。
nova-network 接收到消息就,从fixed IP表(数据库)里拿出一个可用IP,
并设置dnsmsq(DHCP server),确保拿出的IP可以与对应的MAC地址(生成的)对应,
确保虚拟机可以被赋予对应的IP,并设置IPTABLE.
对fixed IP 进行地址转换,使虚拟机可以访问外网,
注:对于Vlan模式,nova-network所在的物理主机,要对应放置一个空闲的fixed到网桥上,
为的是使物理主机和虚拟机处于同一个vlan中,这样NAT才会生效,会在之后的nova-network中详细讨论.
设置好network之后,会发消息到消息队列,使要在其上创建虚拟机的物理计算节点就收到创建虚拟机的消息,
计算节点接收到消息后,就开始创建虚拟机,首先会download镜像从glance上(注:如果有此镜像的缓存,这不需要download,
这也是为什么第二次在同一台物理主机上创建虚拟机会非常快),然后会根据之前生成的uuid,MAC,镜像位置,
创建一个启动虚拟机的xml文件,然后会调用libvirt接口,根据xml配置创建虚拟机,虚拟机创建完成之后,
会把虚拟机状态改成ACTIVE,至此,一台虚拟机发布完成
一些经验
每次重启nova-compute会把所在主机上的虚拟机全部重启一遍,并会根据对应数据库中虚拟机的状态进行改变。
如果数据库中丢失了某条虚拟机的数据/虚拟为得了ted,会把对应不匹配的虚拟的删除。
另:nova-volume会有周期性遍历,把于数据库不匹配的vg下的lv删除.
虚拟机的运行虚拟硬盘默认放置在/var/lib/nova/instances下面.
其中_base文件夹中放置的虚拟机对应镜像的基本镜像,即初始镜像,而对应的
instance000000xxx中对应的是虚拟机差异文件,在instance0000xxx中用
kvm-img info disk 可以清晰看出两者的关系,其实这样做最大的好处是当有第二台相同镜像的虚拟机,可以直接使用_base下的初始镜像,
省去了下载镜像的这一大块时间。
可以通过kvm-img convert命令把两者合并成一个镜像,openstack的snapshot(注:非volume-snapshot)就是这么做的,
另:openstack的这个snapshot其实是一个backup,而不算是一个snapshot,个人觉得,
可以发现kvm-img snapshot这个命令,目前不太了解为什么不使用这个,而使用完全备份。也许更可靠吧,但也非常占硬盘。
关于floating ip的添加,首先会把floating
ip绑定到对应的网卡口上,根据你的配置,然后会做NAT对应的fixed
IP,请求通过物理主机绑定的floating ip到你的fxied
ip,到虚拟机,中间会有一些规则,根据你secgroup的设置,只接受允许的协议和端口。
openstack的novnc是使用HTML5的websocket协议,所以如果所在网络有限制,很可能不能访问,当然如果同在一个局域网另说。
关于制定义filter机制,在nova开发文档中有详细说明,在下面的nova.conf配置中也有对应说明
openstack日志都在/var/log/nova下面,要注意的是虚拟机的创建日志会在对应所在物理机的log中。
openstack平台中服务的状态(nova-manage service list)是通过计算数据库中对应服务字段的update
time,用now-updatetime,是否大于更新频率来确定服务是否down了的,所以,如果在多主机openstack环境下,发现运行nova-manage
service list时,本机的服务都是正常,其他主机的服务都是down的话,先确保主机间是否时间同步了
使用kvm-ok来确认是否支持kvm,主要是来确认是否支持windows系统,对于qemu是没有virtio模式的。
虚拟机真正的运行配置是在/etc/libvirt/qemu下面的,所以如果想手动改其配置,应该改这里的
关于nova.conf的一些配置
# DESC: # --vlan_interface=eth0 ,Configure LAN IP On this device # --public_interface=eth1 ,Configure public IP on this device # IF Only have one device , ALL use eth0 , # --vlan_interface=eth0 # --public_interface=eth0 # --my_ip=[this host\'s IP] # --sql_connection=mysql://openstack:hisoft@[the controller\'s IP]/openstack # --rabbit_host=[the controller\'s IP] # --glance_api_servers=[the controller\'s IP] # --ec2_dmz_host=[the controller\'s IP] # --ec2_host=[the controller\'s IP] # --instances_path=[the/path/to/store/instances] #replace default path /var/bin/nova/instances # if use flat DHCP for flatDHCP netwokor config # --network_manager=nova.network.manager.FlatDHCPManager # --public_interface=eth0 # --flat_interface=eth0 # --flat_network_bridge=br100 # --fixed_range=10.0.0.0/27 # --network_size=32 # ( cat | sudo tee /etc/nova/nova.conf ) <<EOF --dhcpbridge_flagfile=/etc/nova/nova.conf --dhcpbridge=/usr/bin/nova-dhcpbridge --logdir=/var/log/nova --state_path=/var/lib/nova --lock_path=/var/lock/nova --force_dhcp_release --iscsi_helper=tgtadm --libvirt_use_virtio_for_bridges --connection_type=libvirt --root_helper=sudo nova-rootwrap --verbose --ec2_private_dns_show_ip --network_manager=nova.network.manager.VlanManager --fixed_range=10.0.0.0/8 --vlan_interface=eth0 --public_interface=eth0 --fixed_range=10.0.0.0/27 --network_size=32 --auth_strategy=keystone --my_ip=[host ip] --sql_connection=mysql://openstack:hisoft@127.0.0.1/openstack --rabbit_host=[host ip] --glance_api_servers=[host ip]:9292 --ec2_dmz_host=[host ip] --ec2_host=[host ip] # the follow 6 config is for change the default quota of one tenant --quota_cores=200 --quota_floating_ips=50 --quota_gigabytes=3000 --quota_instances=100 --quota_ram=300000 --quota_volumes=100 --novncproxy_base_url=http://[controller ip]:6080/vnc_auto.html --vncserver_proxyclient_address=[host ip] --vncserver_listen=[host ip] EOF
#IF use customize scheduler filter , add the follow config . ( cat | sudo tee -a /etc/nova/nova.conf ) <<EOF --scheduler_driver=nova.scheduler.filter_scheduler.FilterScheduler --scheduler_available_filters=[your filter impl import path] --scheduler_default_filters=ResourceFilter EOF