本文介紹了如何使用Open vSwitch為Docker 1.9.0及以后版本提供網絡支持。操作前請先確認你已經按照INSTALL.md(http://openvswitch.org/support/dist-docs/INSTALL.md)編譯,或者通過包管理器安裝了Open vSwitch。關于如何安裝Docker,請參考www.docker.com上提供的介紹。
Docker從1.9.0版本之后提供了跨主機的網絡支持。通過將Docker和Open vSwitch整合,則可以利用Open vSwitch virtual network(OVN)進行互聯互通。
要想使用OVN實現Docker的跨主機網絡,Docker在啟動時必須指定分布式鍵值存儲服務,比如你打算使用Consul作為鍵值存儲,啟動Docker daemon時請使用如下參數:
其中$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端口:
啟動ovn-northd守候進程,這個進程用來將Docker存儲在OVN_Northbound中的網絡定義同步到OVN_Southbound中:
初始化各節點(僅需執行一次)
以下過程在每個你需要啟動容器的機器上僅執行一次(除非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來確認是否支持相應的模式。)
最后,啟動ovn-controller,記得將啟動命令添加到系統啟動腳本中。
啟動Open vSwitch驅動
默認情況下,Docker使用Linux bridge作為網絡驅動,當然了它支持其他外部驅動。為了讓Docker使用Open vSwitch,你需要啟動Open vSwitch驅動。
Open vSwitch驅動使用了Python的flask模塊來監聽Docker的網絡API調用。所以如果你的主機還沒有安裝flask,使用以下命令安裝:
在所有準備運行Docker容器的機器上都要執行以下命令以啟動驅動:
Docker內建的網絡和OVN的網絡概念非常一致,請查閱Docker的文檔獲取更全面的命令指南,這里只是個簡單的例子。
創建邏輯交換機
使用以下命令創建一個名為foo,子網為192.168.1.0/24的邏輯交換機。
列出所有邏輯交換機
你也可以在OVN的northbound數據庫中查看邏輯交換機,通過以下命令:
將Docker容器連接到邏輯交換機
例如將一個busybox容器連接到邏輯網絡foo上,只需要執行:
列出所有邏輯端口
目前Docker尚未提供命令來列出交換機端口,所以你可以通過直接查詢OVN數據庫來查看:
創建邏輯交換機并將正在運行的容器連接
你可以通過如下命令斷開容器和邏輯交換機的連接
刪除邏輯交換機
Underlay模式此模式需要預先安裝運行OpenStack。
初始化各節點(僅需執行一次)
OpenStack租戶先要在他們的網絡內創建單或多網絡端口的虛擬機。租戶需要先取得想要作為宿主機的端口ID(port-id)。可以通過以下命令取得虛擬機關聯的網絡端口ID:
然后執行:
在虛擬機中,下載包含租戶信息的OpenStack RC文件(下文稱之為’openrc.sh’)。編輯并添加之前獲得的端口ID信息到這個文件中,例如:
Shell1
2
3
4
5
6
#!/bin/bashexport OS_AUTH_URL=http://10.33.75.122:5000/v2.0export OS_TENANT_ID=fab106b215d943c3bad519492278443dexport 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(http://openvswitch.org/support/dist-docs/debian/openvswitch-switch.README.Debian)。如果虛擬機運行RHEL系統,參考README.RHEL(http://openvswitch.org/support/dist-docs/rhel/README.RHEL)。
啟動Open vSwitch網絡驅動
Open vSwitch驅動使用了Python的flask模塊來監聽Docker的網絡API調用,也使用了OpenStack的python-neutronclient庫。如果你還沒有安裝他們,請先安裝:
執行openrc文件:
啟動網絡驅動,并在詢問時提供你的OpenStack租戶密碼:
接下來,你可以使用上文在Overlay模式中介紹的命令來使用Docker了。
供多關于OVN架構的細節,請通過man ovn-architecture參考。