如何在Docker中使用Open vSwitch
Open vSwitch是一個(gè)虛擬交換軟件,主要用于虛擬機(jī)VM環(huán)境,提供網(wǎng)絡(luò)的虛擬化。本篇文檔重點(diǎn)介紹如何在Docker中使用Open vSwitch。
這個(gè)文檔描述了如何在Docker(大于或等于1.9.0版本)中使用Open vSwitch。我們假設(shè)你已經(jīng)安裝好了Open vSwitch和Docker。請(qǐng)沒(méi)有安裝好的讀者可以根據(jù)INSTALL.md和www.docker.com的說(shuō)明來(lái)進(jìn)行安裝。
Docker 1.9.0開(kāi)始支持多主機(jī)網(wǎng)絡(luò)(multi-host networking)。我們可以通過(guò)OVN(Open vSwitch virtual network)來(lái)將Docker的網(wǎng)絡(luò)和Open vSwitch結(jié)合起來(lái)。
簡(jiǎn)介
對(duì)于OVN和Docker的多主機(jī)網(wǎng)絡(luò)(multi-host networking),Docker需要分布式鍵值對(duì)存儲(chǔ)的支持。假設(shè)我們這里采用consul來(lái)提供分布式鍵值對(duì)存儲(chǔ),并且你的主機(jī)IP地址為$HOST_IP。用戶(hù)可以使用下面的命令來(lái)啟動(dòng)Docker進(jìn)程:
- docker daemon --cluster-store=consul://127.0.0.1:8500 \
 - --cluster-advertise=$HOST_IP:0
 
OVN為容器提供了網(wǎng)絡(luò)虛擬化技術(shù)。OVN和Docker的結(jié)合使用存在兩種模式:underlay模式和overlay模式。
在underlay模式下,OVN要求配置OpenStack來(lái)提供容器網(wǎng)絡(luò)。在這個(gè)模式下,用戶(hù)可以創(chuàng)建邏輯網(wǎng)絡(luò),并且讓運(yùn)行在虛擬機(jī)中的容器、獨(dú)立的虛擬機(jī)(沒(méi)有容器運(yùn)行在其中)和物理機(jī)器連接到同一個(gè)邏輯網(wǎng)絡(luò)上。這是一種多租戶(hù)、多主機(jī)的解決辦法。
在overlay模式下,OVN可以為運(yùn)行跨主機(jī)的容器們提供一個(gè)邏輯網(wǎng)絡(luò)。這是一種單租戶(hù)(是否能擴(kuò)展到多租戶(hù)取決于安全特性)、多主機(jī)的解決辦法。在這種模式下,你并不需要預(yù)創(chuàng)建好的OpenStack。
值得注意的是,用戶(hù)必須在他想要運(yùn)行容器的虛擬機(jī)或主機(jī)上安裝并運(yùn)行Open vSwitch。
Overlay 模式
Overlay模式下,需要Open vSwitch 2.5版本或后續(xù)版本的支持。
1、啟動(dòng)核心模塊
OVN架構(gòu)中會(huì)有一個(gè)核心的模塊來(lái)存儲(chǔ)網(wǎng)絡(luò)信息。因此你需要在你其中一臺(tái)主機(jī)(IP地址為$CENTRAL_IP,并且已經(jīng)安裝和啟動(dòng)了Open vSwitch)上啟動(dòng)相關(guān)的核心服務(wù)。
首先我們讓ovsdb-server監(jiān)聽(tīng)一個(gè)TCP端口:
- ovs-appctl -t ovsdb-server ovsdb-server/add-remote ptcp:6640
 
接下來(lái),啟動(dòng)ovn-northd后臺(tái)進(jìn)程。這個(gè)進(jìn)程負(fù)責(zé)將來(lái)自Docker的網(wǎng)絡(luò)信息(存儲(chǔ)在OVN_Northbound 數(shù)據(jù)庫(kù)中)轉(zhuǎn)換成邏輯流存儲(chǔ)于OVN_Southbound數(shù)據(jù)庫(kù)。
- /usr/share/openvswitch/scripts/ovn-ctl start_northd
 
