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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM