容器網路(八)安裝配置 flannel【54】
(十二)安裝配置 flannel
上一節我們部署了 etcd,本節安裝和配置 flannel。
(1)build 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
apt-getp install make -y
make dist/flanneld-amd64
④將 flanneld 執行檔案拷貝到 host1 和 host2。
scp dist/flanneld-amd64 10.0.0.21:/usr/local/bin/flanneld
scp dist/flanneld-amd64 10.0.0.22:/usr/local/bin/flanneld
將 flannel 網路的配置資訊儲存到 etcd。
先將配置資訊寫到檔案 flannel-config.json 中,內容為:
{
"Network": "10.2.0.0/16",
"SubnetLen": 24,
"Backend": {
"Type": "vxlan"
}
}
Network
定義該網路的 IP 池為10.2.0.0/16
。SubnetLen
指定每個主機分配到的 subnet 大小為 24 位,即10.2.X.0/24
。Backend
為vxlan
,即主機間通過 vxlan 通訊,後面我們還會討論host-gw
。
將配置存入 etcd:
etcdctl --endpoints=10.0.0.20:2379 set /docker-test/network/config < flannel-config.json
/docker-test/network/config
是此 etcd 資料項的 key,其 value 為 flannel-config.json 的內容。key 可以任意指定,這個 key 後面會作為 flanneld 的一個啟動引數。執行etcdctl get
確保設定成功。
(2)啟動 flannel
在 host1 和 host2 上執行如下命令:
flanneld -etcd-endpoints=http://10.0.0.20:2379 -iface=ens33 -etcd-prefix=/docker-test/network
root@host2:~# flanneld -etcd-endpoints=http://10.0.0.20:2379 -iface=ens33 -etcd-prefix=/docker-test/network
I1111 01:40:17.088705 4345 main.go:531] Using interface with name ens33 and address 10.0.0.22
I1111 01:40:17.088757 4345 main.go:548] Defaulting external address to interface address (10.0.0.22)
I1111 01:40:17.088814 4345 main.go:246] Created subnet manager: Etcd Local Manager with Previous Subnet: None
I1111 01:40:17.088835 4345 main.go:249] Installing signal handlers
I1111 01:40:17.093353 4345 main.go:390] Found network config - Backend type: vxlan
I1111 01:40:17.093427 4345 vxlan.go:123] VXLAN config: VNI=1 Port=0 GBP=false Learning=false DirectRouting=false
I1111 01:40:17.210075 4345 local_manager.go:234] Picking subnet in range 10.2.1.0 ... 10.2.255.0
I1111 01:40:17.221419 4345 local_manager.go:220] Allocated lease (10.2.2.0/24) to current node (10.0.0.22)
I1111 01:40:17.222192 4345 main.go:313] Changing default FORWARD chain policy to ACCEPT
I1111 01:40:17.222320 4345 main.go:321] Wrote subnet file to /run/flannel/subnet.env
I1111 01:40:17.222347 4345 main.go:325] Running backend.
I1111 01:40:17.222589 4345 vxlan_network.go:60] watching for new subnet leases
I1111 01:40:17.226075 4345 iptables.go:150] Some iptables rules are missing; deleting and recreating rules
I1111 01:40:17.226119 4345 iptables.go:174] Deleting iptables rule: -s 10.2.0.0/16 -j ACCEPT
I1111 01:40:17.227113 4345 iptables.go:174] Deleting iptables rule: -d 10.2.0.0/16 -j ACCEPT
I1111 01:40:17.228307 4345 iptables.go:162] Adding iptables rule: -s 10.2.0.0/16 -j ACCEPT
I1111 01:40:17.232472 4345 iptables.go:162] Adding iptables rule: -d 10.2.0.0/16 -j ACCEPT
I1111 01:40:17.233198 4345 main.go:433] Waiting for 23h0m0.025590569s to renew lease
-etcd-endpoints
指定 etcd url。
-iface
指定主機間資料傳輸使用的 interface。
-etcd-prefix
指定 etcd 存放 flannel 網路配置資訊的 key。
① ens33被選作與外部主機通訊的 interface。
② 識別 flannel 網路池 10.2.0.0/16。
③ 分配的 subnet 為 10.2.40.0/24。
flanneld 啟動後,host1 內部網路會發生一些變化:
1.一個新的 interfaceflannel.1
被建立,而且配置上 subnet 的第一個 IP 10.2.50.0。
ip addr show interface flannel.1
root@host1:~# ip addr show flannel.1
13: flannel.1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UNKNOWN group default
link/ether da:44:3b:16:ff:2e brd ff:ff:ff:ff:ff:ff
inet 10.2.50.0/32 brd 10.2.50.0 scope global flannel.1
valid_lft forever preferred_lft forever
inet6 fe80::d844:3bff:fe16:ff2e/64 scope link
valid_lft forever preferred_lft forever
root@host1:~#
2.host1 添加了一條路由:目的地址為 flannel 網路 10.2.0.0/16 的資料包都由 flannel.1 轉發。
root@host1:~# ip route
default via 10.0.0.254 dev ens33 proto static
10.0.0.0/24 dev ens33 proto kernel scope link src 10.0.0.21
10.2.2.0/24 via 10.2.2.0 dev flannel.1 onlink
root@host1:~#
host2 輸出類似,主要區別是 host2 的 subnet 為 10.2.17.0/24: