在Docker中使用Open vSwitch創建跨主機的容器網絡

本文介紹瞭如何使用Open vSwitch爲Docker 1.9.0及以後版本提供網絡支持。操作前請先確認你已經按照INSTALL.md編譯,或者通過包管理器安裝了Open vSwitch。

Docker從1.9.0版本之後提供了跨主機的網絡支持。通過將Docker和Open vSwitch整合,則可以利用Open vSwitch virtual network(OVN)進行互聯互通。

安裝

要想使用OVN實現Docker的跨主機網絡,Docker在啓動時必須指定分佈式鍵值存儲服務,比如你打算使用Consul作爲鍵值存儲,啓動Docker daemon時請使用如下參數:

docker daemon --cluster-store=consul://127.0.0.1:8500 \
--cluster-advertise=$HOST_IP:0

其中$HOST_IP是你主機本地IP。

OVN爲容器提供了虛擬化的網絡,目前OVN和Docker的集成,有兩種方式:即”underlay”模式和”overlay”模式。

在”underlay”模式下,OVN依賴於OpenStack爲容器提供網絡。此模式下,使用者可以讓虛擬機中的容器、獨立虛擬機(不運行任何容器)、物理機都連接到相同的邏輯網絡下。這是種多租戶、多主機的解決方案。

在”overlay”模式下,OVN可以用來創建跨主機的容器間網絡。此模式是單租戶(當然在不需要額外的網絡隔離的情況下可以拓展成多租戶)、多主機的解決方案。此模式不依賴OpenStack。

無論哪種模式,想要讓容器使用OVN都必須在所有容器宿主機上安裝Open vSwitch。

Overlay模式

使用OVN的”overlay”模式要求的Open vSwitch最小版本是2.5。

初始化中心節點
在OVN的架構中,需要有一箇中心節點用來存儲網絡定義。在需要部署的機器中選擇一臺作爲中心節點,IP地址是$CENTRAL_IP。

通過以下命令啓動ovsdb-server,監聽在TCP的6640端口:

ovs-appctl -t ovsdb-server ovsdb-server/add-remote ptcp:6640

啓動ovn-northd守候進程,這個進程用來將Docker存儲在OVN_Northbound中的網絡定義同步到OVN_Southbound中:

/usr/share/openvswitch/scripts/ovn-ctl start_northd

初始化各節點(僅需執行一次)
以下過程在每個你需要啓動容器的機器上僅執行一次(除非OVS數據庫清空後,任何其他清空執行多次都會帶來問題。)

下面的命令中,$LOCAL_IP指宿主機可以被訪問的IP地址,OVS將通過這個IP與其他宿主機通訊。$ENCAP_TYPE指通道類型。目前可選項是”geneve” 和 “stt”。(注意你的宿主機內核必須支持你選擇的$ENCAP_TYPE類型。這兩種類型都默認包含在了Open vSwitch的內核模塊中。如果你的Open vSwitch內核模塊來自於上游Linux發行版,那麼geneve最低支持的內核版本是3.18。發行版中的內核模塊不支持stt。你可以通過lsmod | 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"

最後,啓動ovn-controller,記得將啓動命令添加到系統啓動腳本中。

/usr/share/openvswitch/scripts/ovn-ctl start_controller

啓動Open vSwitch驅動
默認情況下,Docker使用Linux bridge作爲網絡驅動,當然了它支持其他外部驅動。爲了讓Docker使用Open vSwitch,你需要啓動Open vSwitch驅動。

Open vSwitch驅動使用了Python的flask模塊來監聽Docker的網絡API調用。所以如果你的主機還沒有安裝flask,使用以下命令安裝:

easy_install -U pip
pip install Flask

在所有準備運行Docker容器的機器上都要執行以下命令以啓動驅動:
ovn-docker-overlay-driver --detach

Docker內建的網絡和OVN的網絡概念非常一致,請查閱Docker的文檔獲取更全面的命令指南,這裏只是個簡單的例子。

創建邏輯交換機
使用以下命令創建一個名爲foo,子網爲192.168.1.0/24的邏輯交換機。

NID=`docker network create -d openvswitch --subnet=192.168.1.0/24 foo`

列出所有邏輯交換機
docker network ls
你也可以在OVN的northbound數據庫中查看邏輯交換機,通過以下命令:

ovn-nbctl --db=tcp:$CENTRAL_IP:6640 lswitch-list

將Docker容器連接到邏輯交換機
例如將一個busybox容器連接到邏輯網絡foo上,只需要執行:

docker run -itd --net=foo --name=busybox busybox

列出所有邏輯端口
目前Docker尚未提供命令來列出交換機端口,所以你可以通過直接查詢OVN數據庫來查看:

ovn-nbctl --db=tcp:$CENTRAL_IP:6640 lport-list $NID

創建邏輯交換機並將正在運行的容器連接

docker network create -d openvswitch --subnet=192.168.2.0/24 bar
docker network connect bar busybox

你可以通過如下命令斷開容器和邏輯交換機的連接
docker network disconnect bar busybox

刪除邏輯交換機
docker network rm bar

Underlay模式
此模式需要預先安裝運行OpenStack。

初始化各節點(僅需執行一次)
OpenStack租戶先要在他們的網絡內創建單或多網絡端口的虛擬機。租戶需要先取得想要作爲宿主機的端口ID(port-id)。可以通過以下命令取得虛擬機關聯的網絡端口ID:
nova list

然後執行:
neutron port-list --device_id=$id

在虛擬機中,下載包含租戶信息的OpenStack RC文件(下文稱之爲’openrc.sh’)。編輯並添加之前獲得的端口ID信息到這個文件中,例如:

#!/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

創建Open vSwitch橋接
如果你的虛擬機只有一個網卡(如’eth0′),你創建一個名爲breth0的網橋,然後將eth0網卡上的IP和路由信息全部轉移到網橋上。(如果有多塊網卡,你需要在想要發送網絡流量的那塊上進行這個操作。)

如果你使用DHCP服務獲取IP地址,首先需要停掉在物理網卡(如eth0)上監聽的DHCP客戶端,然後在新創建的網橋(如breth0)上啓動監聽。

根據你的虛擬機的不同,你需要把以上操作設置到啓動腳本中。

例如你的虛擬機運行Debian/Ubuntu,可以參考openvswitch-switch.README.Debian。如果虛擬機運行RHEL系統,參考README.RHEL。

啓動Open vSwitch網絡驅動
Open vSwitch驅動使用了Python的flask模塊來監聽Docker的網絡API調用,也使用了OpenStack的python-neutronclient庫。如果你還沒有安裝他們,請先安裝:

easy_install -U pip
pip install python-neutronclient
pip install Flask

執行openrc文件:
. ./openrc.sh

啓動網絡驅動,並在詢問時提供你的OpenStack租戶密碼:

ovn-docker-underlay-driver --bridge breth0 --detach

接下來,你可以使用上文在Overlay模式中介紹的命令來使用Docker了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章