1. 程式人生 > >OpenStack實踐系列⑦深入理解neutron和虛擬機

OpenStack實踐系列⑦深入理解neutron和虛擬機

ice 賬號 由器 1.0 鏡像 多租戶 ridge 不同的 img

OpenStack實踐系列⑦深入理解neutron和虛擬機

五、深入理解Neutron

技術分享

5.1 虛擬機網卡和網橋

[[email protected] ~]# ifconfig 
brq65c11cc3-8e: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.3.199 netmask 255.255.255.0 broadcast 192.168.3.255
ether 00:50:56:3b:dc:7e txqueuelen 1000 (Ethernet)
RX packets 1790597 bytes 176851434
(168.6 MiB) RX errors 0 dropped 3 overruns 0 frame 0 TX packets 124754 bytes 46878133 (44.7 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether 00:50:56:3b:dc:7e txqueuelen 1000 (Ethernet) RX packets 3293092 bytes 1095327590 (1.0 GiB) RX errors
0 dropped 15 overruns 0 frame 0 TX packets 140212 bytes 54058900 (51.5 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1 (Local Loopback) RX packets 771917 bytes 210969292
(201.1 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 771917 bytes 210969292 (201.1 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 tap436a0452-af: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 ether 4a:a6:af:6e:63:47 txqueuelen 1000 (Ethernet) RX packets 11140 bytes 1616336 (1.5 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 1660822 bytes 165849927 (158.1 MiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [[email protected] ~]# brctl show bridge name bridge id STP enabled interfaces brq65c11cc3-8e 8000.0050563bdc7e no eth0 tap436a0452-af brq65c11cc3-8e(網橋):可以理解為一個小交換機,網橋上的設備都和eth0能通(數據鏈路層),其中tap436a0452-af作為虛擬機的網卡,從而實現通信

5.2 不同場景網絡類型和OpenStack網絡分層

5.2.1 Openstack網絡分類

技術分享

5.2.2Openstack網絡分層

首先網絡分層肯定是基於OSI七層模型的,在這裏就不在贅述,只對Openstack的網絡進行分層講解

網絡:在實際的物理環境下,我們使用交換機或者集線器把多個計算機連接起來形成了網絡,在Neutron的世界裏,網絡也是將多個不同的雲主機連接起來。
子網:在實際的物理環境下,在一個網絡中,我們可以將網絡劃分成多個邏輯子網,在Neutron的世界裏,子網也是路屬於網絡下的
端口:在實際的物理環境下,每個字子網或者每個網絡,都有很多的端口,比如交換機端口來供計算機鏈接,在Neutron的世界裏端口也是隸屬於子網下,雲主機的網卡會對應到一個端口上。
路由器:在實際的網絡環境下,不同網絡或者不同邏輯子網之間如果需要進行通信,需要通過路由器進行路由,在Neutron的實際裏路由也是這個作用,用來連接不同的網絡或者子網。
5.3 五種neutron常見的模型

單一平面網絡(也叫大二層網絡,最初的 nova-network 網絡模型)
單一平面網絡的缺點:
a.存在單一網絡瓶頸,缺乏可伸縮性。
b.缺乏合適的多租戶隔離。
c.容易發生廣播風暴,而且不能使用keepalived(vrrp組播)

技術分享

多平面網絡

技術分享

混合平面私有網絡

技術分享

通過私有網絡實現運營商路由功能

技術分享

通過私有網絡實現每個租戶創建自己專屬的網絡區段

技術分享

5.4 圖解Neutron服務的幾大組件

技術分享

ML2(The Modular Layer2):提供一個新的插件ML2,這個插件可以作為一個框架同時支持不同的2層網絡,類似於中間協調在作用,通過ml2
調用linuxbridge、openvswitch和其他商業的插件,保證了可以同時使用linuxbridge、openvswitch和其他商業的插件。
DHCP-Agent:為虛擬機分配IP地址,在創建虛擬機之前,創建了一個IP地址池,就是為了給虛擬機分配IP地址的。具體如下:

interface_driver = neutron.agent.linux.interface.BridgeInterfaceDriver

Dhcp-agent需要配置與plugin對應的interface_driver

dhcp_driver = neutron.agent.linux.dhcp.Dnsmasq

當啟動一個實例時,分配和配置(ip)的程序包含一個在dnsmasq config中儲存ip地址的進程,接著啟動或重載dnsmasq。通常,OpenStack在每個網絡中只有一個neutron-dhcp-agent負責spawn一個dnsmasq,所以一個龐大的網絡(包含所有子網)中只會有一個dnsmasq提供服務。理論上,並且根據實用的實驗室測試,dnsmasq應該能每秒處理1000個DHCP請求
enable_isolated_metadata = true 啟用獨立的metadata,後續會有說明

L3-agent:名字為neutron-l3-agent,為客戶機訪問外部網絡提供3層轉發服務。也部署在網絡節點上。
LBaas:負載均衡及服務。後續會有說明

六、虛擬機知多少
虛擬機對於宿主機來說,知識一個進程,通過libvirt調用kvm進行管理虛擬機,當然也可以使用virsh工具來管理虛擬機

查看所虛擬機的真實內容

切換到虛擬機默認的存放路徑

[[email protected] ~]# cd /var/lib/nova/instances/
[[email protected] instances]# ls
b6ba588b-494d-4055-ac8e-5c3978ba9150 _base compute_nodes locks

b6ba588b-494d-4055-ac8e-5c3978ba9150目錄為虛擬機的ID(可通過nova list查看),詳細內容如下
console.log 終端輸出到此文件中
disk 虛擬磁盤,後端文件/var/lib/nova/instances/_base/fed362a98366776009c94e3d0856df41750b4353,使用的是copy on write模式,基礎鏡像就是這裏的後端文件,只有變動的內容才放到disk文件中

[[email protected] b6ba588b-494d-4055-ac8e-5c3978ba9150]# file disk
disk: QEMU QCOW Image (v3), has backing file (path /var/lib/nova/instances/_base/fed362a98366776009c94e3d0856df417), 1073741824 bytes

[[email protected] b6ba588b-494d-4055-ac8e-5c3978ba9150]# qemu-img info disk
image: disk
file format: qcow2
virtual size: 1.0G (1073741824 bytes)
disk size: 2.4M
cluster_size: 65536
backing file: /var/lib/nova/instances/_base/fed362a98366776009c94e3d0856df41750b4353
Format specific information:
compat: 1.1
lazy refcounts: false

disk.info disk的詳情
[[email protected] b6ba588b-494d-4055-ac8e-5c3978ba9150]# qemu-img info disk.info
image: disk.info
file format: raw
virtual size: 512 (512 bytes)
disk size: 4.0K

libvirt.xml 就是libvirt自動生成的xml,不可以改動此xml,因為改了也沒什麽卵用,此xml是啟動虛擬機時動態生成的

compute_nodes記錄了主機名和時間戳
[[email protected] instances]# cat compute_nodes
{"node2.chinasoft.com": 1493295366.200245}

locks目錄:類似於寫shell腳本時的lock文件
學習metadata

metadata(元數據)
在創建虛擬機時可以添加或者修改虛擬機的默認屬性,例如主機名,key-pair,ip地址等
在新創建的虛擬機上查看metadata的數據,這些都是可以通過metadata生成
賬號cirros
密碼cubswin:)

[[email protected] instances]# ssh cirros@192.168.3.102
$ curl http://169.254.169.254/2009-04-04/meta-data
ami-id
ami-launch-index
ami-manifest-path
block-device-mapping/
hostname
instance-action
instance-id
instance-type
local-hostname
local-ipv4
placement/
public-hostname
public-ipv4
public-keys/
reservation-id
security-groups

查看路由
$ ip ro li
default via 192.168.3.1 dev eth0 
169.254.169.254 via 192.168.3.100 dev eth0 
192.168.3.0/24 dev eth0 src 192.168.3.102

在控制節點查看網絡的命名空間ns

[[email protected] instances]# ip netns li
qdhcp-65c11cc3-8efb-46de-8d14-690431835bae (id: 0)

查看上述ns的具體網卡情況,也就是在命名空間中使用ip ad li並查看端口占用情況

[[email protected] instances]# ip netns exec qdhcp-65c11cc3-8efb-46de-8d14-690431835bae ip ad li
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host 
valid_lft forever preferred_lft forever
2: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP qlen 1000
link/ether fa:16:3e:a3:76:b9 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.3.100/24 brd 192.168.3.255 scope global ns-436a0452-af
valid_lft forever preferred_lft forever
inet 169.254.169.254/16 brd 169.254.255.255 scope global ns-436a0452-af
valid_lft forever preferred_lft forever
inet6 fe80::f816:3eff:fea3:76b9/64 scope link 
valid_lft forever preferred_lft forever

[[email protected] instances]# ip netns exec qdhcp-65c11cc3-8efb-46de-8d14-690431835bae netstat -tunlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name 
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 2867/python2 
tcp 0 0 192.168.3.100:53 0.0.0.0:* LISTEN 10450/dnsmasq 
tcp 0 0 169.254.169.254:53 0.0.0.0:* LISTEN 10450/dnsmasq 
tcp6 0 0 fe80::f816:3eff:fea3:53 :::* LISTEN 10450/dnsmasq 
udp 0 0 192.168.3.100:53 0.0.0.0:* 10450/dnsmasq 
udp 0 0 169.254.169.254:53 0.0.0.0:* 10450/dnsmasq 
udp 0 0 0.0.0.0:67 0.0.0.0:* 10450/dnsmasq 
udp6 0 0 fe80::f816:3eff:fea3:53 :::* 10450/dnsmasq

總結
命名空間ns的ip地址dhcp服務分配的192.168.3.100而且還有一個169.254.169.254的ip,並在此啟用了一個http服務(不僅提供http,還提供dns解析等),命名空間在neutron的dhcp-agent配置文件中啟用了service_metadata_proxy = True而生效,
所以虛擬機的路由是命名空間通過dhcp推送(ip ro li查看出來的)的,key-pair就是通過命名空間在虛擬機生成時在/etc/rc.local中寫一個curl的腳本把key-pair定位到.ssh目錄下,並且改名即可,其他同理

OpenStack實踐系列⑦深入理解neutron和虛擬機