2、一次性配置
在每一個(gè)你打算創(chuàng)建容器的主機(jī)上,你需要運(yùn)行以下的命令(如果你的OVS數(shù)據(jù)庫(kù)被清空,你需要再次運(yùn)行這個(gè)命令。除此之外,重復(fù)運(yùn)行這個(gè)命令都是沒(méi)有任何影響的)。
其他的主機(jī)可以通過(guò)$LOCAL_IP地址來(lái)訪(fǎng)問(wèn)到這個(gè)主機(jī),它就相當(dāng)于本地通道的端點(diǎn)。
$ENCAP_TYPE是指用戶(hù)想使用的通道的類(lèi)型。它可以是”geneve“或者”stt“。(注意,你的內(nèi)核需要支持以上兩個(gè)類(lèi)型,用戶(hù)可以通過(guò)運(yùn)行以下命令來(lái)檢測(cè)內(nèi)核是否支持以上類(lèi)型:"llsmod | grep $ENCAP_TYPE")。
- ovs-vsctl set Open_vSwitch . external_ids:ovn-remote="tcp:$CENTRAL_IP:6640"
 - external_ids:ovn-encap-ip=$LOCAL_IP external_ids:ovn-encap-type="$ENCAP_TYPE"
 
最后,啟動(dòng)ovn-controller(你需要在每一次啟動(dòng)時(shí)運(yùn)行以下命令):
- /usr/share/openvswitch/scripts/ovn-ctl start_controller
 
3、啟動(dòng)Open vSwitch網(wǎng)絡(luò)驅(qū)動(dòng)
在默認(rèn)情況下,Docker使用Linux網(wǎng)橋,但它支持外擴(kuò)展。為了替換Linux網(wǎng)橋,我們需要先啟動(dòng)Open vSwitch驅(qū)動(dòng)。
Open vSwitch驅(qū)動(dòng)使用了Python Flask模塊來(lái)監(jiān)聽(tīng)Docker的網(wǎng)絡(luò)API請(qǐng)求。因此,用戶(hù)需要先安裝Python 的Flask模塊。
- easy_install -U pip
 - pip install Flask
 
在每一個(gè)你想要?jiǎng)?chuàng)建容器的主機(jī)上啟動(dòng)Open vSwitch驅(qū)動(dòng):
- ovn-docker-overlay-driver --detach
 
Docker內(nèi)部包含了一些模塊,這些模塊擁有類(lèi)似于OVN的邏輯交換機(jī)和邏輯端口的概念。請(qǐng)讀者仔細(xì)閱讀Docker的文檔來(lái)查找相關(guān)的命令。這里我們給出了一些案例:
1)創(chuàng)建用戶(hù)自己的邏輯交換機(jī)
下面的命令創(chuàng)建了一個(gè)名為”foo“的邏輯交換機(jī),它的網(wǎng)段為”192.168.1.0/24”:
- NID=`docker network create -d openvswitch --subnet=192.168.1.0/24 foo`
 
2)顯示已有邏輯交換機(jī)
- docker network ls
 
你也可以通過(guò)以下命令從OVN的northbound數(shù)據(jù)庫(kù)中查找到這個(gè)邏輯交換機(jī):
- ovn-nbctl --db=tcp:$CENTRAL_IP:6640 lswitch-list
 
3)Docker創(chuàng)建邏輯端口,并且將這個(gè)端口附加到邏輯網(wǎng)絡(luò)上
比如說(shuō),將一個(gè)邏輯端口添加到容器busybox的“foo”網(wǎng)絡(luò)上:
- docker run -itd --net=foo --name=busybox busybox
 
4)顯示所有的邏輯端口
Docker現(xiàn)在并沒(méi)有一個(gè)CLI命令來(lái)羅列所有的邏輯端口,但是你可以從OVN的數(shù)據(jù)庫(kù)中找到它們:
- ovn-nbctl --db=tcp:$CENTRAL_IP:6640 lport-list $NID
 
5)用戶(hù)也可以創(chuàng)建一個(gè)邏輯端口,并將它添加到一個(gè)運(yùn)行中的容器上:
- docker network create -d openvswitch --subnet=192.168.2.0/24 bar
 - docker network connect bar busybox
 
