欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

利用OpenVSwitch在多臺主機(jī)上部署Docker的教程

 更新時(shí)間:2015年03月31日 09:49:19   作者:sean  
這篇文章主要介紹了利用OpenVSwitch在多臺主機(jī)上部署Docker的教程,包括配置多個(gè)容器的IP地址等內(nèi)容,需要的朋友可以參考下

【編者的話】當(dāng)你在一臺主機(jī)上成功運(yùn)行Docker容器后,信心滿滿地打算將其擴(kuò)展到多臺主機(jī)時(shí),卻發(fā)現(xiàn)前面的嘗試只相當(dāng)于寫了個(gè)Hello World的入門程序,多主機(jī)的網(wǎng)絡(luò)設(shè)置成了下一道門檻。在你嘗試各種方案時(shí)不妨先看看本文,或許就會豁然開朗,發(fā)現(xiàn)原來也不復(fù)雜。嗯,是的,本文用到了 OpenVSwitch。

運(yùn)行Docker已經(jīng)不是什么新鮮事,網(wǎng)上有很多入門教程來幫助你在一臺主機(jī)上運(yùn)行容器。這臺主機(jī)可以是Linux服務(wù)器,也可以是Mac(借助類似boot2docker的項(xiàng)目)。

在多臺主機(jī)上運(yùn)行卻是另外一回事……

可選方案:

    分別在每臺主機(jī)上運(yùn)行Docker,在公網(wǎng)或內(nèi)網(wǎng)網(wǎng)卡上暴露端口以便容器間相互通訊。這可能比較麻煩,而且會引發(fā)安全問題。
    運(yùn)行類似Weave的中間層方案來完全地抽象網(wǎng)絡(luò)。這個(gè)項(xiàng)目前景不錯(cuò),不過還太年輕,尚未與compose(之前的fig)或maestro-ng這類編排工具整合。
    運(yùn)行類似DeisFlynn的Docker多主機(jī)一站式方案。這可能不在你的考慮范圍內(nèi)。
    在主機(jī)間的網(wǎng)狀網(wǎng)絡(luò)中創(chuàng)建一個(gè)共享網(wǎng)橋,讓Docker服務(wù)在那運(yùn)行容器。這聽起來有點(diǎn)復(fù)雜,不過……本文中我們將看到這可以非常容易地完成!
201533192619750.jpg (720×540)概述

基本上,我們將執(zhí)行以下步驟:

  •     在每臺服務(wù)器上安裝Docker;
  •     在每臺服務(wù)器上安裝OpenVSwitch;
  •     自定義網(wǎng)絡(luò)設(shè)置用以自動在主機(jī)間創(chuàng)建網(wǎng)橋/隧道(在每臺服務(wù)器的/etc/network/interfaces里);
  •     自定義每個(gè)Docker服務(wù)配置,只處理docker0 IP范圍的一小部分,防止新容器的IP地址發(fā)生重疊。


就是這樣。重啟服務(wù)或重啟服務(wù)器后,你將獲得一個(gè)具備連接冗余(link redundancy)的全網(wǎng)狀網(wǎng)絡(luò),Docker服務(wù)可以在專用的IP范圍(不會重疊)上運(yùn)行容器,并且不需要在公網(wǎng)或內(nèi)網(wǎng)網(wǎng)卡上暴露所有端口就能互聯(lián)。很棒,對么?
技術(shù)

簡單列一下我們用到的技術(shù):

  •     Docker:嗯……這是篇關(guān)于Docker與網(wǎng)絡(luò)的文章,所以……
  •     OpenVSwitch:非常棒的虛擬網(wǎng)絡(luò)交換機(jī)項(xiàng)目,伸縮性非常好,根據(jù)本指南,你可以運(yùn)行“任意”規(guī)模的網(wǎng)絡(luò)。


我們將假定服務(wù)器運(yùn)行的是Ubuntu Server 14.04.02 LTS x64,對于其它系統(tǒng),你可能需要修改下面提供的各項(xiàng)配置。
安裝
Docker

無需多言,遵循官網(wǎng)提供的指南就行。稍后我們將深入其配置,以便運(yùn)行于服務(wù)器上的不同Docker服務(wù)可相互協(xié)作。
OpenVSwitch

糟糕的是,默認(rèn)倉庫里OpenVSwitch安裝包不可用(或過期了),我們需要自己構(gòu)建.deb文件(一次),然后分發(fā)給不同主機(jī)。為了保持生產(chǎn)機(jī)的整潔,可另外找臺小主機(jī)來安裝開發(fā)包,并構(gòu)建安裝包。

