摘要:每個(gè)都是從一個(gè)更大的池中劃分的,會(huì)在每個(gè)主機(jī)上運(yùn)行一個(gè)叫的,職責(zé)是從池中分配。為了在各個(gè)主機(jī)間共享信息,用存放網(wǎng)絡(luò)配置已分配的的等信息。同一主機(jī)的容器通過(guò)連接,跨主機(jī)流量通過(guò)轉(zhuǎn)發(fā)。
主要參考每天5分鐘玩轉(zhuǎn)docker容器技術(shù)博客。 記錄下自己的實(shí)驗(yàn)過(guò)程。 如果想學(xué)習(xí),請(qǐng)直接參考該博客http://www.cnblogs.com/CloudMan6/網(wǎng)絡(luò)概述
flannel為每個(gè)host分配一個(gè)subnet,容器從此subnet中分配ip。這些ip可以在host間路由,容器間無(wú)需nat和port mapping就可以跨主機(jī)通信。
每個(gè)subnet都是從一個(gè)更大的ip池中劃分的,flannel會(huì)在每個(gè)主機(jī)上運(yùn)行一個(gè)叫flanneld的agent,職責(zé)是從池中分配subnet。為了在各個(gè)主機(jī)間共享信息,flannel用etcd存放網(wǎng)絡(luò)配置、已分配的subnet、host的ip等信息。
數(shù)據(jù)包如何在主機(jī)間轉(zhuǎn)發(fā)是由 backend 實(shí)現(xiàn)的。flannel 提供了多種 backend,最常用的有 vxlan 和 host-gw
環(huán)境搭建 安裝配置etcd在192.168.19.120上運(yùn)行如下腳本:
ETCD_VER=v2.3.7 DOWNLOAD_URL=https://github.com/coreos/etcd/releases/download curl -L ${DOWNLOAD_URL}/${ETCD_VER}/etcd-${ETCD_VER}-linux-amd64.tar.gz -o /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz mkdir -p /tmp/test-etcd && tar xzvf /tmp/etcd-${ETCD_VER}-linux-amd64.tar.gz -C /tmp/test-etcd --strip-components=1 cp /tmp/test-etcd/etcd* /usr/local/bin/
運(yùn)行etcd
etcd -listen-client-urls http://192.168.19.120:2379 -advertise-client-urls http://192.168.19.120:2379build flannel
下載并重命名 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/fla...
開(kāi)始構(gòu)建。
cd flannel
make dist/flanneld-amd64
將flannel執(zhí)行文件拷貝到host2 和host3
scp dist/flanneld-amd64 192.168.19.121:/usr/local/bin/flanneld
scp dist/flanneld-amd64 192.168.19.122:/usr/local/bin/flanneld
配置文件如下:
{ "Network":"10.2.0.0/16", "SubnetLen":24, "Backend":{ "Type":"vxlan" } }
解釋:
Network 定義該網(wǎng)絡(luò)的ip池
SubnetLen 指定每個(gè)主機(jī)分配到的subnet大小為24位,即 10.2.x.0/24
Backend為vxlan,即主機(jī)間通過(guò)vxlan通信。
將配置存入etcd
etcdctl --endpoint=192.168.19.120:2379 set /docker-test/network/config < flannel_config.json啟動(dòng)flannel 啟動(dòng)命令
在兩臺(tái)機(jī)器上運(yùn)行如下命令:
flanneld -etcd-endpoints=http://192.168.19.120:2379 -iface=enp0s3 -etcd-prefix=/docker-test/network
-etcd-endpoints 指定 etcd url
-iface 指定主機(jī)間數(shù)據(jù)傳輸使用的interface
-etcd-prefix 指定etcd存放flannel網(wǎng)絡(luò)配置文件的key
輸出如下:
root@host3:~# flanneld -etcd-endpoints=http://192.168.19.120:2379 -iface=enp0s3 -etcd-prefix=/docker-test/network I0520 02:24:57.594377 2463 main.go:499] Using interface with name enp0s3 and address 192.168.19.122 I0520 02:24:57.594766 2463 main.go:516] Defaulting external address to interface address (192.168.19.122) I0520 02:24:57.595348 2463 main.go:240] Created subnet manager: Etcd Local Manager with Previous Subnet: None I0520 02:24:57.595643 2463 main.go:243] Installing signal handlers I0520 02:24:57.598847 2463 main.go:358] Found network config - Backend type: vxlan I0520 02:24:57.599288 2463 vxlan.go:120] VXLAN config: VNI=1 Port=0 GBP=false DirectRouting=false I0520 02:24:57.649392 2463 local_manager.go:234] Picking subnet in range 10.2.1.0 ... 10.2.255.0 I0520 02:24:57.651626 2463 local_manager.go:220] Allocated lease (10.2.99.0/24) to current node (192.168.19.122) I0520 02:24:57.653626 2463 main.go:305] Wrote subnet file to /run/flannel/subnet.env I0520 02:24:57.654905 2463 main.go:309] Running backend. I0520 02:24:57.660772 2463 vxlan_network.go:60] watching for new subnet leases I0520 02:24:57.665879 2463 main.go:401] Waiting for 23h0m0.025221044s to renew lease I0520 02:24:57.672707 2463 iptables.go:115] Some iptables rules are missing; deleting and recreating rules I0520 02:24:57.674333 2463 iptables.go:137] Deleting iptables rule: -s 10.2.0.0/16 -j ACCEPT I0520 02:24:57.678549 2463 iptables.go:137] Deleting iptables rule: -d 10.2.0.0/16 -j ACCEPT I0520 02:24:57.688935 2463 iptables.go:125] Adding iptables rule: -s 10.2.0.0/16 -j ACCEPT I0520 02:24:57.696815 2463 iptables.go:125] Adding iptables rule: -d 10.2.0.0/16 -j ACCEPT啟動(dòng)后的效果
新建了一個(gè)interface flannel.1, 且配置上subnet的第一個(gè)ip 10.2.21.0
root@host2:~# ip addr show flannel.1 8: flannel.1:mtu 1450 qdisc noqueue state UNKNOWN group default link/ether 6e:9f:1d:bf:5c:b9 brd ff:ff:ff:ff:ff:ff inet 10.2.21.0/32 scope global flannel.1 valid_lft forever preferred_lft forever inet6 fe80::6c9f:1dff:febf:5cb9/64 scope link valid_lft forever preferred_lft forever
添加了一條路由:目的地址為flannel網(wǎng)絡(luò)10.2.0.0/16的數(shù)據(jù)包都有flannel.1轉(zhuǎn)發(fā)
root@host2:~# ip r default via 192.168.19.2 dev enp0s3 onlink 10.2.99.0/24 via 10.2.99.0 dev flannel.1 onlink 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 172.18.0.0/16 dev docker_gwbridge proto kernel scope link src 172.18.0.1 linkdown 192.168.19.0/24 dev enp0s3 proto kernel scope link src 192.168.19.121 192.168.56.0/24 dev enp0s8 proto kernel scope link src 192.168.56.101配置docker連接flannel 編輯docker配置文件
*兩臺(tái)機(jī)器都做此操作
首先查看/run/flannel/subnet.env
root@host2:~# cat /run/flannel/subnet.env FLANNEL_NETWORK=10.2.0.0/16 FLANNEL_SUBNET=10.2.21.1/24 FLANNEL_MTU=1450 FLANNEL_IPMASQ=false
之后,編輯docker的配置文件vim /etc/systemd/system/docker.service.d/10-machine.conf,給ExecStart命令的參數(shù)中添加--bip和--mtu,分別對(duì)應(yīng)subnet.env的 FLANNEL_SUBNET 與FLANNEL_MTU
root@host2:~# cat /etc/systemd/system/docker.service.d/10-machine.conf [Service] ExecStart= ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --storage-driver aufs --tlsverify --tlscacert /etc/docker/ca.pem --tlscert /etc/docker/server.pem --tlskey /etc/docker/server-key.pem --label provider=generic --bip=10.2.21.1/24 --mtu=1450 Environment=重啟docker
systemctl daemon-reload systemctl restart docker.service效果
對(duì)比路由表
# docker重啟前 root@host3:~# ip r default via 192.168.19.2 dev enp0s3 onlink 10.2.21.0/24 via 10.2.21.0 dev flannel.1 onlink 172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 linkdown 172.18.0.0/16 dev docker_gwbridge proto kernel scope link src 172.18.0.1 linkdown 192.168.19.0/24 dev enp0s3 proto kernel scope link src 192.168.19.122 192.168.56.0/24 dev enp0s8 proto kernel scope link src 192.168.56.102 root@host3:~# systemctl daemon-reload root@host3:~# systemctl restart docker.service # docker重啟后 root@host3:~# ip r default via 192.168.19.2 dev enp0s3 onlink 10.2.21.0/24 via 10.2.21.0 dev flannel.1 onlink 10.2.99.0/24 dev docker0 proto kernel scope link src 10.2.99.1 linkdown 172.18.0.0/16 dev docker_gwbridge proto kernel scope link src 172.18.0.1 linkdown 192.168.19.0/24 dev enp0s3 proto kernel scope link src 192.168.19.122 192.168.56.0/24 dev enp0s8 proto kernel scope link src 192.168.56.102
flannel 沒(méi)有創(chuàng)建新的 docker 網(wǎng)絡(luò),而是直接使用默認(rèn)的 bridge 網(wǎng)絡(luò)。同一主機(jī)的容器通過(guò) docker0 連接,跨主機(jī)流量通過(guò) flannel.1 轉(zhuǎn)發(fā)。
將容器連接到flannel網(wǎng)絡(luò)root@host2:~# docker run -itd --name bbox1 busybox root@host2:~# docker exec bbox1 ip r default via 10.2.21.1 dev eth0 10.2.21.0/24 dev eth0 scope link src 10.2.21.2 root@host3:~# docker run -itd --name bbox2 busybox root@host3:~# docker exec bbox2 ip r default via 10.2.99.1 dev eth0 10.2.99.0/24 dev eth0 scope link src 10.2.99.2可以發(fā)現(xiàn)網(wǎng)絡(luò)可通
# 10.2.99.2 為bbox2的ip root@host2:~# docker exec bbox1 ping -c 1 10.2.99.2 PING 10.2.99.2 (10.2.99.2): 56 data bytes 64 bytes from 10.2.99.2: seq=0 ttl=62 time=0.604 ms使用traceroute跟蹤包
root@host2:~# docker exec bbox1 traceroute 10.2.99.2 traceroute to 10.2.99.2 (10.2.99.2), 30 hops max, 46 byte packets 1 10.2.21.1 (10.2.21.1) 0.010 ms 0.216 ms 0.020 ms 2 10.2.99.0 (10.2.99.0) 0.938 ms 2.731 ms 1.663 ms 3 10.2.99.2 (10.2.99.2) 2.016 ms 0.647 ms 0.596 ms
發(fā)給docker0
之后發(fā)給flannel.1
flannel.1 將數(shù)據(jù)包封裝成 VxLAN,通過(guò) enp0s8 發(fā)送給 host3,
host3 收到包解封裝,發(fā)現(xiàn)數(shù)據(jù)包目的地址為 10.2.99.2,根據(jù)路由表(下圖)將數(shù)據(jù)包發(fā)送給 flannel.1,并通過(guò) docker0 到達(dá) bbox2
### dns不可用
無(wú)法通過(guò)主機(jī)名ping通機(jī)器。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/27306.html
摘要:容器通過(guò)獲取一個(gè)與同網(wǎng)段的地址,并默認(rèn)連接到網(wǎng)橋,并將的地址作為網(wǎng)關(guān)實(shí)現(xiàn)容器與宿主機(jī)的網(wǎng)絡(luò)互通,另外,同一個(gè)宿主機(jī)下同樣使用模式的容器可以直接通訊。 【技術(shù)沙龍002期】數(shù)據(jù)中臺(tái):宜信敏捷數(shù)據(jù)中臺(tái)建設(shè)實(shí)踐|宜信技術(shù)沙龍 將于5月23日晚8點(diǎn)線上直播,點(diǎn)擊報(bào)名 一、關(guān)于Docker Docker 是一個(gè)開(kāi)源的應(yīng)用容器引擎,基于 Go 語(yǔ)言 并遵從Apache2.0協(xié)議開(kāi)源。 Docker...
摘要:模式容器直接使用宿主機(jī)的網(wǎng)絡(luò)配置,包括網(wǎng)卡,路由等,這種方案下,從網(wǎng)絡(luò)層面來(lái)看,容器就不是容器了,只是一個(gè)宿主機(jī)上的進(jìn)程端口而已。 注:本篇僅僅是對(duì)各個(gè)網(wǎng)絡(luò)方案的簡(jiǎn)介和思考。需要深入學(xué)習(xí)如何部署和使用的同學(xué)請(qǐng)自行度娘~ 中小docker用戶的苦惱 docker的使用者十分廣泛,不止有網(wǎng)易蜂巢,daocloud,時(shí)速云這類的已經(jīng)成熟化的公有云服務(wù),許多中小型企業(yè)內(nèi)部也在試圖將docker...
摘要:模式容器直接使用宿主機(jī)的網(wǎng)絡(luò)配置,包括網(wǎng)卡,路由等,這種方案下,從網(wǎng)絡(luò)層面來(lái)看,容器就不是容器了,只是一個(gè)宿主機(jī)上的進(jìn)程端口而已。 注:本篇僅僅是對(duì)各個(gè)網(wǎng)絡(luò)方案的簡(jiǎn)介和思考。需要深入學(xué)習(xí)如何部署和使用的同學(xué)請(qǐng)自行度娘~ 中小docker用戶的苦惱 docker的使用者十分廣泛,不止有網(wǎng)易蜂巢,daocloud,時(shí)速云這類的已經(jīng)成熟化的公有云服務(wù),許多中小型企業(yè)內(nèi)部也在試圖將docker...
摘要:從分析可以看出,如果程序如果退出后,容器之間的通信將會(huì)中斷,這里需要注意。最后通過(guò)寫本地子網(wǎng)文件,通過(guò)這個(gè)文件設(shè)定的網(wǎng)絡(luò)。細(xì)心的讀者可能發(fā)現(xiàn)這里的并不是以太網(wǎng)規(guī)定的,這是因?yàn)橥鈱拥姆獍€要占據(jù)。 Flannel是cereos開(kāi)源的CNI網(wǎng)絡(luò)插件,下圖flannel官網(wǎng)提供的一個(gè)數(shù)據(jù)包經(jīng)過(guò)封包、傳輸以及拆包的示意圖,從這個(gè)圖片中可以看出兩臺(tái)機(jī)器的docker0分別處于不同的段:10.1....
摘要:每個(gè)節(jié)點(diǎn)的網(wǎng)橋使用一個(gè)子網(wǎng),每個(gè)容器使用一個(gè)子網(wǎng)內(nèi)的,那么我們就可以組成下圖中所示網(wǎng)絡(luò)。到此,在的協(xié)調(diào)下,各個(gè)主機(jī)上的子網(wǎng)就不會(huì)再?zèng)_突了,另外,會(huì)維護(hù)容器網(wǎng)絡(luò)的路由規(guī)則,容器就可以通過(guò)訪問(wèn)容器了,也就實(shí)現(xiàn)了跨主機(jī)容器互聯(lián)。 當(dāng)您將多臺(tái)服務(wù)器節(jié)點(diǎn)組成一個(gè)Docker集群時(shí),需要對(duì)集群網(wǎng)絡(luò)進(jìn)行設(shè)置,否則默認(rèn)情況下,無(wú)法跨主機(jī)容器互聯(lián),接下來(lái)我們首先分析一下原因。 跨主機(jī)容器互聯(lián) 下圖描述了...
閱讀 2405·2019-08-30 15:56
閱讀 3237·2019-08-30 13:48
閱讀 1257·2019-08-30 10:52
閱讀 1630·2019-08-29 17:30
閱讀 545·2019-08-29 13:44
閱讀 3807·2019-08-29 12:53
閱讀 1252·2019-08-29 11:05
閱讀 2791·2019-08-26 13:24