天天看點

Docker實作跨主機容器執行個體網絡通信(2)——利用OpenVSwitch建構多主機Docker網絡

題記

前面我們已經針對Docker容器進行了簡單介紹,相信感興趣的朋友已經能在相關幫助下部署一個docker環境感受了容器帶給我們的另一種技術進步。

當然,如果你慢慢深入容器的技術研究,你會發現,盡管容器是虛拟機的未來趨勢,但是容器還有很多需要進步,特别是關于網絡方面,虛拟化技術可以支援非常豐富的網絡需求,但是現在容器可能在這一塊還需要繼續進步和完善,最大的需求就是如果我們建構容器叢集,我們可能隻在一個主控端上建立多個容器,可能需要N個主控端,每個主控端上又包含M個容器,我們需要N*M個容器組成一個大的容器叢集網絡,那麼如何跨主控端進行容器的網絡連接配接是需要我們關注的,當然,現在也有非常多的方案供我們去選擇:

--------------------------------------------------------------------------------------

Blog:    http://blog.csdn.net/chinagissoft

QQ群:16403743

宗旨:專注于"GIS+"前沿技術的研究與交流,将雲計算技術、大資料技術、容器技術、物聯網與GIS進行深度融合,探讨"GIS+"技術和行業解決方案

轉載說明:文章允許轉載,但必須以連結方式注明源位址,否則追究法律責任!

--------------------------------------------------------------------------------------

1、利用容器暴露端口方式

2、LinuxBriage方式

3、例如類似weave方式實作

4、也是本部落格介紹的利用OpenvSwitch來實作

關于OpenvSwitch不多介紹,我OpenStack的早期版本(K版本之前),關于網絡Neutron的實作都是通過OpenvSwitch。

實驗環境

Docker實作跨主機容器執行個體網絡通信(2)——利用OpenVSwitch建構多主機Docker網絡

使用VMWare Workstation12

Ubuntu14.04

Docker 1.9.0

1、建構OpenvSwitch安裝包

預設安裝的版本不符合需求,也可以在一個新環境執行如下步驟

#擷取最新存檔
wget http://openvswitch.org/releases/openvswitch-2.3.1.tar.gz
tar xzvf openvswitch-2.3.1.tar.gz
cd openvswitch-2.3.1

#安裝依賴
sudo apt-get install -y build-essential fakeroot debhelper \
                    autoconf automake bzip2 libssl-dev \
                    openssl graphviz python-all procps \
                    python-qt4 python-zopeinterface \
                    python-twisted-conch libtool

# 建構(不使用并行檢查)
DEB_BUILD_OPTIONS='parallel=8 nocheck' fakeroot debian/rules binary

# 得到最新deb檔案并複制到某處
cd ..
ls -al *deb
           

執行完畢之後可以看到

openvswitch-2.3.1.tar.gz
openvswitch-common_2.3.1-1_amd64.deb
openvswitch-datapath-dkms_2.3.1-1_all.deb
openvswitch-datapath-source_2.3.1-1_all.deb
openvswitch-dbg_2.3.1-1_amd64.deb
openvswitch-ipsec_2.3.1-1_amd64.deb
openvswitch-pki_2.3.1-1_all.deb
openvswitch-switch_2.3.1-1_amd64.deb
openvswitch-test_2.3.1-1_all.deb
openvswitch-vtep_2.3.1-1_amd64.deb
python-openvswitch_2.3.1-1_all.deb
           

這也是我們需要的相關版本,然後安裝即可(預設認為Docker環境以及安裝好)

sudo apt-get install -y bridge-utils
sudo dpkg -i openvswitch-common_2.3.1-1_amd64.deb \
         openvswitch-switch_2.3.1-1_amd64.deb
           

2、配置網絡

預設兩台機器的IP可以互相ping通,然後,隻需要設定網絡即可

例如在192.168.12.107機器上設定為

