你需要知道的關於Neutron的一切事情
在這篇文章里將了解如何創建多層網路及其子網,然後了解多個虛擬主機如何通過這些網路互連,以及驗證靜態IP地址的網路連接。
如果你對網路或者openstack還是初學者,那麼理解Neutron對你來說就是一個挑戰。在下面講解中,我們將詳細描述一下Openstack的網路組件。
按照Openstack官方的文檔,Neutron是Openstack的一個項目,它提供其他Openstack服務(例如Nova)管理的介面設備(例如vNICs)之間的"網路連接服務"。Neutron簡單描述為:允許用戶去創建和管理網路對象,例如網路,子網和埠,這些對象都是其他Openstack服務通過某一個API去使用的。Neutron使大量的操作者去實現一套複雜的網路技術,通過使用多個代理,插件和驅動來加強他們的網路基礎設施。這就是全部。我保證這將是最後一個重要的字眼。讓我們通過一個例子來理解Openstack的網路。作為本文四個章節的一部分,我首先要創建多層網路和子網。然後我們將在這些網路產生多個虛擬機並驗證靜態IP地址的網路連接。然後我們介紹虛擬機的安全組的許可權。最後介紹路由和floatingIPs是如何實現不同網路的互連性的。準備好了么?
網路(Networks),子網(subnets) & 埠(Ports)
正如承諾的那樣,讓我們先創建一些網路。這一節我們的計劃是:
- 創建一個網路 (GREEN). 在這個網路上創建一個子網,然後在這個網路上生成兩個虛擬主機(VMs).
- 創建另一個網路(RED),在這個網路上創建不同的子網,然後在這個網路上產生另兩個不同的VMs。
- 驗證上面操作流程創建的埠,理解OPenStack網路埠為什麼是有用的。
- 兩個虛擬網路 (GREEN & RED)
- 兩個子網, 每一個虛擬網路10.10.10.0/24和20.10.10.0/24
- 四個虛擬機 (每個虛擬網路有兩個) ,每個虛擬機由各個通信網路中的DHCP動態分配的IP。
- 兩個DHCP主機(在網路創建時會自動創建)
- 使用中的六個網路埠。.
上面操作完成後,我們將有如上的網路拓撲圖,包含:
讓我們先來驗證不存在網路的情況。對於下面的所有命令,我們將用OpenStack綁定的Python的CLI (python-neutronclient or python-novaclient)。
root@controller (admin) $> neutron net-listroot@controller (admin) $> #...................................................................
現在我們創建第一個網路GREEN。
root@controller (admin) >gt; neutron net-create GREENCreated a new network:+---------------------------+----------------------------------------------------------+| Field | Value |+---------------------------+----------------------------------------------------------+| admin_state_up | True || id | 6df1fa59-25a3-4f8c-8d14-ae7f7828c1a2 || name | GREEN || provider:network_type | gre || provider:physical_network | || provider:segmentation_id | 101 || router:external | False || shared | False || status | ACTIVE || subnets | || tenant_id | 34609d0ea9ce48f98145ecc5bbac9f77 |+---------------------------------------------+----------------------------------------+root@controller (admin) $> #...................................................................
現在讓我們在這個網路下創建一個子網。我們選擇10.10.10.0./24埠範圍給這個子網。並命名為10_10_10.。
root@controller (admin) $> neutron subnet-create --name 10_10_10 GREEN 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 | 1667e8b9-e2fe-41a6-bfd2-7de41f777d6e || ip_version | 4 || ipv6_address_mode | || ipv6_ra_mode | || name | 10_10_10 || network_id | 6df1fa59-25a3-4f8c-8d14-ae7f7828c1a2 || tenant_id | 34609d0ea9ce48f98145ecc5bbac9f77 |+-------------------------+----------------------------------------------------------+root@controller (admin) $>; #...................................................................
我們看到這個子網創建成功,分配給它的默認IP池為10.10.10.2-10.10.10.254。這個子網中的任何新設備被分配的IP地址都在該範圍中。第一個IP和最後一個IP是特殊的IP,是保留IP。 10.10.10.1這個IP是默認的網關地址,在上面的neutron subnet-create命令的輸出中我們可以看到。 這個IP範圍中的最後一個IP10.10.10.255是個廣播地址,它是為了廣播用的。
再次執行neutron net-list命令,我們看到我們的GREEN網路有了新的子網10.10.10.0/24。
root@controller (admin) $> neutron net-list+-------------+-------+----------------------------------------------------+| id | name | subnets |+-------------+-------+----------------------------------------------------+| 6df --- 1a2 | GREEN | 1667e8b9-e2fe-41a6-bfd2-7de41f777d6e 10.10.10.0/24 |+-------------+-------+----------------------------------------------------+root@controller (admin) $> #...................................................................
既然我們的基本網路組件已經準備好了,那麼讓我們在這個網路上啟動兩個小的虛擬機,這兩個虛擬機使用的cirros鏡像。
root@controller (admin) $> nova boot --flavor m1.tiny --image cirros --min-count 2 --nic net-id=6df1fa59-25a3-4f8c-8d14-ae7f7828c1a2 greenboxes+--------------------------------------+-------------------------------------------------+| Property | Value |+--------------------------------------+-------------------------------------------------+| OS-DCF:diskConfig | MANUAL || OS-EXT-AZ:availability_zone | nova || OS-EXT-SRV-ATTR:host | - || OS-EXT-SRV-ATTR:hypervisor_hostname | - || OS-EXT-SRV-ATTR:instance_name | instance-00000016 || OS-EXT-STS:power_state | 0 || OS-EXT-STS:task_state | scheduling || OS-EXT-STS:vm_state | building || OS-SRV-USG:launched_at | - || OS-SRV-USG:terminated_at | - || accessIPv4 | || accessIPv6 | || adminPass | BurRPPiCm6TK || config_drive | || created | 2016-03-09T02:04:56Z || flavor | m1.tiny (1) || hostId | || id | b2647e00-81e3-4290-b9c3-ce5e584c7265 || image | cirros (5c912cd4-729e-4f29-8761-eb04e630741d) || key_name | default || metadata | {} || name | greenboxes-b2647e00-81e3-4290-b9c3-ce5e584c7265 || os-extended-volumes:volumes_attached | [] || progress | 0 || security_groups | default || status | BUILD || tenant_id | 34609d0ea9ce48f98145ecc5bbac9f77 || updated | 2016-03-09T02:04:56Z || user_id | e9b23b6cb7ef4e7c99d8934e34163726 |+--------------------------------------+-------------------------------------------------+root@controller (admin) $> #...................................................................
上面信息說明兩個使用flavor為m1.tiny的虛擬機正在構建中。
root@controller (admin) $> nova list --fields Name,Networks+--------------------------------------+----------------------------------+------------------+| ID | Name | Networks |+--------------------------------------+----------------------------------+------------------+| b2647e00-81e3-4290-b9c3-ce5e584c7265 | greenboxes-b2647e00-ce5e584c7265 | GREEN=10.10.10.5 || f0d6e68c-5e18-432c-b0a7-4ef6da054053 | greenboxes-f0d6e68c-4ef6da054053 | GREEN=10.10.10.6 |+--------------------------------------+----------------------------------+------------------+root@controller (admin) $> #...................................................................
上面的nova list命令說明虛擬機已經啟動,在子網10_10_10中使用了兩個IP。作為啟動過程的一部分,在網路虛擬交換機上的埠被綁定到虛擬機的虛擬介面上。看一下這個網路的所有埠,可以使我們對添加到這個網路的設備有一個清晰的了解。
root@controller (admin) $> neutron port-list -c id -c fixed_ips+-----+-----------------------------------------------------------------------------------+| id | fixed_ips |+--------------------------------------+--------------------------------------------------+| XXX | {"subnet_id": "1667e8b9-e2fe-41a6-bfd2-7de41f777d6e", "ip_address": "10.10.10.6"} || XXX | {"subnet_id": "1667e8b9-e2fe-41a6-bfd2-7de41f777d6e", "ip_address": "10.10.10.5"} || XXX | {"subnet_id": "1667e8b9-e2fe-41a6-bfd2-7de41f777d6e", "ip_address": "10.10.10.4"} |+-----+-----------------------------------------------------------------------------------+root@controller (admin) $> #...................................................................
上面的neutron port-list命令輸出暗示有三個埠被創建。兩個綁定到兩個虛擬機介面上,另一個綁定到DHCP伺服器上。因為當創建網路時我們不能禁止DHCP,所以 這個DHCP伺服器被創建出來了。這個DHCP服務是負責給虛擬機分配動態IP的。
另一方面,驗證埠創建的更容易的方式是從Horizon Dashboard中創建。點擊一個特殊的網路,跳轉到該網路的詳情頁面。在詳情頁面我們能看到該網路使用的所有埠情況。例如打開GREEN網路的詳情頁面,我們會看到:
我們能看到兩個 Compute:None 埠。這個屬性告訴我們這些埠已經連接到虛擬機上了。一個埠(10.10.10.4) 連接到DHCP服務上了。
OpenStack中的一個網路是一種VLAN但它更靈活。
一個子網是一個IP地址塊,並且它和配置狀態有關。網路上新的埠被創建時子網被用來給該埠分配IP地址。
一個Neutron埠是給虛擬網路綁定一個獨立的設備的一個連接點,例如虛擬伺服器的NIC。埠也描述了相關的網路配置,例如該埠上的MAC和IP地址。
現在我們第一組VMs和網路組件已經創建完了,同樣的我們將創建另一個新的網路(命名RED),創建該網路另一個新的子網,最後在該網路和子網下啟動兩個VM。假設我們重複以上的步驟,我們能在horizon dashboard中驗證上面的四個實例。這四個實例運行在兩個節點組中。兩個連接到GREEN網路中(10.10.10.X)另兩個連接到RED網路(20.10.10.X)中。
四個實例正在運行中,兩個在GREEN(10.10.10.X) 網路中,另兩個在RED網路 (20.10.10.X)中.
存在兩個網路。
root@controller (admin) $> neutron net-list+--------------------------------------+-------+-----------------------------------------+| id | name | subnets |+--------------------------------------+-------+-----------------------------------------+| 6df1fa59-25a3-4f8c-8d14-ae7f7828c1a2 | GREEN | 1667e8b9--7de41f777d6e 10.10.10.0/24 || 1048605e-41f6-4c10-be89-935f836a1b40 | RED | db05f7e4--d9e164f86ca8 20.10.10.0/24 |+--------------------------------------+-------+-----------------------------------------+root@controller (admin) $> #................................................................
一共有六個埠被創建。四個埠分別連接到四個虛機上,兩個埠連接到每個網路DHCP服務上。
root@controller (admin) $> neutron port-list -c id -c fixed_ips+-----+----------------------------------------------------------------------------------+| id | fixed_ips |+-----+----------------------------------------------------------------------------------+| XXX | {"subnet_id": "1667e8b9-e2fe-41a6-bfd2-7de41f777d6e", "ip_address": "10.10.10.6"}|| XXX | {"subnet_id": "1667e8b9-e2fe-41a6-bfd2-7de41f777d6e", "ip_address": "10.10.10.5"}|| XXX | {"subnet_id": "db05f7e4-2d48-4d86-8089-d9e164f86ca8", "ip_address": "20.10.10.6"}|| XXX | {"subnet_id": "db05f7e4-2d48-4d86-8089-d9e164f86ca8", "ip_address": "20.10.10.4"}|| XXX | {"subnet_id": "1667e8b9-e2fe-41a6-bfd2-7de41f777d6e", "ip_address": "10.10.10.4"}|| XXX | {"subnet_id": "db05f7e4-2d48-4d86-8089-d9e164f86ca8", "ip_address": "20.10.10.5"}|+-----+----------------------------------------------------------------------------------+root@controller (admin) $> #..................................................................
正如文件開始保證的在這個章節中我們創建了我們的網路基礎設施。這表明在Neutron 網路,子網和埠的幫助下我們能創建更複雜且更靈活的網路設置來滿足我們的需求。
安全組(Security Groups)
在前面一節中,即使VMs在同樣的網路下被創建且能互相連接,因為安全組的原因我們也許不能ping或者ssh這些虛擬機。這是你的計算實例都有控制輸入和輸出通道的虛擬防火牆,這就是安全組。Openstack的安全組在每個虛擬機上都有實現。您能創建一 群安全組規則並分配它們給這些虛擬機。
讓我們列出所有的安全組。
root@controller (admin) $> nova secgroup-list+--------------------------------------+----------+----------------+| Id | Name | Description |+--------------------------------------+----------+----------------+| 4be520ef-58ad-4fa2-a471-2721290b88d7 | default | default |+--------------------------------------+----------+----------------+root@controller (admin) $> #...................................................................
列出安全組default的每個規則
root@controller (admin) $> nova secgroup-list-rules default+----------------+-----------+---------+------------+--------------+| IP Protocol | From Port | To Port | IP Range | Source Group |+----------------+-----------+---------+------------+--------------+| | | | default | || icmp | -1 | -1 | 0.0.0.0/0 | || tcp | 1 | 65535 | 0.0.0.0/0 | || | | | | default || udp | 1 | 65535 | 0.0.0.0/0 | |+----------------+-----------+---------+-------------+-------------+root@controller (admin) $> #...................................................................
讓我們發現任何一個vm的安全組.
root@controller (admin) $> nova show greenboxes-b2647e00-81e3-4290-b9c3-ce5e584c7265 | grep security_groups| security_groups | default |root@controller (admin) $> #...................................................................
這表明我們的VM1 (greenboxes-b2647e00-81e3-4290-b9c3-ce5e584c7265)默認以安全組default啟動。現在讓我們給default增加一個規則以便允許ssh(埠22)連接。
root@controller (admin) $> nova secgroup-add-rule default tcp 22 22 0.0.0.0/0+----------------+-----------+---------+------------+------------+| IP Protocol | From Port | To Port | IP Range | Source Group |+----------------+-----------+---------+------------+------------+| tcp | 22 | 22 | 0.0.0.0/0 | |+----------------+-----------+---------+------------+------------+root@controller (admin) $> nova secgroup-list-rules default | grep 22| tcp | 22 | 22 | 0.0.0.0/0 | |root@controller (admin) $> #...................................................................
列出所有安全組,我們能驗證默認的secgroup有一個埠22的規則。這意味著在以default安全組啟動的虛擬機上,埠22被開放從而允許ssh的連接。這些安全組規則是項目的標準規範,項目組成員能編輯這些安全組規則也能增加新的安全組規則。
路由器(Routers)
在上面的拓撲圖裡,在GREEN網路里的實例可以與其他設備進行交互,只要它們在同一個網路里。這意味著VM1能發送和接收來自VM2的包,但是不能發送和接收來自VM3或者VM4的包數據。為了提供兩個不同網路之間的互連,路由器使這個變成了可能。
路由器是邏輯上的網路組件,主要表現在:
- 在網路間轉發數據包;
- 提供L3和NAT為了提供VMs對外部的租戶網路訪問的許可權。
讓我們來證明路由器的這兩個特徵。在本章節中,我們將介紹一個新的路由器。綁定每個網路的末端到一個路由上,這樣它們就連接在一起了。然後我們將創建一個 虛擬的外部網路,並使這個路由器成為一個網關。這種方式使我們所有的VMs能在外部世界進行交互。在這個章節末尾,我們將有一個如下的配置圖。
為了連接兩個網路我們需要一個路由器。讓我們創建一個外部虛擬路由器並命名為EXT_VR。root@controller (admin) $> neutron router-create EXT_VRCreated a new router:+-----------------------+--------------------------------------+| Field | Value |+-----------------------+--------------------------------------+| admin_state_up | True || distributed | False || external_gateway_info | || ha | False || id | c326b2b4-9076-4e12-9850-77d5f1c66c86 || name | EXT_VR || routes | || status | ACTIVE || tenant_id | 34609d0ea9ce48f98145ecc5bbac9f77 |+-----------------------+--------------------------------------+root@controller (admin) $> #...................................................................
現在我們在這個剛創建的路由器EXT_VR上需要在每個網路上添加虛擬介面。這種方式能使我們有一個多個子網的網路,並決定哪個子網連接路由器。
root@controller (admin) $> neutron subnet-list -c id -c name -c cidr+--------------------------------------+----------+---------------+| id | name | cidr |+------------ -------------------------+----------+---------------+| 1667e8b9-e2fe-41a6-bfd2-7de41f777d6e | 10_10_10 | 10.10.10.0/24 || db05f7e4-2d48-4d86-8089-d9e164f86ca8 | 20_10_10 | 20.10.10.0/24 |+--------------------------------------+----------+---------------+root@controller (admin) $> neutron router-interface-add c326b2b4-9076-4e12-9850-77d5f1c66c86 10_10_10Added interface 64b09b83-1500-4caf-b9ea-ea4c8ec127d7 to router c326b2b4-9076-4e12-9850-77d5f1c66c86.root@controller (admin) $> neutron router-interface-add c326b2b4-9076-4e12-9850-77d5f1c66c86 20_10_10Added interface 0b1e3767-363e-49ba-8ee9-33c02db354bc to router c326b2b4-9076-4e12-9850-77d5f1c66c86.root@controller (admin) $> #...................................................................
現在這兩個網路通過路由器EXT_VR就能進行互連,我們通過下面的命令來驗證這個互連性。
cirros@vm1 $ ping -c 2 10.10.10.6>PING 10.10.10.6 (10.10.10.6) 56(84) bytes of data.64 bytes from 10.10.10.6: icmp_seq=1 ttl=64 time=0.102 ms64 bytes from 10.10.10.6: icmp_seq=2 ttl=64 time=0.120 ms--- 10.10.10.6 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 999msrtt min/avg/max/mdev = 0.102/0.111/0.120/0.009 mscirros@vm1 $cirros@vm1 $ ping -c 2 20.10.10.5PING 20.10.10.5 (20.10.10.5) 56(84) bytes of data.64 bytes from 20.10.10.5: icmp_seq=1 ttl=64 time=0.132 ms64 bytes from 20.10.10.5: icmp_seq=2 ttl=64 time=0.180 ms--- 20.10.10.5 ping statistics ---2 packets transmitted, 2 received, 0% packet loss, time 999msrtt min/avg/max/mdev = 0.132/0.156/0.180/0.024 msroot@controller (admin) $> #...................................................................
即使我們通過不同的網路能看到VMs之間的互連性,但是仍不能連接互聯網(internet)。來源於VMs的包仍然不能到達外部網路。我們目前的網路基礎設施的狀態如下圖:
上面圖中所示:兩個網路(RED和GREEN)通過路由器互連,但是路由器和互聯網之間沒有連接。為了實現這種互連,我們需要設定該路由器為網關,這意味著連接路由器的一個介面到一個外部網路。在這種情況下,我們有一個存在的外部網路,我們將增加這個網路作為這個路由器的網關。
root@controller (admin) $> neutron router-gateway-set EXT_VR extroot@controller (admin) $> #...................................................................
這樣將創建一個新的埠,這個埠將綁定這個外部網路到路由器上。讓我們通過以下命名驗證一下:
root@controller (admin) $> neutron port-list -c id -c fixed_ips+----+----------------------------------------------------------------------------------------+| id | fixed_ips |+----+----------------------------------------------------------------------------------------+| XX | {"subnet_id": "1667e8b9-e2fe-41a6-bfd2-7de41f777d6e", "ip_address": "10.10.10.6"} || XX | {"subnet_id": "acd4141a-149d-4a11-80bb-17eabaf0149f", "ip_address": "192.168.100.104"}|| XX | {"subnet_id": "1667e8b9-e2fe-41a6-bfd2-7de41f777d6e", "ip_address": "10.10.10.5"} || XX | {"subnet_id": "1667e8b9-e2fe-41a6-bfd2-7de41f777d6e", "ip_address": "10.10.10.1"} || XX | {"subnet_id": "db05f7e4-2d48-4d86-8089-d9e164f86ca8", "ip_address": "20.10.10.6"} || XX | {"subnet_id": "db05f7e4-2d48-4d86-8089-d9e164f86ca8", "ip_address": "20.10.10.4"} || XX | {"subnet_id": "1667e8b9-e2fe-41a6-bfd2-7de41f777d6e", "ip_address": "10.10.10.4"} || XX | {"subnet_id": "db05f7e4-2d48-4d86-8089-d9e164f86ca8", "ip_address": "20.10.10.5"} || XX | {"subnet_id": "acd4141a-149d-4a11-80bb-17eabaf0149f", "ip_address": "192.168.100.105"}|| XX | {"subnet_id": "db05f7e4-2d48-4d86-8089-d9e164f86ca8", "ip_address": "20.10.10.1"} |+----+----------------------------------------------------------------------------------------+root@controller (admin) $> #...................................................................
正如上面我們看到的,存在兩個新的埠(for 192.168.100.104 and for 192.168.100.105) . 這有兩個新的連接點,一個綁定路由器到一個外部網路上,另一個外部網路綁定到internet上。這樣現在來自虛擬機內部的包能到達internet了。
浮動IP(Floating IPs)
我們看到前面步驟創建的VMs能到達外部公共網路,但是相反是不可能的,我們不能從外部網路到達VMs。任何要到VM1(有內部IP10.10.0.5)的包到達外部路由時,該網關路由不能區分哪個時目的VM。讓我們更詳細的了解這種情況。
上面的圖跟我們之前的網路基礎設施圖相似。剛開始我們儘力發送一個從VM1到外部機器(IP:56.57.58.59)的包。由於VM1被連接到虛擬路由器的外部連接上,包能到達有源IP10.10.10.5和目標IP56.57.58.59的虛擬路由器上。我們的虛擬路由器EXT_VR能改變這個源IP為自己的IP地址(192.168.0.19),從而發送包到正確的目標上。這是可行的。
但是對於從任何外部源到任何一個VM上的包,用路由器的公共IP地址能到達我們的外部虛擬路由器EXT_VR。但是基於在包里提供的信息,這個虛擬路由器無法識別目的VM.
一種允許外部網路連接一個VM的方式是為每個VM創建公共IP。但是長遠來看這不是無法維護的。一般情況下我們希望我們的VMs能與外部網路斷開除了特殊的情況外。每個VM用公共IP將導致我們維護每個VM的巨大的IP池。
浮動IP是有路由功能的公共IP,這樣的IP能分配到一個VM上也能再次撤銷這樣的IP。這個在路由層次上進行維護。
作為本章節的一部分,讓我們在公共網路EXT里產生一些浮動IP。然後我們將動態分配這些浮動IP到VM1,下面來驗證一下:
root@controller (admin) $> neutron floatingip-listroot@controller (admin) $> root@controller (admin) $> neutron floatingip-create extCreated a new floatingip:+---------------------+----------------------------------------+| Field | Value |+---------------------+----------------------------------------+| fixed_ip_address | || floating_ip_address | 192.168.100.103 || floating_network_id | 4901039d-07b1-4ebf-91f1-559dd657e034 || id | 02ff1d61-6280-4f25-a8ff-9e5676ece01d || port_id | || router_id | || status | DOWN || tenant_id | 34609d0ea9ce48f98145ecc5bbac9f77 |+---------------------+----------------------------------------+root@controller (admin) $> neutron floatingip-associate 02ff1d61-6280-4f25-a8ff-9e5676ece01d 378956ec-3928-4e06-873c-423b7f017695root@controller (admin) $>root@controller (admin) $> neutron floatingip-list -c id -c fixed_ip_address -c floating_ip_address+---------------------- ---------------+------------------+---------------------+| id | fixed_ip_address | floating_ip_address |+--------------------------------------+------------------+---------------------+| 02ff1d61-6280-4f25-a8ff-9e5676ece01d | 10.10.10.5 | 192.168.100.103 |+--------------------------------------+------------------+---------------------+root@controller (admin) $> #...................................................................
剛開始的 neutron floatingip-list 命令沒有得到結果。這意味著不存在浮動IP。然後我們在外部網路上產生一個浮動IP。這個IP將從網路地址池中隨意選擇出來。我們發現了想要綁定的VM的埠。用neutron floatingip-associate命令我們能用一個虛擬的機器埠來連接這個浮動IP。這樣就建立從一個外部網路到VM1的連接。
結論
來到了這個Neutron介紹的文末了。我們對在一個OpenStack Cloud如何創建網路和子網有了一個了解。我們也看到通過使用安全組來控制每個虛擬機的訪問。我們也知道如何用L3交換和路由連接不同的網路。我們也知道如何用浮動IP去允許外部連接到虛擬機。
翻自Alok Kumar 的文章Everything you need to know to get started with Neutron
推薦閱讀:
※Stateful firewall in OpenFlow based SDN
※VLAN Trunk in OpenStack Neutron and SDN
※準備學習 OpenStack,眾位大神有哪些教材推薦和經驗傳授?
※Kubernetes 是未來嗎?
※解讀Mirantis最新的Neutron性能測試
TAG:OpenStack |