Neutron詳細介紹(純干貨)_第1頁
Neutron詳細介紹(純干貨)_第2頁
Neutron詳細介紹(純干貨)_第3頁
Neutron詳細介紹(純干貨)_第4頁
Neutron詳細介紹(純干貨)_第5頁
已閱讀5頁,還剩62頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

Neutron經典的三節點部署分三個網絡:ExternalNetwork/APINetwork,這個網絡是連接外網的,無論是用戶調用Openstack的API,還是創建出來的虛擬機要訪問外網,或者外網要ssh到虛擬機,都需要通過這個網絡DataNetwork,數據網絡,虛擬機之間的數據傳輸通過這個網絡來進行,比如一個虛擬機要連接另一個虛擬機,虛擬機要連接虛擬的路由都是通過這個網絡來進行ManagementNetwork,管理網絡,Openstack各個模塊之間的交互,連接數據庫,連接MessageQueue都是通過這個網絡來。架構neutron分成多個模塊分布在三個節點上。Controller節點:neutron-server,用于接受API請求創建網絡,子網,路由器等,然而創建的這些東西僅僅是一些數據結構在數據庫里面Network節點:neutron-l3-agent,用于創建和管理虛擬路由器,當neutron-server將路由器的數據結構創建好,它是做具體的事情的,真正的調用命令行將虛擬路由器,路由表,namespace,iptables規則全部創建好neutron-dhcp-agent,用于創建和管理虛擬DHCPServer,每個虛擬網絡都會有一個DHCPServer,這個DHCPServer為這個虛擬網絡里面的虛擬機提供IPneutron-openvswith-plugin-agent,這個是用于創建虛擬的L2的switch的,在Network節點上,Router和DHCPServer都會連接到二層的switch上Compute節點:neutron-openvswith-plugin-agent,這個是用于創建虛擬的L2的switch的,在Compute節點上,虛擬機的網卡也是連接到二層的switch上架構創建網絡#!/bin/bash

TENANT_NAME="openstack"

TENANT_NETWORK_NAME="openstack-net"

TENANT_SUBNET_NAME="${TENANT_NETWORK_NAME}-subnet"

TENANT_ROUTER_NAME="openstack-router"

FIXED_RANGE="/24"

NETWORK_GATEWAY=""PUBLIC_GATEWAY=""

PUBLIC_RANGE="/24"

PUBLIC_START="00"

PUBLIC_END="00"TENANT_ID=$(keystonetenant-list|grep"$TENANT_NAME"|awk'{print$2}')

(1)TENANT_NET_ID=$(neutronnet-create--tenant_id$TENANT_ID$TENANT_NETWORK_NAME--provider:network_typegre--provider:segmentation_id1|grep"id"|awk'{print$4}')

(2)TENANT_SUBNET_ID=$(neutronsubnet-create--tenant_id$TENANT_ID--ip_version4--name$TENANT_SUBNET_NAME$TENANT_NET_ID$FIXED_RANGE--gateway$NETWORK_GATEWAY--dns_nameserverslist=true|grep"id"|awk'{print$4}')

