Vcenter一般指 VMware vCenter™ ServerVMware vCenterServer 提供了一個可伸縮、可擴展的平臺,為 虛擬化管理奠定了基礎,下文我們就來一起看看小編碰到的nova vCenter Driver創建虛機與網絡不一致問題解決辦法.
上周將VMware mech driver實現完成后,發現一個問題,測試時發現,neutron創建的網絡,與nova創建的虛擬機被創建在不同的ESXi主機上,當然cluster中只有一個ESXi主機時,不會存在這個問題.
切換到nova-network下,發現也存在這個問題,launchpad上有人報了這個bug:跟了下/nova/virt/vmwareapi的代碼,錯誤大概是這樣子的.nova在創建虛擬機時,通過_get_vif_infos()獲取vif_infos.
在_get_vif_infos方法中,調用vif.py的get_network_ref方法獲取network_ref,如果使用不用neutron nsx,調用ensure_vlan_bridge,ensure_vlan_bridge在cluster中查找是否存在要創建的網絡(在ESXi主機上為端口組),這個查找是在cluster中指定的1臺ESXi主機上查找,比如ESXi A,如果不存在就去創建網絡.
創建成功后繼續調用network_util.get_network_with_the_name進行查詢,此時應該可以查詢到新建的網絡,但是這個地方有bug,新建的網絡還是查詢不到,因此network_ref返回為空.
所以創建虛擬機時,虛擬機不會加入新建的網絡(端口組).
- def ensure_vlan_bridge(session, vif, cluster=None, create_vlan=True):
- """Create a vlan and bridge unless they already exist."""
- vlan_num = vif['network'].get_meta('vlan')
- bridge = vif['network']['bridge']
- vlan_interface = CONF.vmware.vlan_interface
- network_ref = network_util.get_network_with_the_name(session, bridge,
- cluster)
- if network_ref and network_ref['type'] == 'DistributedVirtualPortgroup':
- return network_ref
- if not network_ref:
- # Create a port group on the vSwitch associated with the
- # vlan_interface corresponding physical network adapter on the ESX
- # host.
- vswitch_associated = _get_associated_vswitch_for_interface(session,
- vlan_interface, cluster)
- network_util.create_port_group(session, bridge,
- vswitch_associated,
- vlan_num if create_vlan else 0,
- cluster)
- # bug就出在這里,上一步創建的port group,這里沒有獲取到。
- network_ref = network_util.get_network_with_the_name(session,
- bridge,
- cluster)
- elif create_vlan:
- # Get the vSwitch associated with the Physical Adapter
- vswitch_associated = _get_associated_vswitch_for_interface(session,
- vlan_interface, cluster)
- # Get the vlan id and vswitch corresponding to the port group
- _get_pg_info = network_util.get_vlanid_and_vswitch_for_portgroup
- pg_vlanid, pg_vswitch = _get_pg_info(session, bridge, cluster)
- # Check if the vswitch associated is proper
- if pg_vswitch != vswitch_associated:
- raise exception.InvalidVLANPortGroup(
- bridge=bridge, expected=vswitch_associated,
- actual=pg_vswitch)
- # Check if the vlan id is proper for the port group
- //Vevb.com
- if pg_vlanid != vlan_num:
- raise exception.InvalidVLANTag(bridge=bridge, tag=vlan_num,
- pgroup=pg_vlanid)
- return network_ref
至于這個新建的網絡查詢為什么會失敗,我還沒想明白.
之后我就想,既然ESXi的標準交換機不支持分布式端口組,那么可以在cluster中的每一臺標準交換機上創建端口組(即網絡),這樣就不存在之前的調度失敗的問題.
嘗試著修改了vm_util.py中get_host_ref的代碼,將cluster中的所有ESXi主機都返回,由于有一些函數調用到get_host_ref,所以如果此時不修改之前的代碼邏輯,調用suds client去調用vSphere API獲取vSphere中某些對象屬性的時候,肯定會報錯.
這個時候,由于自己的粗心,沒有仔細分析日志,認為在一個session中不能獲取vSphere的多個對象,認為在每一個ESXi主機上創建端口組的方法不可行.
突然又想不能這么輕易放棄,如果不去這樣實現,那么就沒有更好的辦法了,靜下心來好好看了日志,發現之前的報錯,還沒有走到create_port_group這一步,于是從報錯的地方開始,把代碼邏輯逐個修改了.
最后創建網絡,創建虛機,發現一切OK.
新聞熱點
疑難解答