溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何深入理解openstack網(wǎng)絡架中的Basic Use Cases

發(fā)布時間:2022-01-14 15:57:40 來源:億速云 閱讀:125 作者:柒染 欄目:云計算

小編今天帶大家了解如何深入理解openstack網(wǎng)絡架中的Basic Use Cases ,文中知識點介紹的非常詳細。覺得有幫助的朋友可以跟著小編一起瀏覽文章的內容,希望能夠幫助更多想解決這個問題的朋友找到問題的答案,下面跟著小編一起深入學習“如何深入理解openstack網(wǎng)絡架中的Basic Use Cases ”的知識吧。

我們將用3個簡單的use case,展示這些基本網(wǎng)絡組件如何以工作從而實現(xiàn)openstack的SDN方案。

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

  1. 創(chuàng)建網(wǎng)絡——我們創(chuàng)建網(wǎng)絡時,發(fā)生了什么。如何創(chuàng)建多個隔離的網(wǎng)絡。

  2. 創(chuàng)建虛擬機——一旦我們有了網(wǎng)絡,我們可以創(chuàng)建虛擬機并將其接入網(wǎng)絡。

  3. 虛擬機的DHCP請求——opensack可以自動為虛擬機配置IP。通過openstack neutron控制的DHCP服務完成。我們來了解這個服務如何運行,DHCP請求和回應是什么樣子的?

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

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

Use case #1: Create Network

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

# neutron net-create net1

Created a new network:

+---------------------------+--------------------------------------+

| Field                     | Value                                |

+---------------------------+--------------------------------------+

| admin_state_up            | True                                 |

| id                        | 5f833617-6179-4797-b7c0-7d420d84040c |

| name                      | net1                                 |

| provider:network_type     | vlan                                 |

| provider:physical_network | default                              |

| provider:segmentation_id  | 1000                                 |

| shared                    | False                                |

| status                    | ACTIVE                               |

| subnets                   |                                      |

| tenant_id                 | 9796e5145ee546508939cd49ad59d51f     |

+---------------------------+--------------------------------------+


為這個network創(chuàng)建subnet::

# neutron subnet-create net1 10.10.10.0/24

Created a new subnet:

+------------------+------------------------------------------------+

| Field            | Value                                          |

+------------------+------------------------------------------------+

| allocation_pools | {"start": "10.10.10.2", "end": "10.10.10.254"} |

| cidr             | 10.10.10.0/24                                  |

| dns_nameservers  |                                                |

| enable_dhcp      | True                                           |

| gateway_ip       | 10.10.10.1                                     |

| host_routes      |                                                |

| id               | 2d7a0a58-0674-439a-ad23-d6471aaae9bc           |

| ip_version       | 4                                              |

| name             |                                                |

| network_id       | 5f833617-6179-4797-b7c0-7d420d84040c           |

| tenant_id        | 9796e5145ee546508939cd49ad59d51f               |

+------------------+------------------------------------------------+



現(xiàn)在我們有了一個network和subnet,網(wǎng)絡拓撲像這樣:


如何深入理解openstack網(wǎng)絡架中的Basic Use Cases

現(xiàn)在讓我們深入看下到底發(fā)生了什么?在控制節(jié)點,我們一個新的namespace被創(chuàng)建: 

# ip netns list

qdhcp-5f833617-6179-4797-b7c0-7d420d84040c



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

# ip netns exec qdhcp-5f833617-6179-4797-b7c0-7d420d84040c ip addr

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

12: tap26c9b807-7c:  mtu 1500 qdisc noqueue state UNKNOWN

    link/ether fa:16:3e:1d:5c:81 brd ff:ff:ff:ff:ff:ff

    inet 10.10.10.3/24 brd 10.10.10.255 scope global tap26c9b807-7c

    inet6 fe80::f816:3eff:fe1d:5c81/64 scope link

       valid_lft forever preferred_lft forever



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