(3)ROUTER_ID=$(neutronrouter-create--tenant_id$TENANT_ID$TENANT_ROUTER_NAME|grep"id"|awk'{print$4}')(4)neutronrouter-interface-add$ROUTER_ID$TENANT_SUBNET_ID(5)neutronnet-createpublic--router:external=True(6)neutronsubnet-create--ip_version4--gateway$PUBLIC_GATEWAYpublic$PUBLIC_RANGE--allocation-poolstart=$PUBLIC_START,end=$PUBLIC_END--disable-dhcp--namepublic-subnet(7)neutronrouter-gateway-set${TENANT_ROUTER_NAME}public先從邏輯上理解虛擬網絡創建網絡為這個Tenant創建一個privatenetwork,不同的privatenetwork是需要通過VLANtagging進行隔離的,互相之間broadcast不能到達,這里我們用的是GRE模式,也需要一個類似VLANID的東西,稱為SegmentID創建一個privatenetwork的subnet,subnet才是真正配置IP網段的地方,對于私網,我們常常用/24這個網段為這個Tenant創建一個Router,才能夠訪問外網將privatenetwork連接到Router上創建一個ExternalNetwork創建一個ExernalNetwork的Subnet,這個外網邏輯上代表了我們數據中心的物理網絡,通過這個物理網絡,我們可以訪問外網。因而PUBLIC_GATEWAY應該設為數據中心里面的Gateway,PUBLIC_RANGE也應該和數據中心的物理網絡的CIDR一致,否則連不通,而之所以設置PUBLIC_START和PUBLIC_END,是因為在數據中心中,不可能所有的IP地址都給Openstack使用,另外可能搭建了VMwareVcenter,可能有物理機器,僅僅分配一個區間給Openstack來用。將Router連接到ExternalNetwork虛擬網絡的背后的實現GRE第一次看到這個圖太頭暈,不要緊,后面會慢慢解釋每一部分虛擬網絡的背后的實現VLANCompute節點Network節點更頭暈則接著忽略ipaddrovs-vsctlshowIpnetnsexecXXX把GRE和VLAN混在一塊,圖畫的不錯,顯然更暈怎么理解?回到大學寢室,或者你的家里是不是只有寢室長的電腦插兩塊網卡,要上網,寢室長的電腦必須開著其他寢室同學只需要一張網卡什么?你們寢室直接買路由器?好吧,暴露年齡了,2000年初的時候,路由器還是不普遍的那就把Computer1和switch合在一起,想象成你們家的路由器怎么理解?把寢室想象成物理機,電腦就變成了虛擬機室長的電腦或是路由器每個電腦都插的switch忽略qbr,虛擬機直接連到switch上怎么理解?物理機分開,統一的br-int斷開,如何連接ExternalNetworkPrivateNetworkSecurityGroupTapInterfaceInterconnectionNetworkBr-int分開了,在虛擬機眼里,還是同一個switch,至于物理機之間br-int怎么連在一起,虛擬機可不管。Br-int之下,是物理機之間的互聯,有各種方法,GRE,VLAN,VXLAN更加深入:TapInterfacevirshdumpxmlinstance-0000000c更加深入:TapInterfaceTap/TunDevice將guestsystem的網絡和hostsystem的網絡連在一起Tun/tap驅動程序中包含兩個部分,一部分是字符設備驅動,還有一部分是網卡驅動部分更加深入:SecurityGroupLayeriptables1、首先數據包進入,先進入mangle表的PREROUTING鏈,在這里可以根據需要改變數據包頭內容

2、之后進入nat表的PREROUTING鏈,在這里可以根據需要做DNAT,也就是目標地址轉換

3、進入路由判斷,判斷是進入本地的還是轉發的

1)如果進入本地的話進入INPUT鏈,之后按條件過濾限制進入

之后進入本機,在進入OUTPUT鏈,按條件過濾限制出去

離開本地

2)如果是轉發的話進入,進入FORWARD鏈,根據條件限制轉發

之后進入POSTROUTING鏈,這里可以做SNAT

離開網絡接口更加深入:SecurityGroupLayer1)filter表主要處理過濾功能的

INPUT鏈:過濾所有目標地址是本機的數據包

FORWARD鏈:過濾所有路過本機的數據包

OUTPUT鏈:過濾所有由本機產生的數據包

2)nat表主要處理網絡地址轉換,可以進行SNAT(改變數據包的源地址),DNAT(改變數據包的目標地址)

PREROUTING鏈:可以再數據包到達防火墻是改變目標地址

OUTPUT鏈:可以改變本地產生的數據包的目標地址

POSTROUTING鏈:在數據包離開防火墻是改變數據包的源地址

3)mangle表修改數據包:

包含PREROUTING鏈,INPUT鏈,FORWARD鏈,OUTPUT鏈,POSTROUTING鏈

這里mangle不做過多操作

還有一個表示raw表的,不常用的優先級raw-->mangle-->nat-->filter

