背景
近期,公司網絡要遷移到新的網段,所以原來在服務器上面搭建的docker swarm需要重新構建。。。
拿到新的服務器地址看了一下,“10.xxx.xxx.xxx" 。。。 納尼,這IP趕腳是子網的地址段呀,居然用到了服務器上面!唉,算了吧,當時也沒多想,可能是自己少見多怪吧。。。於是就把幾台服務啟動swarm搭建好,配置好了manager和work節點,然后創建了Overlay網絡,在上面用2個busybox的container做了個小測試,container之間可以連接,於是把之前停止的container都啟動,完事后這樣高高興興的下班啦!!(不加班的生活真美好)
第二天一到公司,還沒坐穩呢,旁邊的哥們就急急忙忙的過來找我,“我們的app無法連接到數據庫,報錯啦!!”(PS: 我們的app和數據庫分別跑在了不同宿主機的container上面,彼此通過docker的子網進行通信)。 奇怪吖,我昨天還試了試可以通信呀,怎么今天就不行了呢??
分析問題
我們總共有3台機器掛在swarm下,有一台機器是manager(我們簡單起見,命名為M),另外兩台作為worker(W1+W2)加入到swarm集群中。簡單的拓撲結構如下圖:
昨天,我做測試的時候是用的M與W1,當時沒出現問題;今天出現問題的是M與W2,containers 之間無法通信; 之后,我又嘗試在W1與W2上面運行containers,也無法通信。。。。
沒辦法,嘗試着重新創建swarm集群,然后再創建跨節點的overlay網絡,然而,得到了令人驚奇的結果,這次所有container都無法通信!!
於是,先從swarm集群入手排錯,swarm運行正常,沒有任何發現。。。再從overlay網絡層面進行分析,運行指令:
#docker network inspect myOverlayNet
發現docker默認創建的子網是 10.0.0.0
會不會是由於docker 子網與 host 機器的網絡 同在一個網段(10.xxx.xxx.xxx)而導致的沖突呢???
解決
重新建立子網, 這次指定好subnet的網段,為了和host機器區分開來,使用了192.~的網段,命令如下
#docker network create -d overlay --subnet=192.168.0.0/24 --attachable myOverlay
在不同的hosts(M, W1 與 W2)上面新建立containers,(busybox1, busybox2 和 busybox3)
## run busybox1 on manage node # docker run -itd --name=busybox1 --network=myOverlay busybox /bin/sh ## run busybox2 on worker node 1 # docker run -itd --name=busybox2 --network=myOverlay busybox /bin/sh ## run busybox3 on worker node 2 # docker run -itd --name=busybox3 --network=myOverlay busybox /bin/sh
進入container,測試連接
##在 busybox1 里測試連接到 busybox2 and busybox3 # nslookup busybox2 --output-- Name: busybox2 Address: 192.168.0.2 busybox2.myOverlay # nslookup busybox3 --output-- Name: busybox3 Address: 192.168.0.3 busybox3.myOverlay
OK,這次通信沒有問題啦,看來真的是docker 的默認子網(10.0.0.0)與服務器(宿主機)上的IP段(10.xxx.xxx.xxx)沖突導致的問題。
所以我們的解決方案就是: 在創建 docker 子網的時候指定IP段
最后,感謝大家的關注,歡迎大家留言交流 :)