1. 程式人生 > 實用技巧 >容器網路(八)如何使用 flannel host-gw【57】

容器網路(八)如何使用 flannel host-gw【57】

(十五)如何使用 flannel host-gw

flannel 支援多種 backend,前面我們討論的是vxlan backend,host-gw 是 flannel 的另一個 backend,本節會將前面的 vxlan backend 切換成 host-gw。

與 vxlan 不同,host-gw 不會封裝資料包,而是在主機的路由表中建立到其他主機 subnet 的路由條目,從而實現容器跨主機通訊。要使用 host-gw 首先修改 flannel 的配置 flannel-config.json:

{
 "Network": "10.2.0.0/16",
 "SubnetLen": 24,
 "Backend": {
   "Type": "host-gw"
 }
}

Typehost-gw替換原先的vxlan。更新 etcd 資料庫:

etcdctl --endpoints=10.0.0.20:2379 set /docker-test/network/config < flannel-config.json

Ctrl+C 掉之前 host1 和 host2 的 flanneld 程序並重啟。

flanneld -etcd-endpoints=http://10.0.0.20:2379 -iface=ens33 -etcd-prefix=/docker-test/network

檢視host1 上 flanneld 啟動輸出:

與之前 vxlan backend 啟動時有幾點不同:

① flanneld 檢查到原先已分配的 subnet 10.2.40.0/24,重用之。

② flanneld 從 etcd 資料庫中檢索到 host2 的 subnet 10.2.17.0/24,但因為其 type=vxlan,立即忽略。

③ 兩分鐘後,再次發現 subnet 10.2.17.0/24,將其加到路由表中。這次沒有忽略 subnet 的原因是此時我們在 host2 上重啟了 flanneld,根據當前 etcd 的配置使用 host-gw backend。

檢視 host1 的路由表,增加了一條到 10.2.17.0/24 的路由,閘道器為 host2 的 IP 10.0.0.22。

host1#ip route

類似的,host2 啟動 flanneld 時會重用 subnet 10.2.17.0/24,並將 host1 的 subnet 10.2.40.0/24 新增到路由表中,閘道器為 host1 IP 10.0.0.21。

從 /run/flannel/subnet.env 可以看到 host-gw 使用的 MTU 為 1500:

這與 vxlan MTU=1450 不同,所以應該修改 docker 啟動引數--mtu=1500並重啟 docker daemon。

下面對 host-gw 和 vxlan 這兩種 backend 做個簡單比較。

  1. host-gw 把每個主機都配置成閘道器,主機知道其他主機的 subnet 和轉發地址。vxlan 則在主機間建立隧道,不同主機的容器都在一個大的網段內(比如 10.2.0.0/16)。
  2. 雖然 vxlan 與 host-gw 使用不同的機制建立主機之間連線,但對於容器則無需任何改變,bbox1 仍然可以與 bbox2 通訊。
  3. 由於 vxlan 需要對資料進行額外打包和拆包,效能會稍遜於 host-gw。