raw最高,filter最低iptables默認操作的是filter表更加深入:SecurityGroupLayeriptables-nvL更加深入:br-int&br-tun由Openvswitch實現Openvswitch是一個virutalswitch,支持OpenFlow協議,當然也有一些硬件Switch也支持OpenFlow協議,他們都可以被統一的Controller管理,從而實現物理機和虛擬機的網絡聯通。更加深入:br-int&br-tunFlowTable包含許多entry,每個entry是對packet進行處理的規則MatchField涵蓋TCP/IP協議各層:Layer1–TunnelID,InPort,QoSpriority,skbmarkLayer2–MACaddress,VLANID,EthernettypeLayer3–IPv4/IPv6fields,ARPLayer4–TCP/UDP,ICMP,NDAction也主要包含下面的操作:Outputtoport(portrange,flood,mirror)Discard,ResubmittotablexPacketMangling(Push/PopVLANheader,TOS,...)Sendtocontroller,Learn更加深入:br-int&br-tun更加深入:br-int&br-tun更加深入:br-int&br-tun/etc/openvswitch/conf.db更加深入:br-int&br-tunbr-int主要使用openvswitch中port的vlan功能Port的一個重要的方面就是VLANConfiguration,有兩種模式:trunkport這個port不配置tag,配置trunks如果trunks為空,則所有的VLAN都trunk,也就意味著對于所有的VLAN的包,本身帶什么VLANID,就是攜帶者什么VLANID,如果沒有設置VLAN,就屬于VLAN0,全部允許通過。如果trunks不為空,則僅僅帶著這些VLANID的包通過。accessport這個port配置tag,從這個port進來的包會被打上這個tag如果從其他的trunkport中進來的本身就帶有VLANID的包,如果VLANID等于tag,則會從這個port發出從其他的accessport上來的包,如果tag相同,也會被forward到這個port從accessport發出的包不帶VLANID如果一個本身帶VLANID的包到達accessport,即便VLANID等于tag,也會被拋棄。更加深入:br-int&br-tunovs-vsctladd-brubuntu_briplinkaddfirst_brtypevethpeernamefirst_ifiplinkaddsecond_brtypevethpeernamesecond_ifiplinkaddthird_brtypevethpeernamethird_ifovs-vsctladd-portubuntu_brfirst_brovs-vsctladd-portubuntu_brsecond_brovs-vsctladd-portubuntu_brthird_brovs-vsctlsetPortvnet0tag=101ovs-vsctlsetPortvnet1tag=102ovs-vsctlsetPortvnet2tag=103ovs-vsctlsetPortfirst_brtag=103ovs-vsctlclearPortsecond_brtagovs-vsctlsetPortthird_brtrunks=101,102需要監聽ARP,所以禁止MAC地址學習ovs-vsctlsetbridgeubuntu_brflood-vlans=101,102,103從02來ping03,應該first_if和second_if能夠收到包從00在ping05,則second_if和third_if可以收到包從01來ping04,則second_if和third_if可以收到包更加深入:br-int&br-tunbr-tun主要使用openvswitch的tunnel功能和Flow功能Openvswitch支持三類Tunnelgrevxlanipsec_greovs-vsctladd-brtestbrovs-vsctladd-porttestbrgre0--setInterfacegre0type=greoptions:local_ip=00options:remote_ip=01ovs-vsctladd-porttestbrvxlan0--setInterfacevxlan0type=vxlanoptions:local_ip=00options:remote_ip=02ovs-vsctladd-porttestbripsec0--setInterfaceipsec0type=ipsec_greoptions:local_ip=01options:remote_ip=02options:psk=password更加深入:br-int&br-tun對于FlowTable的管理,由ovs-ofctl來控制add?flow

switchflowmod?flows

switchflowdel?flows

switch