OpenVSwitch GitHub上有詳細(xì)的構(gòu)建手冊。

執(zhí)行下列命令來構(gòu)建安裝包(新版請按要求修改):

#獲取最新存檔
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

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

# 得到最新deb文件并復(fù)制到某處
cd ..
ls -al *deb


現(xiàn)在你有了新的.deb安裝包,接下來將其推送并安裝到所有主機(jī)上。

# 復(fù)制包到各主機(jī)并ssh登錄
scp -r *deb user@remote_host:~/.
ssh user@remote_host

# 安裝一些依賴(后面需要)并安裝包
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

 
配置
網(wǎng)絡(luò)

你可以使用OpenVSwitch提供的不同命令行工具來構(gòu)建網(wǎng)狀網(wǎng)絡(luò)(比如ovs-vsctl),不過Ubuntu提供了一個(gè)輔助工具讓你可以通過/etc/network/interfaces文件定義網(wǎng)絡(luò)。

假定三臺主機(jī):1.1.1.1、2.2.2.2和3.3.3.3,可以通過上述IP相互ping通,它們是在公網(wǎng)或內(nèi)網(wǎng)上并不重要。host1的/etc/network/interfaces大概如下。

...
# eth0、eth1和lo配置
...

# auto:為了有效地在主機(jī)啟動時(shí)啟動它
# br0=br0:防止在`ifquery --list`時(shí)被找到
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的一個(gè)額外配置
# 兩臺主機(jī)的gre名字必須相符
allow-br0 gre1
iface gre1 inet manual
ovs_type OVSPort
ovs_bridge br0
ovs_extra set interface ${IFACE} type=gre options:remote_ip=2.2.2.2

allow-br0 gre2
iface gre2 inet manual
ovs_type OVSPort
ovs_bridge br0
ovs_extra set interface ${IFACE} type=gre options:remote_ip=3.3.3.3

# auto:啟動時(shí)創(chuàng)建
# 定義docker要使用的docker0,并(在可用時(shí))連接到到OpenVSwitch創(chuàng)建的br0網(wǎng)橋上
# 每臺主機(jī)需要使用不同的IP地址(不要相互沖突?。?
auto docker0=docker0
iface docker0 inet static
address 172.17.42.1
network 172.17.0.0
netmask 255.255.0.0
bridge_ports br0
mtu 1462


在其它主機(jī)上要對這個(gè)配置上做些調(diào)整:remote_ip的IP地址要相互配對。

201533192719156.jpg (720×540)幾點(diǎn)說明:

  •     生成樹協(xié)議(Spanning Tree Protocol):如果應(yīng)用該配置,將在3臺服務(wù)器中創(chuàng)建一個(gè)網(wǎng)絡(luò)回路,這可不行。給br0網(wǎng)橋添加stp_enable=true將確保一些gre隧道被切斷。同時(shí)確保網(wǎng)狀網(wǎng)絡(luò)的冗余,允許網(wǎng)絡(luò)在其中一臺主機(jī)下線時(shí)恢復(fù)。
  •     MTU:這是一項(xiàng)關(guān)鍵設(shè)定!沒有這項(xiàng),你可能獲得一些意外“驚喜”:網(wǎng)絡(luò)看起來工作正常(比如可以ping),但無法支持大數(shù)據(jù)包(比如BW測試中的iperf、大數(shù)據(jù)量請求或簡單的文件復(fù)制)。注意,GRE隧道需要封裝多種協(xié)議:
  •         以太網(wǎng):14字節(jié)——我們說的是網(wǎng)橋間的第2層;
  •         IPv4:20字節(jié)——容器/主機(jī)間通訊;
  •         GRE:4字節(jié)——因?yàn)?,嗯,這是個(gè)GRE隧道;
  •         也就是物理網(wǎng)卡MTU減去38字節(jié),結(jié)果是1462(基于常規(guī)的1500 MTU網(wǎng)卡)。
  •     在auto定義中使用“=”:對于具有固定IP的服務(wù)器這不是必需的,但有些云服務(wù)商(這里就不說是誰了……Digital Ocean(譯者:軟廣再次亂入))使用了一個(gè)依靠ifquery --list --allow auto的init服務(wù)(/etc/init/cloud-init-container.conf)。不加上“=”號將包含OpenVSwitch網(wǎng)卡,并延遲整個(gè)啟動過程直到init腳本失敗并超時(shí)。
  •     docker0網(wǎng)橋:每臺服務(wù)器都需要自己的IP地址(比如172.17.42.1、172.17.42.2)。由于docker0網(wǎng)橋處在br0網(wǎng)橋之上,它們將(也應(yīng)該!)可以相互連接。想象一下,要解決IP沖突會有多亂……這也是為什么我們要在啟動時(shí)定義它,而不依賴docker服務(wù)來為我們創(chuàng)建這個(gè)網(wǎng)橋。
  •     GRE隧道:你可以從gre0(而不是gre1)開始,它能完美工作。但由于某種原因,在輸入ifconfig時(shí)你可以看到gre0,卻看不到其他隧道。這可能是gre0作為虛擬網(wǎng)卡的一個(gè)副作用。從gre1開始將讓所有的gre隧道對ifconfig“隱身”(好過于只能看見一個(gè))。別著急,你還是可以使用ovs-vsctl命令顯示隧道/網(wǎng)橋。
  •     3臺以上主機(jī):你可以遵循相同的邏輯,并且:
  •         添加額外的隧道(iface greX)來連接新主機(jī)。
  •         在br0網(wǎng)橋定義中更新ovs_ports以包含interfaces文件中定義的所有g(shù)re隧道。
  •         聰明點(diǎn)……不要將每臺服務(wù)器跟其他主機(jī)一一鏈接……STP收斂(convergence)將需要更長的時(shí)間,并且無法提供任何除了多重額外鏈路冗余之外的有用價(jià)值。