# auto:為了有效地在主機啟動時啟動它
# br0=br0:防止在`ifquery --list`時被找到
auto br0=br0
allow-ovs br0
iface br0 inet manual
ovs_type OVSBridge
ovs_ports gre1 gre2
ovs_extra set bridge ${IFACE} stp_enable=true
mtu 1462

# 沒有auto,這是ovs的一個額外配置
# 兩台主機的gre名字必須相符
allow-br0 gre1
iface gre1 inet manual
ovs_type OVSPort
ovs_bridge br0
ovs_extra set interface ${IFACE} type=gre options:remote_ip=192.168.12.117



# auto:啟動時建立
# 定義docker要使用的docker0,并(在可用時)連接配接到到OpenVSwitch建立的br0網橋上
# 每台主機需要使用不同的IP位址(不要互相沖突!)
auto docker0=docker0
iface docker0 inet static
address 172.17.1.1
network 172.17.0.0
netmask 255.255.0.0
bridge_ports br0
mtu 1462
           

在其他機器上,隻需在配對的遠端IP修改即可,如果需要更多的主控端,可以添加更多的gre隧道即可,例如

allow-br0 gre2(新的gre)
iface gre2 inet manual
ovs_type OVSPort
ovs_bridge br0 (都在br0網橋)
ovs_extra set interface ${IFACE} type=gre options:remote_ip=192.168.12.199(新的IP)
           

說明

  • 生成樹協定(Spanning Tree Protocol):如果應用該配置,将在3台伺服器中建立一個網絡回路,這可不行。給

    br0

    網橋添加

    stp_enable=true

    将確定一些

    gre

    隧道被切斷。同時確定網狀網絡的備援,允許網絡在其中一台主機下線時恢複。
  • MTU:這是一項關鍵設定!沒有這項,你可能獲得一些意外“驚喜”:網絡看起來工作正常(比如可以ping),但無法支援大資料包(比如BW測試中的iperf、大資料量請求或簡單的檔案複制)。注意,GRE隧道需要封裝多種協定:
    • 以太網:14位元組——我們說的是網橋間的第2層;
    • IPv4:20位元組——容器/主機間通訊;
    • GRE:4位元組——因為,嗯,這是個GRE隧道;
    • 也就是實體網卡MTU減去38位元組,結果是1462(基于正常的1500 MTU網卡)。
  • 在auto定義中使用“

    =

    ”:對于具有固定IP的伺服器這不是必需的,但有些雲服務商(這裡就不說是誰了……Digital Ocean(譯者:軟廣再次亂入))使用了一個依靠

    ifquery --list --allow auto

    的init服務(

    /etc/init/cloud-init-container.conf

    )。不加上“

    =

    ”号将包含OpenVSwitch網卡,并延遲整個啟動過程直到init腳本失敗并逾時。
  • docker0網橋:每台伺服器都需要自己的IP位址(比如

    172.17.1.1

    172.17.1.2

    )。由于

    docker0

    網橋處在

    br0

    網橋之上,它們将(也應該!)可以互相連接配接。想象一下,要解決IP沖突會有多亂……這也是為什麼我們要在啟動時定義它,而不依賴docker服務來為我們建立這個網橋。
  • GRE隧道:你可以從gre0(而不是gre1)開始,它能完美工作。但由于某種原因,在輸入

    ifconfig

    時你可以看到

    gre0

    ,卻看不到其他隧道。這可能是

    gre0

    作為虛拟網卡的一個副作用。從

    gre1

    開始将讓所有的

    gre

    隧道對

    ifconfig

    “隐身”(好過于隻能看見一個)。别着急,你還是可以使用

    ovs-vsctl

    指令顯示隧道/網橋。
  • 3台以上主機:你可以遵循相同的邏輯,并且:
    • 添加額外的隧道(iface greX)來連接配接新主機。
    • br0

      網橋定義中更新

      ovs_ports

      以包含

      interfaces

      檔案中定義的所有

      gre

      隧道。
    • 聰明點……不要将每台伺服器跟其他主機一一連結……STP收斂(convergence)将需要更長的時間,并且無法提供任何除了多重額外鍊路備援之外的有用價值。

