[翻譯]如何在Docker中使用Open vSwitch創建跨主機的容器網絡
來自: http://starlight36.com/post/install-openvswitch-with-docker
翻譯自原文:http://openvswitch.org/support/dist-docs/INSTALL.Docker.md.txt
本文介紹了如何使用Open vSwitch為Docker 1.9.0及以后版本提供網絡支持。操作前請先確認你已經按照 [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時請使用如下參數:
dockerdaemon --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-serverovsdb-server/add-remoteptcp:6640
啟動ovn-northd守候進程,這個進程用來將Docker存儲在OVN_Northbound中的網絡定義同步到OVN_Southbound中。
/usr/share/openvswitch/scripts/ovn-ctlstart_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-vsctlsetOpen_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-ctlstart_controller
啟動Open vSwitch驅動
默認情況下,Docker使用Linux bridge作為網絡驅動,當然了它支持其他外部驅動。為了讓Docker使用Open vSwitch,你需要啟動Open vSwitch驅動。
Open vSwitch驅動使用了Python的flask模塊來監聽Docker的網絡API調用。所以如果你的主機還沒有安裝flask,使用以下命令安裝:
easy_install -U pip pipinstallFlask
在所有準備運行Docker容器的機器上都要執行以下命令以啟動驅動:
ovn-docker-overlay-driver --detach
Docker內建的網絡和OVN的網絡概念非常一致,請查閱Docker的文檔獲取更全面的命令指南,這里只是個簡單的例子。
創建邏輯交換機
使用以下命令創建一個名為foo,子網為192.168.1.0/24的邏輯交換機。
NID=`dockernetworkcreate -d openvswitch --subnet=192.168.1.0/24 foo`
列出所有邏輯交換機
dockernetworkls
你也可以在OVN的northbound數據庫中查看邏輯交換機,通過以下命令:
ovn-nbctl --db=tcp:$CENTRAL_IP:6640 lswitch-list
將Docker容器連接到邏輯交換機
例如將一個busybox容器連接到邏輯網絡foo上,只需要執行:
dockerrun -itd --net=foo --name=busyboxbusybox
列出所有邏輯端口
目前Docker尚未提供命令來列出交換機端口,所以你可以通過直接查詢OVN數據庫來查看:
ovn-nbctl --db=tcp:$CENTRAL_IP:6640 lport-list $NID
創建邏輯交換機并將正在運行的容器連接
dockernetworkcreate -d openvswitch --subnet=192.168.2.0/24 bar dockernetworkconnectbarbusybox
你可以通過如下命令斷開容器和邏輯交換機的連接
dockernetworkdisconnectbarbusybox
刪除邏輯交換機
dockernetworkrm bar
Underlay模式
此模式需要預先安裝運行OpenStack。
初始化各節點(僅需執行一次)
OpenStack租戶先要在他們的網絡內創建單或多網絡端口的虛擬機。租戶需要先取得想要作為宿主機的端口ID(port-id)。可以通過以下命令取得虛擬機關聯的網絡端口ID:
novalist
然后執行:
neutronport-list --device_id=$id
在虛擬機中,下載包含租戶信息的OpenStack RC文件(下文稱之為’openrc.sh’)。編輯并添加之前獲得的端口ID信息到這個文件中,例如:
#!/bin/bash exportOS_AUTH_URL=http://10.33.75.122:5000/v2.0 exportOS_TENANT_ID=fab106b215d943c3bad519492278443d exportOS_TENANT_NAME="demo" exportOS_USERNAME="demo" exportOS_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 pipinstallpython-neutronclient pipinstallFlask
執行openrc文件:
. ./openrc.sh
啟動網絡驅動,并在詢問時提供你的OpenStack租戶密碼:
ovn-docker-underlay-driver --bridgebreth0 --detach
接下來,你可以使用上文在Overlay模式中介紹的命令來使用Docker了。
供多關于OVN架構的細節,請通過man ovn-architecture參考。