[flow]主要控制兩類MatchFieldActions更加深入:br-int&br-tunMatchField更加深入:br-int&br-tunActions:output:port和output:NXM_NX_REG0[16..31]enqueue:port:queuemod_vlan_vid:vlan_vidstrip_vlanmod_dl_src:mac和mod_dl_dst:macmod_nw_src:ip和mod_nw_dst:ipmod_tp_src:port和mod_tp_dst:portset_tunnel:idresubmit([port],[table])move:src[start..end]?>dst[start..end]load:value?>dst[start..end]learn(argument[,argument]...)更加深入:br-int&br-tunroot@NetworkNodeCliu8:~#ovs-ofctldump-flowsbr-tunNXST_FLOWreply(xid=0x4)://in_port=1是指包是從patch-int,也即是從虛擬機來的,所以是發送規則,跳轉到table1cookie=0x0,duration=73932.142s,table=0,n_packets=12,n_bytes=1476,idle_age=3380,hard_age=65534,priority=1,in_port=1actions=resubmit(,1)//in_port=2是指包是從GRE來的,也即是從物理網絡來的,所以是接收規則,跳轉到table2cookie=0x0,duration=73914.323s,table=0,n_packets=9,n_bytes=1166,idle_age=3376,hard_age=65534,priority=1,in_port=2actions=resubmit(,2)cookie=0x0,duration=73930.934s,table=0,n_packets=0,n_bytes=0,idle_age=65534,hard_age=65534,priority=0actions=drop//multicast,跳轉到table21cookie=0x0,duration=73928.59s,table=1,n_packets=6,n_bytes=468,idle_age=65534,hard_age=65534,priority=0,dl_dst=01:00:00:00:00:00/01:00:00:00:00:00actions=resubmit(,21)//unicast,跳轉到table20cookie=0x0,duration=73929.695s,table=1,n_packets=3,n_bytes=778,idle_age=3380,hard_age=65534,priority=0,dl_dst=00:00:00:00:00:00/01:00:00:00:00:00actions=resubmit(,20)//這是接收規則的延續,如果接收的tun_id=0x1則轉換為本地的tag,mod_vlan_vid:1,跳轉到table10cookie=0x0,duration=73906.864s,table=2,n_packets=9,n_bytes=1166,idle_age=3376,hard_age=65534,priority=1,tun_id=0x1actions=mod_vlan_vid:1,resubmit(,10)cookie=0x0,duration=73927.542s,table=2,n_packets=0,n_bytes=0,idle_age=65534,hard_age=65534,priority=0actions=dropcookie=0x0,duration=73926.403s,table=3,n_packets=0,n_bytes=0,idle_age=65534,hard_age=65534,priority=0actions=dropcookie=0x0,duration=73925.611s,table=10,n_packets=9,n_bytes=1166,idle_age=3376,hard_age=65534,priority=1actions=learn(table=20,hard_timeout=300,priority=1,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:0->NXM_OF_VLAN_TCI[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:NXM_OF_IN_PORT[]),output:1cookie=0x0,duration=73924.858s,table=20,n_packets=0,n_bytes=0,idle_age=65534,hard_age=65534,priority=0actions=resubmit(,21)//這是發送規則的延續,如果接收到的dl_vlan=1,則轉換為物理網絡的segmentid=1,set_tunnel:0x1cookie=0x0,duration=73907.657s,table=21,n_packets=0,n_bytes=0,idle_age=65534,hard_age=65534,priority=1,dl_vlan=1actions=strip_vlan,set_tunnel:0x1,output:2cookie=0x0,duration=73924.117s,table=21,n_packets=6,n_bytes=468,idle_age=65534,hard_age=65534,priority=0actions=drop更加深入:br-int&br-tunovs-ofctlshowbr-tun查看portid更加深入:br-int&br-tun配置Flow刪除所有的FlowTable0從port1進來的,由table1處理從port2/3進來的,由Table3處理默認丟棄ovs-ofctldel-flowsbr-tunovs-ofctladd-flowbr-tun"hard_timeout=0idle_timeout=0priority=1in_port=1actions=resubmit(,1)"ovs-ofctladd-flowbr-tun"hard_timeout=0idle_timeout=0priority=1in_port=2actions=resubmit(,3)"ovs-ofctladd-flowbr-tun"hard_timeout=0idle_timeout=0priority=1in_port=3actions=resubmit(,3)"ovs-ofctladd-flowbr-tun"hard_timeout=0idle_timeout=0priority=0actions=drop"更加深入:br-int&br-tunTable1:對于單播,由table20處理對于多播,由table21處理Table2:默認丟棄ovs-ofctladd-flowbr-tun"hard_timeout=0idle_timeout=0priority=1table=1dl_dst=00:00:00:00:00:00/01:00:00:00:00:00actions=resubmit(,20)"ovs-ofctladd-flowbr-tun"hard_timeout=0idle_timeout=0priority=1table=1dl_dst=01:00:00:00:00:00/01:00:00:00:00:00actions=resubmit(,21)"ovs-ofctladd-flowbr-tun"hard_timeout=0idle_timeout=0priority=0table=2actions=drop"更加深入:br-int&br-tunTable3:默認丟棄TunnelID->VLANIDTable10:MAC地址學習ovs-ofctladd-flowbr-tun"hard_timeout=0idle_timeout=0priority=0table=3actions=drop"ovs-ofctladd-flowbr-tun"hard_timeout=0idle_timeout=0priority=1table=3tun_id=0x1actions=mod_vlan_vid:1,resubmit(,10)"ovs-ofctladd-flowbr-tun"hard_timeout=0idle_timeout=0priority=1table=3tun_id=0x2actions=mod_vlan_vid:2,resubmit(,10)"ovs-ofctladd-flowbr-tun"hard_timeout=0idle_timeout=0priority=1table=10actions=learn(table=20,priority=1,hard_timeout=300,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:0->NXM_OF_VLAN_TCI[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:NXM_OF_IN_PORT[]),output:1"table=10,priority=1actions=learn(table=20,hard_timeout=300,priority=1,NXM_OF_VLAN_TCI[0..11],NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[],load:0->NXM_OF_VLAN_TCI[],load:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[],output:NXM_OF_IN_PORT[]),output:1table=20,priority=2,dl_vlan=1,dl_dst=fa:16:3e:7e:ab:ccactions=strip_vlan,set_tunnel:0x3e9,output:2Table10是用來學習MAC地址的,學習的結果放在Table20里面,Table20被稱為MAClearningtableNXM_OF_VLAN_TCI這個是VLANTag,在MACLearningtable中,每一個entry都是僅僅對某一個VLAN來說的,不同VLAN的learningtable是分開的。在學習的結果的entry中,會標出這個entry是對于哪個VLAN的。NXM_OF_ETH_DST[]=NXM_OF_ETH_SRC[]這個的意思是當前包里面的MACSourceAddress會被放在學習結果的entry里面的dl_dst里面。這是因為每個switch都是通過Ingress包來學習,某個MAC從某個port進來,switch就應該記住以后發往這個MAC的包要從這個port出去,因而MACsourceaddress就被放在了Macdestinationaddress里面,因為這是為發送用的。load:0->NXM_OF_VLAN_TCI[]意思是發送出去的時候,vlantag設為0,所以結果中有actions=strip_vlanload:NXM_NX_TUN_ID[]->NXM_NX_TUN_ID[]意思是發出去的時候,設置tunnelid,進來的時候是多少,發送的時候就是多少,所以結果中有set_tunnel:0x3e9output:NXM_OF_IN_PORT[]意思是發送給哪個port,由于是從port2進來的,因而結果中有output:2學習指令學習結果更加深入:br-int&br-tunTable20:這個是MACAddressLearningTable,如果不空就按照規則處理如果為空,就使用默認規則,交給Table21處理Table21:默認丟棄VLANID->TunnelIDovs-ofctladd-flowbr-tun"hard_timeout=0idle_timeout=0priority=0table=20actions=resubmit(,21)"ovs-ofctladd-flowbr-tun"hard_timeout=0idle_timeout=0priority=0table=21actions=drop"ovs-ofctladd-flowbr-tun"hard_timeout=0idle_timeout=0priority=1table=21dl_vlan=1actions=strip_vlan,set_tunnel:0x1,output:2,output:3"ovs-ofctladd-flowbr-tun"hard_timeout=0idle_timeout=0priority=1table=21dl_vlan=2actions=strip_vlan,set_tunnel:0x2,output:2,output:3"更加深入:br-int&br-tunFlowTable可以debugovs-appctlofproto/tracehelloworldin_port=1,dl_vlan=30,dl_src=10:00:00:00:00:01,dl_dst=20:00:00:00:00:01-generate更加深入:DHCPServerpsaux|grepdnsnobody69100.00.0282041080?SOct150:06dnsmasq--no-hosts--no-resolv--strict-order--bind-interfaces--interface=tap7c15f5a3-61--except-interface=lo--pid-file=/var/lib/neutron/dhcp/c27610cb-4a60-41ec-bd9d-3cd732f42cd6/pid--dhcp-hostsfile=/var/lib/neutron/dhcp/c27610cb-4a60-41ec-bd9d-3cd732f42cd6/host--addn-hosts=/var/lib/neutron/dhcp/c27610cb-4a60-41ec-bd9d-3cd732f42cd6/addn_hosts--dhcp-optsfile=/var/lib/neutron/dhcp/c27610cb-4a60-41ec-bd9d-3cd732f42cd6/opts--leasefile-ro--dhcp-range=set:tag0,,static,86400s--dhcp-lease-max=256--conf-file=--domain=openstacklocal#cat/var/lib/neutron/dhcp/c27610cb-4a60-41ec-bd9d-3cd732f42cd6/hostfa:16:3e:26:e5:e5,host-10-10-10-1.openstacklocal,fa:16:3e:be:40:73,host-10-10-10-5.openstacklocal,fa:16:3e:3c:92:1e,host-10-10-10-8.openstacklocal,更加深入:Router使用namespace中的routingtableFloatingIP使用namespace中的iptables的natipnetnsexecqrouter-5a74908c-712c-485c-aa9f-6c1e8b57e3e1route-nKernelIProutingtableDestinationGatewayGenmaskFlagsMetricRefUseIfaceUG000qg-52de6441-dbU000qr-e0967604-78U000qg-52de6441-dbipnetnsexecqrouter-5a74908c-712c-485c-aa9f-6c1e8b57e3e1iptables-tnat-nvL更加深入:br-ex將namespace中的網絡和namespace外的網絡連接起來虛擬機網絡問題調試1.SecurityGroup全部打開,這是最基本的,但是很多人容易忘記虛擬機網絡問題調試2.通過界面查看虛擬機的log,也可以在compute節點上查看console.log文件,看看里面是否有DHCP獲取IP成功的日志/var/lib/nova/instances/6323a941-de10-4ed3-9e2f-1b2b25e79b66/console.log如果沒有日志,則說明image有問題在grub里面linux/boot/vmlinuz-3.2.0-49-virtualroot=UUID=6d2231e4-0975-4f35-a94f-56738c1a8150roconsole=ttyS0GRUB_CMDLINE_LINUX_DEFAULT="console=ttyS0“update-grub虛擬機網絡問題調試3.如果虛擬機連不上DHCPServer,則需要準備一個不使用metadataserver,而是用用戶名密碼可以登錄的image虛擬機網絡問題調試4.通過VNC登錄虛擬機網絡問題調試5.如果VNC登錄不進去,方法一配置VNC虛擬機網絡問題調試VNCProxy的功能:將公網(publicnetwork)和私網(privatenetwork)隔離VNCclient運行在公網上,VNCServer運行在私網上,VNCProxy作為中間的橋梁將二者連接起來VNCProxy通過token對VNCClient進行驗證VNCProxy不僅僅使得私網的訪問更加安全,而且將具體的VNCServer的實現分離,可以支持不同Hypervisor的VNCServer但不影響用戶體驗VNCProxy的部署在Controller節點上部署nova-consoleauth進程,用于Token驗證在Controller節點上部署nova-novncproxy服務,用戶的VNCClient會直接連接這個服務Controller節點一般有兩張網卡,連接到兩個網絡,一張用于外部訪問,我們稱為publicnetwork,或者APInetwork,這張網卡的IP地址是外網IP,如圖中,另外一張網卡用于openstack各個模塊之間的通信,稱為managementnetwork,一般是內網IP,如圖中在Compute節點上部署nova-compute,在nova.conf文件中有下面的配置vnc_enabled=Truevncserver_listen=//VNCServer的監聽地址vncserver_proxyclient_address=//novavncproxy是通過內網IP來訪問vncserver的,所以nova-compute會告知vncproxy用這個IP來連接我。novncproxy_base_url=:6080/vnc_auto.html//這個url是返回給客戶的url,因而里面的IP是外網IP虛擬機網絡問題調試VNCProxy的運行過程:一個用戶試圖從瀏覽器里面打開連接到虛擬機的VNCClient瀏覽器向nova-api發送請求,要求返回訪問vnc的urlnova-api調用nova-compute的getvncconsole方法,要求返回連接VNC的信息nova-compute調用libvirt的getvncconsole函數libvirt會通過解析虛擬機運行的/etc/libvirt/qemu/instance-0000000c.xml文件來獲得VNCServer的信息libvirt將host,port等信息以json格式返回給nova-computenova-compute會隨機生成一個UUID作為Tokennova-compute將libvirt返回的信息以及配置文件中的信息綜合成connect_info返回給nova-apinova-api會調用nova-consoleauth的authorize_console函數nova-consoleauth會將instance–>token,token–>connect_info的信息cache起來nova-api將connect_info中的accessurl信息返回給瀏覽器:http://:6080/vnc_auto.html?token=7efaee3f-eada-4731-a87c-e173cbd25e98&title=helloworld%289169fdb2-5b74-46b1-9803-60d2926bd97c%29瀏覽器會試圖打開這個鏈接這個鏈接會將請求發送給nova-novncproxynova-novncproxy調用nova-consoleauth的check_token函數nova-consoleauth驗證了這個token,將這個instance對應的connect_info返回給nova-novncproxynova-novncproxy通過connect_info中的host,port等信息,連接compute節點上的VNCServer,從而開始了proxy的工作虛擬機網絡問題調試6.如果VNC登錄不進去,方法二,使用自己的VNCClientlibvirt+133500.01.668438121102668?SlOct1713:58qemu-system-x86_64-enable-kvm-nameinstance-0000001c-S-machinepc-i440fx-trusty,accel=kvm,usb=off-cpuSandyBridge,+erms,+smep,+fsgsbase,+pdpe1gb,+rdrand,+f16c,+osxsave,+dca,+pcid,+pdcm,+xtpr,+tm2,+est,+smx,+vmx,+ds_cpl,+monitor,+dtes64,+pbe,+tm,+ht,+ss,+acpi,+ds,+vme-m2048-realtimemlock=off-smp1,sockets=1,cores=1,threads=1-uuideaad48ce-5f85-475a-a764-97de115808f4-smbiostype=1,manufacturer=OpenStackFoundation,product=OpenStackNova,version=2014.1.1,serial=80590690-87d2-e311-b1b0-a0481cabdfb4,uuid=eaad48ce-5f85-475a-a764-97de115808f4-no-user-config-nodefaults-chardevsocket,id=charmonitor,path=/var/lib/libvirt/qemu/instance-0000001c.monitor,server,nowait-monchardev=charmonitor,id=monitor,mode=control-rtcbase=utc,driftfix=slew-globalkvm-pit.lost_tick_policy=discard-no-hpet-no-shutdown-bootstrict=on-devicepiix3-usb-uhci,id=usb,bus=pci.0,addr=0x1.0x2-drivefile=/var/lib/nova/instances/eaad48ce-5f85-475a-a764-97de115808f4/disk,if=none,id=drive-virtio-disk0,format=qcow2,cache=none-devicevirtio-blk-pci,scsi=off,bus=pci.0,addr=0x4,drive=drive-virtio-disk0,id=virtio-disk0,bootindex=1-netdevtap,fd=25,id=hostnet0,vhost=on,vhostfd=30-devicevirtio-net-pci,netdev=hostnet0,id=net0,mac=fa:16:3e:eb:0d:16,bus=pci.0,addr=0x3-chardevfile,id=charserial0,path=/var/lib/nova/instances/eaad48ce-5f85-475a-a764-97de115808f4/console.log-deviceisa-serial,chardev=charserial0,id=serial0-chardevpty,id=charserial1-deviceisa-serial,chardev=charserial1,id=serial1-deviceusb-tablet,id=input0-vnc:5

