上一節我們部署了 etcd,本節安裝和配置 flannel。
flannel 沒有現成的執行檔案可用,必須自己 build,最可靠的方法是在 Docker 容器中 build。不過用于做 build 的 docker 鏡像托管在 gcr.io,國内可能無法直接通路,為友善大家,我把它 mirror 到了 docker hub,建構步驟如下:
下載下傳并重命名 image。
docker pull cloudman6/kube-cross:v1.6.2-2
docker tag cloudman6/kube-cross:v1.6.2-2 gcr.io/google_containers/kube-cross:v1.6.2-2
下載下傳 flannel 源碼。
git clone https://github.com/coreos/flannel.git
開始建構。
cd flannel
make dist/flanneld-amd64
将 flanneld 執行檔案拷貝到 host1 和 host2。
scp dist/flanneld-amd64 192.168.56.104:/usr/local/bin/flanneld
scp dist/flanneld-amd64 192.168.56.105:/usr/local/bin/flanneld
先将配置資訊寫到檔案 flannel-config.json 中,内容為:
{
"Network": "10.2.0.0/16",
"SubnetLen": 24,
"Backend": {
"Type": "vxlan"
}
}
<code>Network</code> 定義該網絡的 IP 池為 <code>10.2.0.0/16</code>。
<code>SubnetLen</code> 指定每個主機配置設定到的 subnet 大小為 24 位,即<code>10.2.X.0/24</code>。
<code>Backend</code> 為 <code>vxlan</code>,即主機間通過 vxlan 通信,後面我們還會讨論<code>host-gw</code>。
将配置存入 etcd:
etcdctl --endpoints=192.168.56.101:2379 set /docker-test/network/config < flannel-config.json
<code>/docker-test/network/config</code> 是此 etcd 資料項的 key,其 value 為 flannel-config.json 的内容。key 可以任意指定,這個 key 後面會作為 flanneld 的一個啟動參數。執行 <code>etcdctl get</code> 確定設定成功。

啟動 flannel
在 host1 和 host2 上執行如下指令:
flanneld -etcd-endpoints=http://192.168.56.101:2379 -iface=enp0s8 -etcd-prefix=/docker-test/network
<code>-etcd-endpoints</code> 指定 etcd url。
<code>-iface</code> 指定主機間資料傳輸使用的 interface。
<code>-etcd-prefix</code> 指定 etcd 存放 flannel 網絡配置資訊的 key。
host1 上輸出如下:
① enp0s8 被選作與外部主機通信的 interface。
② 識别 flannel 網絡池 10.2.0.0/16。
③ 配置設定的 subnet 為 10.2.40.0/24。
flanneld 啟動後,host1 内部網絡會發生一些變化:
一個新的 interface <code>flannel.1</code> 被建立,而且配置上 subnet 的第一個 IP 10.2.40.0。
host1 添加了一條路由:目的位址為 flannel 網絡 10.2.0.0/16 的資料包都由 flannel.1 轉發。
host2 輸出類似,主要差別是 host2 的 subnet 為 10.2.17.0/24:
目前環境網絡拓撲如圖所示:
flannel 已經就緒,下一節示範如何在 Docker 中使用 flannel 網絡。