成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

深入理解Openstack之Basic Use Cases

云計算 OpenStack
在上一篇文章中,我們了解了幾個網絡組件,如openvswitch/network namespace/Linux bridges/veth pairs。這篇文章中,我們將用3個簡單的use case,展示這些基本網絡組件如何以工作從而實現openstack的SDN方案。

在上一篇文章中,我們了解了幾個網絡組件,如openvswitch/network namespace/Linux bridges/veth pairs。這篇文章中,我們將用3個簡單的use case,展示這些基本網絡組件如何以工作從而實現openstack的SDN方案。

在這些use case中,我們會了解整個網絡配置和他們如何一起運行。use case如下:

  1. 創建網絡——我們創建網絡時,發生了什么。如何創建多個隔離的網絡。
  2. 創建虛擬機——一旦我們有了網絡,我們可以創建虛擬機并將其接入網絡。
  3. 虛擬機的DHCP請求——opensack可以自動為虛擬機配置IP。通過openstack neutron控制的DHCP服務完成。我們來了解這個服務如何運行,DHCP請求和回應是什么樣子的?

這篇文章中,我們會展示網絡連接的原理,我們會了解網絡包如何從A到B。我們先了解已經完成的網絡配置是什么樣子的?然后我們討論這些網絡配置是如何以及何時創建的?我個人認為,通過例子和具體實踐看到真實的網絡接口如何工作以及如何將他們連接起來是非常有價值的。然后,一切真相大白,我們知道網絡連接如何工作,在后邊的文章中,我將進一步解釋neutron如何配置這些組件,從而提供這樣的網絡連接能力。

我推薦在你自己的環境上嘗試這些例子或者使用Oracle Openstack Tech Preview。完全理解這些網絡場景,對我們調查openstack環境中的網絡問題非常有幫助。

Use case #1: Create Network

創建network的操作非常簡單。我們可以使用GUI或者命令行完成。openstack的網絡僅供創建該網絡的租戶使用。當然如果這個網絡是“shared”,它也可以被其他所有租戶使用。一個網絡可以有多個subnets,但是為了演示目的和簡單,我們僅為每一個network創建一個subnet。通過命令行創建network:

  1. # neutron net-create net1 
  2.  
  3. Created a new network: 
  4.  
  5. +---------------------------+--------------------------------------+ 
  6.  
  7. | Field                     | Value                                | 
  8.  
  9. +---------------------------+--------------------------------------+ 
  10.  
  11. | admin_state_up            | True                                 | 
  12.  
  13. | id                        | 5f833617-6179-4797-b7c0-7d420d84040c | 
  14.  
  15. | name                      | net1                                 | 
  16.  
  17. | provider:network_type     | vlan                                 | 
  18.  
  19. | provider:physical_network | default                              | 
  20.  
  21. | provider:segmentation_id  | 1000                                 | 
  22.  
  23. | shared                    | False                                | 
  24.  
  25. | status                    | ACTIVE                               | 
  26.  
  27. | subnets                   |                                      | 
  28.  
  29. | tenant_id                 | 9796e5145ee546508939cd49ad59d51f     | 
  30.  
  31. +---------------------------+--------------------------------------+ 

為這個network創建subnet::

  1. # neutron subnet-create net1 10.10.10.0/24 
  2.  
  3. Created a new subnet: 
  4.  
  5. +------------------+------------------------------------------------+ 
  6.  
  7. | Field            | Value                                          | 
  8.  
  9. +------------------+------------------------------------------------+ 
  10.  
  11. | allocation_pools | {"start""10.10.10.2""end""10.10.10.254"} | 
  12.  
  13. | cidr             | 10.10.10.0/24                                  | 
  14.  
  15. | dns_nameservers  |                                                | 
  16.  
  17. | enable_dhcp      | True                                           | 
  18.  
  19. | gateway_ip       | 10.10.10.1                                     | 
  20.  
  21. | host_routes      |                                                | 
  22.  
  23. | id               | 2d7a0a58-0674-439a-ad23-d6471aaae9bc           | 
  24.  
  25. | ip_version       | 4                                              | 
  26.  
  27. | name             |                                                | 
  28.  
  29. | network_id       | 5f833617-6179-4797-b7c0-7d420d84040c           | 
  30.  
  31. | tenant_id        | 9796e5145ee546508939cd49ad59d51f               | 
  32.  
  33. +------------------+------------------------------------------------+ 

