天天看點

容器服務是如何做到的跨主機的容器間通信?

容器服務為叢集中每個容器提供叢集内可達的獨立ip,容器之間就可以通過這個獨立的ip互相通信,而不需要通過nat暴漏到主機端口,解耦了與主控端ip的依賴,是以避免了做nat的時候多個容器端口沖突的問題。而如何實作跨主機的容器通信,在不同網絡模型下面的實作方案如下:

專有網絡(virtual private cloud,簡稱vpc),幫助您基于阿裡雲建構出一個隔離的網絡環境。您可以完全掌控自己的虛拟網絡,包括選擇自有 ip位址範圍、劃分網段、配置路由表和網關等。容器服務通過配置vpc路由表的方式将容器對容器的通路轉發到容器ip網段所對應的ecs機器上。如圖:

容器服務是如何做到的跨主機的容器間通信?

在叢集一台節點(192.168.100.1)上啟動docker 容器的時候将容器的網卡挂載到事先建立好的172.18.1.0/24的網橋,另外一個節點(172.16.1.2)啟動容器時挂載到172.18.2.0/24的網橋,然後設定對應的路由規則到vpc下面的vroute路由表将172.18.1.0/24轉發到192.168.100.1那個節點,另外一個節點也配置類似的路由規則。

如此,比如在節點1上的一個ip為172.18.1.2的容器通路節點二上的一個ip為172.18.2.2的容器,就能通過路由表的轉發将請求轉發到對應的機器上,又通過docker在機器上的網橋建立的路由規則将請求轉發到172.18.2.0/24的網橋上,然後轉發到ip為192.168.2.2對應的容器上。

另外,容器服務在vpc中給containers配置設定了獨立的網段以及路由條目要避免與原有的<code>vswitch網段</code>、<code>路由表條目</code>、<code>機器上的ip路由表沖突</code>,否則請求就可能無法轉發到正确的容器上。

容器服務的vpc網絡模式中,節點上的容器的ip是在所在ecs的ip段中配置設定的,叢集初始化時,會給每個節點配置設定一個/24的ip段,在容器服務的vpc驅動初始化時,會配置設定所在ecs的ip段的一個池子用于配置設定給容器。在容器啟動時,會從這個池子中選擇一個空閑的ip配置設定給容器。

如上述中原理介紹,容器服務是依賴vpc的路由表做容器ip到ecs的流量轉發。在vpc的路由表配置中,我們可以看到容器服務配置的網段到ecs下一跳的配置,這個是容器服務自動完成的,如果配置不小心被删除掉了,可以對照節點上的docker info找到本節點上對應的網段,手動恢複到vpc的路由表中。

如上述,容器間通信是節點間通過各自的ip位址互相通信的,在容器從主控端的eth0出來到目的網段的主控端的eth0的過程中,會被ecs的安全組過濾,是以安全組的出方向和入方向都需要開放容器的網段,這個配置在容器服務建立叢集時是預設配置在叢集的安全組中的。如果需要别的安全組的容器或者ecs通路容器的網段,同樣需要開放出入的容器網段的安全組規則。

預設情況下,docker會給自定義的網絡配置設定叫<code>docker_gwbridge</code>的網橋,我在這篇文章中有對其的介紹,<code>docker_gwbridge</code>網橋會從<code>172.16.0.0/12</code>自動選擇一個空閑的<code>/16</code>的ip段,空閑的定義是在主控端的路由表(<code>ip route</code>)中無沖突的網段。如果你在容器中通路的位址剛好跟<code>docker_gwbridge</code>網段沖突的話,可能會造成通路問題,解決這個問題的方法是事先在節點上建立好<code>docker_gwbridge</code>網段,或者有通路問題時重建<code>docker_gwbridge</code>網段。

從docker 1.9開始,docker通過vxlan的協定支援原生的跨主機的容器網絡,在classic網絡環境下,容器服務基于docker overlay network建立一個叢集内容器互通的網絡環境,通過overlay的網絡虛拟出多主機中的容器網絡是同一個虛拟出的子網,進而容器可以跨主機的互相通信。

在多容器的應用中,link常用于描述容器間的依賴,比如wordpress的web服務依賴于mysql的資料庫服務,那麼wordpress容器啟動時就可以通過link的方式去擷取mysql容器的一系列參數,例如資料庫連接配接ip,端口等。

但是docker的link僅支援在同一個主機節點上,而容器服務支援跨節點的容器連接配接,當容器ip變化是,連結容器中容器别名也會跟着變化。這些行為和單節點上使用link是一緻的

aliyun vpc服務

get started with multi-host networking

understand docker container networks

docker container links

想了解更多容器服務的内容,請點選https://www.aliyun.com/product/containerservice