1. 程式人生 > >docker overlay網路拓撲及服務註冊問題

docker overlay網路拓撲及服務註冊問題

跨主機docker網路有多種方案,如overlay、flannel、calico、weave等,其中overlay是docker原生的跨主機網路方案。最近使用overlay方案部署容器叢集,在進行服務註冊時遇到問題,需要手動建立veth裝置解決。

 

1. overlay網路拓撲


overlay網路中,docker會為每一個overlay網路建立一個獨立的network namespace,即上圖中的net1和net2。每個namespace中都有一個linux bridge br0,docker容器與br0之間通過veth pair連線,一端為容器中的eth0,另一端通過namespace中的veth介面連線到br0。br0還連線了vxlan1,通過vxlan隧道實現跨主機容器通訊。

br0沒有與宿主機namespace中的介面相連,因此容器無法通過eth0與主機通訊。在overlay網路中,為了實現容器與主機之間的通訊,在宿主機namespace中建立了linux bridge docker_gwbridge。所有容器都通過veth pair連線到該網橋中。上圖中,容器可以通過eth1與宿主機通訊。eth1介面僅用於容器與宿主機通訊,即使位於同一個overlay網路中的容器間,也無法通過eth1介面通訊。


2. 服務註冊問題


最近,使用overlay網路部署容器集群后,需要將容器的IP地址和埠註冊到api閘道器中,api閘道器將容器提供的服務進行對映,對外暴露統一的IP地址。有兩種使用場景:

a) 叢集外部通過api閘道器查詢服務,通過對映後的地址和埠號訪問

b) 叢集內部通過api閘道器查詢服務,可通過對映後的地址和埠號訪問,也可直接選擇容器的地址和埠號訪問

在以上的應用場景中,通過對映後的地址和埠號服務,訪問服務時需要經過api閘道器,再到達容器。在我的叢集中,api閘道器使用host方式部署,與提供服務的容器之間通過eth1介面進行通訊,容器向api網關注冊時,服務的IP地址必須為eth1的IP地址,才能保證通過api閘道器順利轉發。但這時,叢集內訪問時,查詢到的容器IP是eth1的IP地址,無法直接訪問。如果註冊時服務的IP採用eth0的IP,則無法通過api閘道器轉發。
為了解決以上問題,我通過vethpair裝置將overlay網路直接與宿主機相連通。這樣,將eth0的IP註冊到api閘道器,同樣能通過api閘道器進行轉發。具體步驟如下:

  建立vethpair裝置:
      ip link add vethhost type veth peer name gw_api:
  將vethpair的vethhost一端連線到overlay網路的namespace中,namespace可在/var/run/netns中找到,橫線後為overlay網路的ID(cae3e00181)
      ip link set vethhost netns 1-cae3e00181
  將vethhost端接入br0網橋:
      ip netns exec 1-cae3e00181 brctl addif br0 vethhost
  設定vethhost端mtu並up:
      ip netns exec 1-cae3e00181 ifconfig vethhost mtu 1450 up
  設定gw_api端mtu和IP地址(overlay網路同網段IP)
      ifconfig gw_api mtu 1450 193.168.120.1/16

經過上述設定,容器與api閘道器的網路拓撲如下(省略了net2):

 

由於apigateway使用宿主機網路,可以通過gw_api介面與overlay網路net1通訊。

在這一解決方法中,我修改了overlay網路的拓撲。暫時沒有考慮其他幾種跨主機容器網路方案能不能避免該問題,等有時間研究一下k8s的網路方案,或許會有更多收穫。