現在我們有了一個network和subnet,網絡拓撲像這樣:

現在讓我們深入看下到底發生了什么?在控制節點,我們一個新的namespace被創建: 

  1. # ip netns list 
  2.  
  3. qdhcp-5f833617-6179-4797-b7c0-7d420d84040c 

這個namespace的名字是qdhcp- (參見上邊),讓我們深入namespace中看看有什么?

  1. # ip netns exec qdhcp-5f833617-6179-4797-b7c0-7d420d84040c ip addr 
  2.  
  3. 1: lo:  mtu 65536 qdisc noqueue state UNKNOWN 
  4.  
  5.     link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
  6.  
  7.     inet 127.0.0.1/8 scope host lo 
  8.  
  9.     inet6 ::1/128 scope host 
  10.  
  11.        valid_lft forever preferred_lft forever 
  12.  
  13. 12: tap26c9b807-7c:  mtu 1500 qdisc noqueue state UNKNOWN 
  14.  
  15.     link/ether fa:16:3e:1d:5c:81 brd ff:ff:ff:ff:ff:ff 
  16.  
  17.     inet 10.10.10.3/24 brd 10.10.10.255 scope global tap26c9b807-7c 
  18.  
  19.     inet6 fe80::f816:3eff:fe1d:5c81/64 scope link 
  20.  
  21.        valid_lft forever preferred_lft forever 

我們發下在namespace下有兩個網絡接口,一個是loop設備,另一個叫“tap26c9b807-7c”。這個接口設置了IP地址 10.10.10.3,他會接收dhcp請求(后邊會講)。接下來我們來跟蹤下“tap26c9b807-7c”的網絡連接性。我們從OVS上看下這個接 口所連接的OVS網橋"br-int"。

  1. # ovs-vsctl show 
  2. 8a069c7c-ea05-4375-93e2-b9fc9e4b3ca1 
  3.     Bridge "br-eth2" 
  4.         Port "br-eth2" 
  5.             Interface "br-eth2" 
  6.                 type: internal 
  7.         Port "eth2" 
  8.             Interface "eth2" 
  9.         Port "phy-br-eth2" 
  10.             Interface "phy-br-eth2" 
  11.     Bridge br-ex 
  12.         Port br-ex 
  13.             Interface br-ex 
  14.                 type: internal 
  15.     Bridge br-int 
  16.         Port "int-br-eth2" 
  17.             Interface "int-br-eth2" 
  18.         Port "tap26c9b807-7c" 
  19.             tag: 1 
  20.             Interface "tap26c9b807-7c" 
  21.                 type: internal 
  22.         Port br-int 
  23.             Interface br-int 
  24.                 type: internal 
  25.     ovs_version: "1.11.0" 

由上可知,veth pair的兩端“int-br-eth2” 和 "phy-br-eth2",這個veth pari連接兩個OVS網橋"br-eth2"和"br-int"。上一篇文章中,我們解釋過如何通過ethtool命令查看veth pairs的兩端。就如下邊的例子:

  1. # ethtool -S int-br-eth2 
  2. NIC statistics: 
  3.      peer_ifindex: 10 
  4.   
  5. #ip link 
  6. 10: phy-br-eth2:  mtu 1500 qdisc pfifo_fast state UP qlen 1000 

注意“phy-br-eth2”連接到網橋"br-eth2",這個網橋的一個網口是物理網卡eth2。這意味著我們創建的網絡創建了一個連接到了物理網卡eth2的namespace。eth2所在的虛擬機網絡會連接所有的虛擬機的。

關于網絡隔離:

Openstack支持創建多個隔離的網絡,也可以使用多種機制完成網絡間的彼此隔離。這些隔離機制包括 VLANs/VxLANs/GRE tunnels,這個在我們部署openstack環境時配置。本文中我們選擇了VLANs。當使用VLAN標簽作為隔離機制,Neutron會從預定義 好的VLAN池中選擇一個VLAN標簽,并分配給一個新創建的network。通過分配VLAN標簽給network,Neutron允許在一個物理網卡 上創建多個隔離的網絡。與其他的平臺的***的區別是,用戶不需要負責管理VLAN如何分配給networks。Neutron會負責管理分配VLAN標 簽,并負責回收。在我們的例子中,net1使用VLAN標簽1000,這意味著連接到該網絡的虛擬機,發出的包會被打上VLAN標簽1000然后發送到物 理網絡中。對namespace也是同樣的,如果我們希望namespace連接到某個特定網絡,我們需要確保這個namespace發出的/接收的包被 正確的打上了標簽。

