中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何利用OpenVSwitch在多臺主機上部署Docker

發布時間:2022-05-26 16:31:43 來源:億速云 閱讀:270 作者:iii 欄目:大數據

本篇內容主要講解“如何利用OpenVSwitch在多臺主機上部署Docker”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“如何利用OpenVSwitch在多臺主機上部署Docker”吧!

安裝
docker

無需多言,遵循提供的指南就行。稍后我們將深入其配置,以便運行于服務器上的不同docker服務可相互協作。
openvswitch

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

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

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


現在你有了新的.deb安裝包,接下來將其推送并安裝到所有主機上。

# 復制包到各主機并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

 
配置
網絡

你可以使用openvswitch提供的不同命令行工具來構建網狀網絡(比如ovs-vsctl),不過ubuntu提供了一個輔助工具讓你可以通過/etc/network/interfaces文件定義網絡。

假定三臺主機:1.1.1.1、2.2.2.2和3.3.3.3,可以通過上述ip相互ping通,它們是在公網或內網上并不重要。host1的/etc/network/interfaces大概如下。

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

# 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=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:啟動時創建
# 定義docker要使用的docker0,并(在可用時)連接到到openvswitch創建的br0網橋上
# 每臺主機需要使用不同的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


在其它主機上要對這個配置上做些調整:remote_ip的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.42.1、172.17.42.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)將需要更長的時間,并且無法提供任何除了多重額外鏈路冗余之外的有用價值。


如果現在重啟服務器,你將擁有一個具備冗余的網狀網絡,你可以運行以下命令來測試:

  •     從host1上ping 172.17.42.2或其他ip;

  •     在主機上運行iperf,通過ifconfig查看使用中的鏈接;

  •     在ping第三臺主機時停止“中間”那臺,查看網絡收斂(通過stp)時ping中斷了幾秒鐘。

docker

我們現在有了一個完善的網絡,每個docker服務都可以將它們的容器掛接到docker0網橋上。讓docker自動完成這步不是很棒么?答案在于docker有能力分配一個最小的ip地址池!

對于該示例,我們假定:

  •     每臺主機(1.1.1.1、2.2.2.2、3.3.3.3)掛接到前面創建的docker0網橋上,其各自的ip地址是172.17.42.1、172.17.42.2、172.17.42.3;

  •     給docker0網卡指定了一個/16的ip范圍;

  •     給每臺主機指定了一小塊docker0的ip范圍,以/18 fixed-cidr的形式保存在它們的docker服務配置中。分別是172.17.64.0/18、172.17.128.0/18、172.17.192.0/18。


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

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
"


你可以根據需要修改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.42.2)!這樣,你可以從任何一臺主機訪問到私有網狀網絡里的任何一個docker服務。

結語

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

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

# 訪問host1
ssh user@host1

# 運行一個新容器
docker run -ti ubuntu bash

# 檢查ip(在容器內運行)
ip add | grep eth0


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

# 運行一個新容器
docker run -ti ubuntu bash

# ping其他的容器!
ping $ip

到此,相信大家對“如何利用OpenVSwitch在多臺主機上部署Docker”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

中江县| 奉节县| 常德市| 于都县| 沅陵县| 金乡县| 金溪县| 河南省| 娱乐| 蚌埠市| 宁海县| 河东区| 济源市| 五台县| 栾川县| 治多县| 松江区| 长岛县| 乐业县| 沂南县| 宜宾市| 河源市| 谷城县| 鄢陵县| 福鼎市| 宁国市| 库伦旗| 油尖旺区| 中卫市| 镇宁| 汕头市| 同江市| 镇江市| 叶城县| 紫金县| 台东市| 建瓯市| 兴义市| 沛县| 南乐县| 兴业县|