設定完畢之後,建議重新開機機器,然後可以在任意機器上都可以互相ping通管理IP(192.168.12.xxx)和docker0的IP(172.17.1.xxx)

3、容器添加

現在已經有網絡了,需要将各個主控端的容器都添加到docker0裡面

  • 每台主機(

    192.168.12.107

    192.168.17.117

    )挂接到前面建立的

    docker0

    網橋上,其各自的IP位址是

    172.17.1.1

    172.17.1.2

  • docker0

    網卡指定了一個/16的IP範圍;
  • 給每台主機指定了一小塊

    docker0

    的IP範圍,以/18 

    fixed-cidr

    的形式儲存在它們的docker服務配置中。分别是

    172.17.64.0/18

    172.17.128.0/18

如果你的主機多于3台,你需要細分一個每個範圍,或根據組織需要對整個網絡拓撲結構進行重新考慮。

Docker實作跨主機容器執行個體網絡通信(2)——利用OpenVSwitch建構多主機Docker網絡

所需,需要為每一個主控端的docker配置相關IP資訊

例如docker1機器(/etc/default/docker)

BRIDGE=docker0
CIDR=172.17.64.0/18

wait_ip() {
address=$(ip add show $BRIDGE | grep 'inet ' | awk '{print $2}')
[ -z "$address" ] && sleep $1 || :
}

wait_ip 5
wait_ip 15

DOCKER_OPTS="
-H unix:///var/run/docker.sock
-H tcp://0.0.0.0:2375
--fixed-cidr=$CIDR
--bridge $BRIDGE
--mtu 1462
"
           

其他機器的CIDR參考上述即可。

你可以根據需要修改

DOCKER_OPTS

配置,添加鏡像、不安全的registry、DNS等等。

說明:

  • wait_ip:由于

    docker0

    網橋最後被建立,擷取IP位址可能需要花點時間。使用

    wait_ip

    “功能”,你可以在傳回docker init腳本前安全地等待幾秒鐘。該配置檔案是被真正的init腳本(

    /etc/init/docker.conf

    )所引用。
  • mtu:與前面相同原因,隻是一個預防措施,用于確定每個網卡被建立時會被指定正确的MTU。
  • -H tcp://……:如果你不想通過

    0.0.0.0

    将其“公開”(或綁定到伺服器“真實”網卡之一),你也可以将它安全地綁定到……該主機的

    docker0

     IP位址(比如

    172.17.1.2

    )!這樣,你可以從任何一台主機通路到私有網狀網絡裡的任何一個docker服務。

測試

1、分别在docker1和docker2運作容器執行個體

我在docker1運作了兩個ubuntu 14.04執行個體,相關IP分别是172.17.64.1和172.17.64.2

我在docker2運作了一個ubuntu 14.04執行個體,相關IP分别是172.17.128.1

首先測試是否可以ping通

Docker實作跨主機容器執行個體網絡通信(2)——利用OpenVSwitch建構多主機Docker網絡

然後,我針對docker1的64.2容器,與docker2的128.1進行測試,分别安裝了ssh服務,然後為docker2容器建立ss使用者,然後通過docker1的64.2容器,進行ssh遠端連接配接。

Docker實作跨主機容器執行個體網絡通信(2)——利用OpenVSwitch建構多主機Docker網絡

參考文獻

http://dockone.io/article/228

  • https://goldmann.pl/blog/2014/ ... osts/
  • http://networkstatic.net/open- ... tion/
  • http://networkstatic.net/confi ... itch/
  • http://fbevmware.blogspot.com. ... .html
  • http://openvswitch.org/support ... .html
  • https://access.redhat.com/docu ... .html
  • https://communities.vmware.com ... ation
  • http://www.microhowto.info/tro ... .html
  • http://blog.scottlowe.org/2013 ... itch/
  • http://blog.scottlowe.org/2013 ... itch/
  • https://github.com/openvswitch ... an.md
  • http://baturin.org/tools/encapcalc/