在上邊的例子中,namespace中的網絡接口“tap26c9b807-7c”被分配了VLAN標簽1。如果我們從 OVS觀察下,會發現VLAN1會被改為VLAN1000,當包進入eth2所在的uxniji網絡。反之亦然。我們通過OVS的dump-flows命 令可以看到進入虛擬機網絡的網絡包在br-eth2上進行了VLAN標簽的修改:

  1. #  ovs-ofctl dump-flows br-eth2 
  2. NXST_FLOW reply (xid=0x4): 
  3.  cookie=0x0, duration=18669.401s, table=0, n_packets=857, n_bytes=163350, idle_age=25, priority=4,in_port=2,dl_vlan=1 actions=mod_vlan_vid:1000,NORMAL 
  4.  cookie=0x0, duration=165108.226s, table=0, n_packets=14, n_bytes=1000, idle_age=5343, hard_age=65534, priority=2,in_port=2 actions=drop 
  5.  cookie=0x0, duration=165109.813s, table=0, n_packets=1671, n_bytes=213304, idle_age=25, hard_age=65534, priority=1 actions=NORMAL 

從網絡接口到namespace我們看到VLAN標簽的修改如下:

  1. #  ovs-ofctl dump-flows br-int 
  2. NXST_FLOW reply (xid=0x4): 
  3.  cookie=0x0, duration=18690.876s, table=0, n_packets=1610, n_bytes=210752, idle_age=1, priority=3,in_port=1,dl_vlan=1000 actions=mod_vlan_vid:1,NORMAL 
  4.  cookie=0x0, duration=165130.01s, table=0, n_packets=75, n_bytes=3686, idle_age=4212, hard_age=65534, priority=2,in_port=1 actions=drop 
  5.  cookie=0x0, duration=165131.96s, table=0, n_packets=863, n_bytes=160727, idle_age=1, hard_age=65534, priority=1 actions=NORMAL 

總之,當用戶創建network,neutrong會創建一個namespace,這個namespace通過OVS連接到虛擬機網絡。OVS還負 責namespace與虛擬機網絡之間VLAN標簽的修改。現在,讓我們看下創建虛擬機時,發生了什么?虛擬機是怎么連接到虛擬機網絡的?

#p#

Use case #2: Launch a VM

從Horizon或者命令行創建并啟動一個虛擬機,下圖是從Horzion創建的例子:

掛載網絡并啟動虛擬機:

[[123512]]

一旦虛擬機啟動并運行,我們發下nova支持給虛擬機綁定IP:

  1. # nova list 
  2. +--------------------------------------+--------------+--------+------------+-------------+-----------------+ 
  3. | ID                                   | Name         | Status | Task State | Power State | Networks        | 
  4. +--------------------------------------+--------------+--------+------------+-------------+-----------------+ 
  5. | 3707ac87-4f5d-4349-b7ed-3a673f55e5e1 | Oracle Linux | ACTIVE | None       | Running     | net1=10.10.10.2 | 
  6. +--------------------------------------+--------------+--------+------------+-------------+-----------------+ 

nova list命令顯示虛擬機在運行中,并被分配了IP 10.10.10.2。我們通過虛擬機定義文件,查看下虛擬機與虛擬機網絡之間的連接性。虛擬機的配置文件在目錄/var/lib/nova /instances//下可以找到。通過查看虛擬機定義文件,libvirt.xml,我們可以看到虛擬機連接到網絡接口 “tap53903a95-82”,這個網絡接口連接到了Linux網橋 “qbr53903a95-82”:

  1. <interface type="bridge"
  2.       <mac address="fa:16:3e:fe:c7:87"/> 
  3.       <source bridge="qbr53903a95-82"/> 
  4.       <target dev="tap53903a95-82"/> 
  5.     </interface

