flannel 支援多種 backend,前面我們讨論的是 vxlan,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"
}
}
<code>Type</code> 用 <code>host-gw</code> 替換原先的 <code>vxlan</code>。更新 etcd 資料庫:
etcdctl --endpoints=192.168.56.101:2379 set /docker-test/network/config < flannel-config.json
Ctrl+C 掉之前 host1 和 host2 的 flanneld 程序并重新開機。
flanneld -etcd-endpoints=http://192.168.56.101:2379 -iface=enp0s8 -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,但因為其 <code>type=vxlan</code>,立即忽略。
③ 兩分鐘後,再次發現 subnet 10.2.17.0/24,将其加到路由表中。這次沒有忽略 subnet 的原因是此時我們在 host2 上重新開機了 flanneld,根據目前 etcd 的配置使用 host-gw backend。
檢視 host1 的路由表,增加了一條到 10.2.17.0/24 的路由,網關為 host2 的 IP 192.168.56.105。
類似的,host2 啟動 flanneld 時會重用 subnet 10.2.17.0/24,并将 host1 的 subnet 10.2.40.0/24 添加到路由表中,網關為 host1 IP 192.168.56.104。
從 /run/flannel/subnet.env 可以看到 host-gw 使用的 MTU 為 1500:
這與 vxlan MTU=1450 不同,是以應該修改 docker 啟動參數 <code>--mtu=1500</code>并重新開機 docker daemon。
下面對 host-gw 和 vxlan 這兩種 backend 做個簡單比較。
host-gw 把每個主機都配置成網關,主機知道其他主機的 subnet 和轉發位址。vxlan 則在主機間建立隧道,不同主機的容器都在一個大的網段内(比如 10.2.0.0/16)。
雖然 vxlan 與 host-gw 使用不同的機制建立主機之間連接配接,但對于容器則無需任何改變,bbox1 仍然可以與 bbox2 通信。
由于 vxlan 需要對資料進行額外打包和拆包,性能會稍遜于 host-gw。
至此 flannel 已經讨論完了,下一節我們開始學習另一個網絡方案:Weave。
本文轉自CloudMan6 51CTO部落格,原文連結:http://blog.51cto.com/cloudman/1961580