Weave簡介
當(dāng)容器分布在多個不同的主機(jī)上時悼嫉,這些容器之間的相互通信變得復(fù)雜起來履怯。容器在不同主機(jī)之間都使用的是自己的私有IP地址回还,不同主機(jī)的容器之間進(jìn)行通訊需要將主機(jī)的端口映射到容器的端口上,而且IP地址需要使用主機(jī)的IP地址叹洲。Weave正是為了解決這個問題而出現(xiàn)的柠硕,它把不同主機(jī)上容器互相連接的網(wǎng)絡(luò)虛擬成一個類似于本地網(wǎng)絡(luò)的網(wǎng)絡(luò)。
如果了解SDN技術(shù)或者部署過OpenStack的網(wǎng)絡(luò)模塊(Neutron)的話运提,這里通過Weave構(gòu)建的網(wǎng)絡(luò)與它們比較類似蝗柔。它是在一個網(wǎng)絡(luò)的基礎(chǔ)上,構(gòu)建了一層由軟件定義的網(wǎng)絡(luò)層民泵,這個網(wǎng)絡(luò)看起來就像是一個本地的局域網(wǎng)癣丧,但是實際上它的底層通過另一個網(wǎng)絡(luò)進(jìn)行通信。這個網(wǎng)絡(luò)可能會比實際物理局域網(wǎng)的可靠性要差一些栈妆,但是從可用性角度來看胁编,它帶來了很大的便利性:可以在位于不同位置的節(jié)點之間通信,而好像它們在一個地方一樣鳞尔。也可以把這種網(wǎng)絡(luò)想象成一個類似于VPN似的東西嬉橙。
weave通過在docker集群的每個主機(jī)上啟動虛擬的路由器,將主機(jī)作為路由器寥假,形成互聯(lián)互通的網(wǎng)絡(luò)拓?fù)涫锌颍诖嘶A(chǔ)上,實現(xiàn)容器的跨主機(jī)通信昧旨。其主機(jī)網(wǎng)絡(luò)拓?fù)鋮⒁娤聢D:
如上圖所示拾给,在每一個部署Docker的主機(jī)(可能是物理機(jī)也可能是虛擬機(jī))上都部署有一個W(即weave router祥得,它本身也可以以一個容器的形式部署)。
Weave的安裝與啟動
安裝
sudo curl -L git.io/weave -o /usr/local/bin/weave
sudo chmod a+x /usr/local/bin/weave
可以通過以下命令檢驗是否安裝完成
weave version
weave status
啟動
weave launch
之后會pull下來3個鏡像蒋得,分別是
REPOSITORY TAG IMAGE ID CREATED SIZE
weaveworks/weaveexec 2.4.1 9e84d368c391 2 days ago 151MB
weaveworks/weave 2.4.1 ff4c735f9ce5 2 days ago 96.6MB
weaveworks/weavedb latest 15c78a9b1895 7 weeks ago 698B
還會run一個容器
325677aa3f97 weaveworks/weave:2.4.1 "/home/weave/weaver …" 19 hours ago Up 19 hours weave
還會新啟動一個網(wǎng)絡(luò)
NETWORK ID NAME DRIVER SCOPE
ae3da1032819 weave weavemesh local
Weave的部署
1)機(jī)器環(huán)境準(zhǔn)備:(2臺云服務(wù)器)
node-1:119.29.241.15
node-2:134.175.64.74
2)在3臺機(jī)上均啟動一個應(yīng)用容器
由于weave2.0版本里 weave run命令已經(jīng)remove级及,所以此處采取docker run + weave connect的方式
在node-1上啟動容器my-test1
docker run -itd --name=my-test1
weave attach 192.168.0.2/24 my-test1 // weave detach 192.168.0.2/24 my-test1表示刪除這個綁定
docker exec -ti my-test1 /bin/sh
ifconfig
在config中,可以看到有eth0和weave兩個網(wǎng)橋
eth0 Link encap:Ethernet HWaddr 02:42:AC:11:00:04
inet addr:172.17.0.4 Bcast:0.0.0.0 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:40 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2296 (2.2 KiB) TX bytes:0 (0.0 B)
ethwe Link encap:Ethernet HWaddr E2:E9:8E:EC:B2:84
inet addr:192.168.0.2 Bcast:192.168.0.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1376 Metric:1
RX packets:42 errors:0 dropped:0 overruns:0 frame:0
TX packets:29 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:2618 (2.5 KiB) TX bytes:1946 (1.9 KiB)
在node-1上啟動容器my-test2额衙,重復(fù)node-1的操作
docker run -itd --name=my-test2
weave attach 192.168.0.3/24 my-test2
docker exec -ti my-test2 /bin/sh
ifconfig
應(yīng)該也可以看到my-test2的網(wǎng)絡(luò)情況
3)容器互聯(lián)
默認(rèn)情況下饮焦,上面在node-1和node-2兩臺宿主機(jī)上創(chuàng)建的2個容器間都是相互ping不通的。需要使用weave connect命令在兩臺weave的路由器之間建立連接窍侧。
在node-1上執(zhí)行
weave connect 134.175.64.74 // weave forget ip則表示斷開這個連接
然后就會發(fā)現(xiàn)县踢,此時位于兩臺不同主機(jī)上的相同子網(wǎng)段內(nèi)的容器之間可以相互ping通了。再在node-1上啟動容器my-test3伟件,綁定ip為192.168.0.8硼啤,在node-2上啟動容器my-test4,綁定ip為192.168.0.10會發(fā)現(xiàn)這四個在同一個子網(wǎng)內(nèi)的容器都是可以相互ping通的斧账。再接著啟動與上面不在同一個子網(wǎng)內(nèi)的容器node-1上啟動容器my-test5谴返,綁定ip為192.168.10.10,node-2上啟動容器my-test6咧织,綁定ip為192.168.10.20嗓袱。會發(fā)現(xiàn)在跨主機(jī)情況下,相同子網(wǎng)內(nèi)的容器是可以相互通信的习绢;但是處于不同子網(wǎng)的兩個容器是不能互聯(lián)的渠抹,盡管這兩個容器在同一個主機(jī)下也是不能通信的!
這樣的好處就是:使用不同子網(wǎng)進(jìn)行容器間的網(wǎng)絡(luò)隔離了闪萄。