通過brctl查看網橋信息如下:

  1. # brctl show 
  2. bridge name     bridge id               STP enabled     interfaces 
  3. qbr53903a95-82          8000.7e7f3282b836       no              qvb53903a95-82 
  4.                                                         tap53903a95-82 

網橋有兩個網絡接口,一個連接到虛擬機(“tap53903a95-82 “),另一個( “qvb53903a95-82”)連接到OVS網橋”br-int"。

  1. # ovs-vsctl show 
  2. 3c42f80-77e9-46c8-8560-7697d76de51c 
  3.    Bridge "br-eth2" 
  4.        Port "br-eth2" 
  5.            Interface "br-eth2" 
  6.                type: internal 
  7.        Port "eth2" 
  8.            Interface "eth2" 
  9.        Port "phy-br-eth2" 
  10.            Interface "phy-br-eth2" 
  11.    Bridge br-int 
  12.        Port br-int 
  13.            Interface br-int 
  14.                type: internal 
  15.        Port "int-br-eth2" 
  16.            Interface "int-br-eth2" 
  17.        Port "qvb53903a95-82" 
  18.            tag: 3 
  19.            Interface "qvb53903a95-82" 
  20.    ovs_version: "1.11.0" 

我們之前看過,OVS網橋“br-int"連接到"br-eth2",通過veth pair(int-br-eth2,phy-br-eth2 ),br-eth2連接到物理網卡eth2。整個流入如下:

  1. VM  ->  tap53903a95-82 (virtual interface)  ->  qbr53903a95-82 (Linux bridge)  ->  qvb53903a95-82 (interface connected from Linux bridge to OVS bridge br-int)  ->  int-br-eth2 (veth one end)  ->  phy-br-eth2 (veth the other end)  ->  eth2 physical interface

與虛擬機相連的Linux bridage主要用于基于Iptables的安全組設置。安全組用于對虛擬機的網絡隔離進行增強,由于iptables不能用于OVS網橋,因此我們使用了Linux網橋。后邊我們會看到Linux網橋的規則設置。

VLAN tags:我們在***個use case中提到過,net1使用VLAN標簽1000,通過OVS我們看到qvo41f1ebcf-7c使用VLAN標簽3。VLAN標簽從3到1000 的轉換在OVS中完成,通過br-eth2中實現。 總結如下,虛擬機通過一組網絡設備連入虛擬機網絡。虛擬機和網絡之間,VLAN標簽被修改。

#p#

Use case #3: Serving a DHCP request coming from the virtual machine

之前的use case中,我們看到了一個叫dhcp-的namespace和虛擬機,兩者最終連接到物理網絡eth2。他們都會被打上VLAN標簽1000。我們看到該namespace中的網絡接口使用IP 10.10.10.3。因為虛擬機和namespace彼此連接并在相同子網,因此可以ping到對方。如下圖,虛擬機中網絡接口被分配了IP 10.10.10.2,我們嘗試ping namespace中的網絡接口的IP:

[[123511]]

namespace與虛擬機之間連通,并且可以互相ping通,對于定位問題非常有用。我們可以從虛擬機ping通namespace,可以使用tcpdump或其他工具定位網絡中斷問題。

為了響應虛擬機的dhcp請求,Neutron使用了”dnsmasq“的Linux工具,這個工具是一個輕量的DNS、DHCP服務,

  1. dnsmasq --no-hosts --no-resolv --strict-order --bind-interfaces --interface=tap26c9b807-7c --except-interface=lo --pid-file=/var/lib/neutron/dhcp/5f833617-6179-4797-b7c0-7d420d84040c/pid --dhcp-hostsfile=/var/lib/neutron/dhcp/5f833617-6179-4797-b7c0-7d420d84040c/host --dhcp-optsfile=/var/lib/neutron/dhcp/5f833617-6179-4797-b7c0-7d420d84040c/opts --leasefile-ro --dhcp-range=tag0,10.10.10.0,static,120s --dhcp-lease-max=256 --conf-file= --domain=openstacklocal 

DHCP服務在namespace中連接到了一個tap接口(“--interface=tap26c9b807-7c”),從hosts文件我們可以看到:

  1. # cat  /var/lib/neutron/dhcp/5f833617-6179-4797-b7c0-7d420d84040c/host 
  2. fa:16:3e:fe:c7:87,host-10-10-10-2.openstacklocal,10.10.10.2 