如果現(xiàn)在重啟服務(wù)器,你將擁有一個(gè)具備冗余的網(wǎng)狀網(wǎng)絡(luò),你可以運(yùn)行以下命令來測試:

  •     從host1上ping 172.17.42.2或其他IP;
  •     在主機(jī)上運(yùn)行iperf,通過ifconfig查看使用中的鏈接;
  •     在ping第三臺主機(jī)時(shí)停止“中間”那臺,查看網(wǎng)絡(luò)收斂(通過STP)時(shí)ping中斷了幾秒鐘。


201533192746734.jpg (720×540)

Docker

我們現(xiàn)在有了一個(gè)完善的網(wǎng)絡(luò),每個(gè)Docker服務(wù)都可以將它們的容器掛接到docker0網(wǎng)橋上。讓Docker自動完成這步不是很棒么?答案在于Docker有能力分配一個(gè)最小的IP地址池!

對于該示例,我們假定:

  •     每臺主機(jī)(1.1.1.1、2.2.2.2、3.3.3.3)掛接到前面創(chuàng)建的docker0網(wǎng)橋上,其各自的IP地址是172.17.42.1、172.17.42.2、172.17.42.3;
  •     給docker0網(wǎng)卡指定了一個(gè)/16的IP范圍;
  •     給每臺主機(jī)指定了一小塊docker0的IP范圍,以/18 fixed-cidr的形式保存在它們的docker服務(wù)配置中。分別是172.17.64.0/18、172.17.128.0/18、172.17.192.0/18。


如果你的主機(jī)多于3臺,你需要細(xì)分一個(gè)每個(gè)范圍,或根據(jù)組織需要對整個(gè)網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu)進(jìn)行重新考慮。
201533192746734.jpg (720×540)

host1的配置文件(/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
"


你可以根據(jù)需要修改DOCKER_OPTS配置,添加鏡像、不安全的registry、DNS等等。

說明:

  •     wait_ip:由于docker0網(wǎng)橋最后被創(chuàng)建,獲取IP地址可能需要花點(diǎn)時(shí)間。使用wait_ip“功能”,你可以在返回docker init腳本前安全地等待幾秒鐘。該配置文件是被真正的init腳本(/etc/init/docker.conf)所引用。
  •     mtu:與前面相同原因,只是一個(gè)預(yù)防措施,用于確保每個(gè)網(wǎng)卡被創(chuàng)建時(shí)會被指定正確的MTU。
  •     -H tcp://……:如果你不想通過0.0.0.0將其“公開”(或綁定到服務(wù)器“真實(shí)”網(wǎng)卡之一),你也可以將它安全地綁定到……該主機(jī)的docker0 IP地址(比如172.17.42.2)!這樣,你可以從任何一臺主機(jī)訪問到私有網(wǎng)狀網(wǎng)絡(luò)里的任何一個(gè)docker服務(wù)。

結(jié)語

重啟一下(至少保證啟動時(shí)所有東西都會自動上線)。

你可以試試以下命令看看一切是否正常。

# 訪問host1
ssh user@host1

# 運(yùn)行一個(gè)新容器
docker run -ti ubuntu bash

# 檢查IP(在容器內(nèi)運(yùn)行)
ip add | grep eth0


#
# 在其他窗口中
#
# 訪問另一臺主機(jī)(host2或3)
ssh user@host2

# 運(yùn)行一個(gè)新容器
docker run -ti ubuntu bash

# Ping其他的容器!
ping $IP


這不是一份指導(dǎo)如何在多主機(jī)上設(shè)置Docker的權(quán)威指南,歡迎大家提出批評(譯者注:譯稿也一樣,請大家多多指正)。很多想法是在整體安裝時(shí)產(chǎn)生的,本文盡可能詳細(xì)地說明了為何選擇這個(gè)或那個(gè)選項(xiàng)。

如果將分級網(wǎng)橋、VLAN等包括進(jìn)來,事情將更復(fù)雜,不過那超出了本文的范圍。;)