# ovs-vsctl show
8a069c7c-ea05-4375-93e2-b9fc9e4b3ca1
    Bridge "br-eth3"
        Port "br-eth3"
            Interface "br-eth3"
                type: internal
        Port "eth3"
            Interface "eth3"
        Port "phy-br-eth3"
            Interface "phy-br-eth3"
    Bridge br-ex
        Port br-ex
            Interface br-ex
                type: internal
    Bridge br-int
        Port "int-br-eth3"
            Interface "int-br-eth3"
        Port "tap26c9b807-7c"
            tag: 1
            Interface "tap26c9b807-7c"
                type: internal
        Port br-int
            Interface br-int
                type: internal
    ovs_version: "1.11.0"


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

# ethtool -S int-br-eth3
NIC statistics:
     peer_ifindex: 10
.
.
 
#ip link
.
.
10: phy-br-eth3:  mtu 1500 qdisc pfifo_fast state UP qlen 1000
.
.

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

關于網(wǎng)絡隔離:

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

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

#  ovs-ofctl dump-flows br-eth3
NXST_FLOW reply (xid=0x4):
 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
 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
 cookie=0x0, duration=165109.813s, table=0, n_packets=1671, n_bytes=213304, idle_age=25, hard_age=65534, priority=1 actions=NORMAL


從網(wǎng)絡接口到namespace我們看到VLAN標簽的修改如下:

#  ovs-ofctl dump-flows br-int
NXST_FLOW reply (xid=0x4):
 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
 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
 cookie=0x0, duration=165131.96s, table=0, n_packets=863, n_bytes=160727, idle_age=1, hard_age=65534, priority=1 actions=NORMAL

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

Use case #2: Launch a VM

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

如何深入理解openstack網(wǎng)絡架中的Basic Use Cases


掛載網(wǎng)絡并啟動虛擬機:

如何深入理解openstack網(wǎng)絡架中的Basic Use Cases
一旦虛擬機啟動并運行,我們發(fā)下nova支持給虛擬機綁定IP:

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


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

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


通過brctl查看網(wǎng)橋信息如下:

# brctl show
bridge name     bridge id               STP enabled     interfaces
qbr53903a95-82          8000.7e7f3282b836       no              qvb53903a95-82
                                                        tap53903a95-82

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

# ovs-vsctl show
83c42f80-77e9-46c8-8560-7697d76de51c
    Bridge "br-eth3"
        Port "br-eth3"
            Interface "br-eth3"
                type: internal
        Port "eth3"
            Interface "eth3"
        Port "phy-br-eth3"
            Interface "phy-br-eth3"
    Bridge br-int
        Port br-int
            Interface br-int
                type: internal
        Port "int-br-eth3"
            Interface "int-br-eth3"
        Port "qvb53903a95-82"
            tag: 3
            Interface "qvb53903a95-82"
    ovs_version: "1.11.0"


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

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


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

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

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

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

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

為了響應虛擬機的dhcp請求,Neutron使用了”dnsmasq“的Linux工具,這個工具是一個輕量的DNS、DHCP服務,更多的信息請查看(http://www.thekelleys.org.uk/dnsmasq/docs/dnsmasq-man.html)。我們可以在控制節(jié)點通過PS命令看到:

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文件我們可以看到:

# cat  /var/lib/neutron/dhcp/5f833617-6179-4797-b7c0-7d420d84040c/host
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 關聯(lián),當包含該MAC的DHCP請求到達,dnsmasq返回10.10.10.2。在這個初始過程(可以重啟網(wǎng)絡服務觸發(fā))中從namespace中看,可以看到如下的DHCP請求:

# ip netns exec qdhcp-5f833617-6179-4797-b7c0-7d420d84040c tcpdump -n
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
19:27:12.191666 IP 10.10.10.3.bootps > 10.10.10.2.bootpc: BOOTP/DHCP, Reply, length 325

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

感謝大家的閱讀,以上就是“如何深入理解openstack網(wǎng)絡架中的Basic Use Cases ”的全部內容了,學會的朋友趕緊操作起來吧。相信億速云小編一定會給大家?guī)砀鼉?yōu)質的文章。謝謝大家對億速云網(wǎng)站的支持!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

AI