用戶(hù)可以刪除邏輯端口,或者將它們從運(yùn)行容器上分離出來(lái):
- docker network disconnect bar busybox
 
6)用戶(hù)也可以刪除邏輯交換機(jī):
- docker network rm bar
 
Underlay模式
在這個(gè)模式下,OVN要求用戶(hù)預(yù)安裝好OpenStack。
1、一次性配置
一個(gè)OpenStack的租戶(hù)創(chuàng)建了一個(gè)虛擬機(jī),這個(gè)虛擬機(jī)擁有單張或多張網(wǎng)卡。如果租戶(hù)想要發(fā)送虛擬機(jī)中容器的網(wǎng)絡(luò)包,他需要獲取這些網(wǎng)卡的port-id。Port-id可以通過(guò)以下命令獲得:
- nova list
 
然后運(yùn)行:
- neutron port-list --device_id=$id
 
在虛擬機(jī)中,下載OpenStack的RC文件,這些文件包含了租戶(hù)的信息(我們用openrc.sh來(lái)指代它)。編輯這個(gè)文件,并且將之前獲取到的port-id以 export OS_VIF_ID=$port-id的格式加入到文件中。文件的內(nèi)容如下:
- #!/bin/bash
 - export OS_AUTH_URL=http://10.33.75.122:5000/v2.0
 - export OS_TENANT_ID=fab106b215d943c3bad519492278443d
 - export OS_TENANT_NAME="demo"
 - export OS_USERNAME="demo"
 - export OS_VIF_ID=e798c371-85f4-4f2d-ad65-d09dd1d3c1c9
 
2、創(chuàng)建Open vSwitch網(wǎng)橋
如果用戶(hù)的虛擬機(jī)只有一個(gè)以太網(wǎng)接口(比如說(shuō)eth0),你需要將這個(gè)設(shè)備作為一個(gè)端口加入到Open vSwitch的”breth0”網(wǎng)橋上,并且移除它的IP地址,將其他相關(guān)的信息轉(zhuǎn)移到這個(gè)網(wǎng)橋上。(如果有多個(gè)網(wǎng)路接口,用戶(hù)自己創(chuàng)建Open vSwitch網(wǎng)橋,并且添加接口到網(wǎng)橋上)
如果你使用DHCP來(lái)獲取IP地址,你需要關(guān)閉監(jiān)聽(tīng)eth0的DHCP客戶(hù)端,并且開(kāi)啟一個(gè)監(jiān)聽(tīng)Open vSwitch breth0網(wǎng)橋的DHCP客戶(hù)端。
你可以讓以上的步驟持久化,比如說(shuō)你的虛擬機(jī)是Debian/Ubuntu,你可以參考 openvswitch-switch.README.Debian,如果你的虛擬機(jī)基于RHEL,你可以閱讀 README.RHEL完成持久化。
3、開(kāi)啟Open vSwitch網(wǎng)絡(luò)驅(qū)動(dòng)
Open vSwitch驅(qū)動(dòng)使用了Python Flask模塊來(lái)監(jiān)聽(tīng)Docker的網(wǎng)絡(luò)API調(diào)用。這個(gè)驅(qū)動(dòng)還使用了OpenStack的python-neutronclient庫(kù)。因此,如果你的主機(jī)還沒(méi)有安裝Python Flask或者python-neutronclient,你需要使用以下命令來(lái)安裝:
- easy_install -U pip
 - pip install python-neutronclient
 - pip install Flask
 
運(yùn)行openrc文件:
- ../openrc.sh
 
開(kāi)啟網(wǎng)絡(luò)驅(qū)動(dòng),并且提供OpenStack租戶(hù)的密碼:
- ovn-docker-underlay-driver --bridge breth0 --detach
 
從現(xiàn)在開(kāi)始,你可以使用和overlay模式類(lèi)似的Docker命令了。請(qǐng)閱讀“man ovn-architecture”來(lái)理解OVN的技術(shù)細(xì)節(jié)。















 
 
 











 
 
 
 