顯然,更完整的網(wǎng)絡(luò)是有需求的,而且看起來這個(gè)已經(jīng)在開發(fā)中。

相關(guān)文章

  • 減少Docker鏡像大小的10個(gè)優(yōu)化技巧

    減少Docker鏡像大小的10個(gè)優(yōu)化技巧

    當(dāng)使用Docker時(shí),鏡像大小是一個(gè)很大的問題,下面這篇文章主要給大家介紹了關(guān)于減少Docker鏡像大小的10個(gè)優(yōu)化技巧,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • docker容器下配置jupyter notebook的操作

    docker容器下配置jupyter notebook的操作

    這篇文章主要介紹了docker容器下配置jupyter notebook的操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-03-03
  • docker測試時(shí)候命令無法補(bǔ)全的解決方法

    docker測試時(shí)候命令無法補(bǔ)全的解決方法

    因?yàn)樽罱趯W(xué)習(xí)使用Docker,所以出現(xiàn)了好多的問題,昨天遇到的一個(gè)問題是在docker測試時(shí)候發(fā)現(xiàn)命令無法補(bǔ)全,通過查找資料最后解決了,現(xiàn)在將方法分享給有需要的人,大家可以參考學(xué)習(xí)。
    2016-11-11
  • docker python如何實(shí)現(xiàn)打包的方法

    docker python如何實(shí)現(xiàn)打包的方法

    這篇文章主要介紹了docker 打包python實(shí)現(xiàn)方法的相關(guān)資料,這里說明如今實(shí)現(xiàn),需要的朋友可以參考下
    2016-12-12
  • Docker 默認(rèn)bridge網(wǎng)絡(luò)中配置DNS的方法

    Docker 默認(rèn)bridge網(wǎng)絡(luò)中配置DNS的方法

    這篇文章主要介紹了Docker 默認(rèn)bridge網(wǎng)絡(luò)中配置DNS的方法,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-03-03
  • docker啟動mysql并映射數(shù)據(jù)目錄(含備份腳本)

    docker啟動mysql并映射數(shù)據(jù)目錄(含備份腳本)

    本文主要介紹了docker啟動mysql并映射數(shù)據(jù)目錄(含備份腳本),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • Docker中 container 和 image 的命名

    Docker中 container 和 image 的命名

    這篇文章主要介紹了Docker中container和image的命名,文章基于Docker的相關(guān)資料展開對container和image的命名介紹,需要的小伙伴可以參考一下
    2022-04-04
  • docker運(yùn)行項(xiàng)目的方法

    docker運(yùn)行項(xiàng)目的方法

    在本篇文章里小編給大家分享的是關(guān)于docker運(yùn)行項(xiàng)目的方法和實(shí)例,需要的朋友們學(xué)習(xí)參考下。
    2020-03-03
  • 如何利用Docker部署一個(gè)簡單的springboot項(xiàng)目

    如何利用Docker部署一個(gè)簡單的springboot項(xiàng)目

    這篇文章主要介紹了如何利用Docker部署一個(gè)簡單的springboot項(xiàng)目,本文通過實(shí)例圖文實(shí)例代碼相結(jié)合給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-02-02
  • docker倉庫登錄及配置insecure-registries的方法

    docker倉庫登錄及配置insecure-registries的方法

    這篇文章主要介紹了docker倉庫登錄配置insecure-registries的方法,docker客戶端如果配置中添加了insecure-registary配置,就不需要在docker 客戶端配置上對應(yīng)證書,如果不配置要在/etc/docker/certs.d/目錄中添加對應(yīng)證書才能正常登錄,感興趣的朋友跟隨小編一起看看吧
    2022-07-07

最新評論