-ken-us-devicecirrus-vga,id=video0,bus=pci.0,addr=0x2-devicevirtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x5虛擬機網絡問題調試7.通過ovs-vsctlshow和brctl來查看,各個網卡和bridge之間關系是否正確,tunnel之間是否能夠通,網卡是否都處于up的狀態虛擬機網絡問題調試8.如果從虛擬機的虛擬網卡到DHCPServer的網卡一路都是正確的,則需要查看br-tun上ovs-ofctldumpflows查看flows規則,是否對包的改寫正確,是否有正確的規則虛擬機網絡問題調試9.通過VNC登錄進去后,就可以通過命令行運行dhclient,來重啟連接DHCPServer,從compute節點上的網卡和bridge,一個個進行tcpdump,看到底哪個網卡或者bridge沒有收到包,收到的包里面的VLANID等是否正確虛擬機網絡問題調試10.如果VM能從DHCPServer獲得IP,則好事成了一半,接下來換一個有cloud-init的image,看metadataserver能夠連接成功,能夠注入key,也是通過console.log來看虛擬機網絡問題調試11.如果metadataserver不能連接成功,就需要順著metadataserver的整個流程,一個一個模塊看,看每個模塊的log,端口是否正確,是否收到請求,也可以在VM里面用curl來模擬metadataserver的請求openstack里的metadata,是提供一個機制給用戶,可以設定每一個instance的參數。比如你想給instance設置某個屬性,比如主機名。Instance訪問metadataserver54兩類API:OpenStackmetadataAPIvs.EC2-compatibleAPI.虛擬機網絡問題調試metadatauserdata虛擬機網絡問題調試metadata的一個重要應用,是設置每個instance的ssh公鑰。公鑰的設置有兩種方式:1、創建instance時注入文件鏡像2、啟動instance后,通過metadata獲取,然后用腳本寫入第二種方式更加靈活,可以給非root用戶注入公鑰。以下是獲取sshkey的代碼片段:虛擬機網絡問題調試獲取metadata的api接口是:54/latest/meta-data/public-keys/0/openssh-key這個IP地址,在openstack是不存在的。為什么可以獲取到metadata呢?這是由于Amazon的原因,最早metadata是亞馬遜提出來的,參見:/AWSEC2/latest/UserGuide/AESDG-chapter-instancedata.html后來很多人給亞馬遜定制了一些操作系統的鏡像,比如ubuntu,fedora,centos等等,而且將里面獲取metadta的api地址也寫死了。所以opentack為了兼容,保留了這個地址54。然后通過iptablesnat映射到真實的api上:iptables-Anova-network-PREROUTING-d54/32-ptcp-mtcp--dport80-jDNAT--to-destination97:8775虛擬機網絡問題調試舊版本的實現機制在Network節點上,配置/etc/nova/nova.confmetadata_host=9797是Managementnetwork在Network節點上,要能夠連接這個IPMetadataServer是通過Instance的FixIP來判斷,所以請求一定要在虛擬機里面執行虛擬機網絡問題調試新版本的實現機制在使用namespace時就不生效了,因為namespace支持IP地址重疊,這樣nova就無法區分到底是哪個虛擬機請求metadata。采取的方法是在HTTP頭部識別是哪個虛擬機。加入了兩個服務:neutron-ns-metadata-proxyneutron-metadata-agent在/etc/nova/nova.conf中配置#metadataneutron_metadata_proxy_shared_secret=passwordservice_neutron_metadata_proxy=truemetadata_listen=97metadata_listen_port=8775虛擬機網絡問題調試一個虛擬機訪問54的流程如下圖:虛擬機網絡問題調試First,虛擬機發出請求虛擬機啟動時會訪問54數據包會直接發送到虛擬機的默認網關默認網關在networknode上,qr-XXXXXSecond,namespace中的iptables因為使用了namespace,在networknode上每個namespace里都會有相應的iptables規則和網絡設備。iptables規則中,會把目的地址54的數據包,重定向到本地端口9697ipnetnsexecqrouter-5a74908c-712c-485c-aa9f-6c1e8b57e3e1iptables-tnat-nvL虛擬機網絡問題調試Third,namespace-metadata-proxy啟用namespace場景下,對于每一個router,都會創建這樣一個進程。該進程監聽9697端口,其主要功能:1、向請求頭部添加X-Forwarded-For和X-Neutron-Router-ID,分別表示虛擬機的fixedIP和router的ID2、將請求代理至Unixdomainsocket(/var/lib/neutron/metadata_proxy)/usr/bin/pyt

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論