之前的console輸出可以看到虛擬機MAC為fa:16:3e:fe:c7:87 。這個mac地址與IP 10.10.10.2 關聯,當包含該MAC的DHCP請求到達,dnsmasq返回10.10.10.2。在這個初始過程(可以重啟網絡服務觸發)中從namespace中 看,可以看到如下的DHCP請求:

  1. # ip netns exec qdhcp-5f833617-6179-4797-b7c0-7d420d84040c tcpdump -n 
  2. 19:27:12.191280 IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from fa:16:3e:fe:c7:87, length 310 
  3. 19:27:12.191666 IP 10.10.10.3.bootps > 10.10.10.2.bootpc: BOOTP/DHCP, Reply, length 325 

總之,DHCP服務由dnsmasq提供,這個服務由Neutron配置,監聽在DHCP namespace中的網絡接口上。Neutron還配置dnsmasq中的MAC/IP映射關系,所以當DHCP請求時會受到分配給它的IP。

總結

本文,我們基于之前講解的各種網絡組件,分析了三種use case下網絡如何連通的。這些use cases對了解整個網絡棧以及了解虛擬機/計算節點/DHCP namespace直接如何連通很有幫助。

根據我們的分析,我們確信啟動虛擬機、虛擬機發出DHCP請求、虛擬機收到正確的IP后這個網絡按照我們預想的工作。我們看到一個包經過一長串路徑最終到達目的地,如果這一切成功,意味著這些組件功能正常。

原文出自:http://blog.csdn.net/halcyonbaby/article/details/41578293

責任編輯:Ophira 來源: 追尋神跡的博客
相關推薦

2014-12-04 14:01:54

openstacknetworkneutron

2014-12-03 13:10:10

openstacknetworkneutron

2016-09-01 12:37:13

OpenStack虛擬機Metadata

2021-02-17 11:25:33

前端JavaScriptthis

2014-11-27 15:32:31

openstacknetworkovs

2017-05-04 15:36:54

Openstack Q實現實踐

2018-12-27 12:34:42

HadoopHDFS分布式系統

2019-03-18 09:50:44

Nginx架構服務器

2022-09-05 22:22:00

Stream操作對象

2016-12-08 15:36:59

HashMap數據結構hash函數

2010-06-01 15:25:27

JavaCLASSPATH

2020-07-21 08:26:08

SpringSecurity過濾器

2023-10-19 11:12:15

Netty代碼

2009-09-25 09:14:35

Hibernate日志

2013-09-22 14:57:19

AtWood

2020-09-23 10:00:26

Redis數據庫命令

2019-06-25 10:32:19

UDP編程通信

2017-01-10 08:48:21

2025-05-06 00:43:00

MySQL日志文件MIXED 3

2017-08-15 13:05:58

Serverless架構開發運維
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: www.99热.com | 日本免费一区二区三区视频 | 成人在线视频观看 | 高清欧美性猛交xxxx黑人猛交 | 超碰在线播 | 亚洲福利在线观看 | 日韩在线不卡 | 国产精品久久久久久影视 | 午夜影视| 中文字幕第7页 | 中文字幕精品一区 | 91久久久久久久久久久久久 | 日本三级网站在线观看 | www.788.com色淫免费 | 色综合激情 | 91精品福利 | 色婷婷精品国产一区二区三区 | 日韩在线视频一区 | 日日夜夜精品免费视频 | 久色网 | 在线欧美亚洲 | 欧美精品一区二区三区在线播放 | 蜜桃视频麻豆 | 91精品久久久久久久久久 | 国产精品久久久久一区二区三区 | 亚洲精品99| 99这里只有精品 | 国产婷婷在线视频 | 中文字幕人成乱码在线观看 | 精品一区二区三区不卡 | 成人av电影免费在线观看 | 国精产品一区二区三区 | 日本久久网 | 亚洲日本欧美日韩高观看 | 精品国产精品三级精品av网址 | 亚洲精品电影网在线观看 | 九九亚洲| 中文字幕视频在线免费 | 人人玩人人添人人澡欧美 | 精品欧美一区二区精品久久久 | h在线免费观看 |