overlay網(wǎng)絡(luò)簡(jiǎn)介
覆蓋網(wǎng)絡(luò)就是應(yīng)用層網(wǎng)絡(luò)荔睹,它是面向應(yīng)用層的,不考慮或很少考慮網(wǎng)絡(luò)層项阴,物理層的問題滑黔。
詳細(xì)說來,覆蓋網(wǎng)絡(luò)是指建立在另一個(gè)網(wǎng)絡(luò)上的網(wǎng)絡(luò)环揽。該網(wǎng)絡(luò)中的結(jié)點(diǎn)可以看作通過虛擬或邏輯鏈路而連接起來的略荡。雖然在底層有很多條物理鏈路,但是這些虛擬或邏輯鏈路都與路徑一一對(duì)應(yīng)歉胶。例如:許多P2P網(wǎng)絡(luò)就是覆蓋網(wǎng)絡(luò)汛兜,因?yàn)樗\(yùn)行在互連網(wǎng)的上層。覆蓋網(wǎng)絡(luò)允許對(duì)沒有IP地址標(biāo)識(shí)的目的主機(jī)路由信息跨扮,例如:Freenet 和DHT(分布式哈希表)可以路由信息到一個(gè)存儲(chǔ)特定文件的結(jié)點(diǎn)序无,而這個(gè)結(jié)點(diǎn)的IP地址事先并不知道。
覆蓋網(wǎng)絡(luò)被認(rèn)為是一條用來改善互連網(wǎng)路由的途徑衡创,讓二層網(wǎng)絡(luò)在三層網(wǎng)絡(luò)中傳遞帝嗡,既解決了二層的缺點(diǎn),又解決了三層的不靈活璃氢!
Flannel的工作原理
Flannel實(shí)質(zhì)上是一種“覆蓋網(wǎng)絡(luò)(overlay network)”哟玷,也就是將TCP數(shù)據(jù)包裝在另一種網(wǎng)絡(luò)包里面進(jìn)行路由轉(zhuǎn)發(fā)和通信,目前已經(jīng)支持UDP、VxLAN巢寡、AWS VPC和GCE路由等數(shù)據(jù)轉(zhuǎn)發(fā)方式喉脖。
默認(rèn)的節(jié)點(diǎn)間數(shù)據(jù)通信方式是UDP轉(zhuǎn)發(fā)。
工作原理
數(shù)據(jù)從源容器中發(fā)出后抑月,經(jīng)由所在主機(jī)的docker0虛擬網(wǎng)卡轉(zhuǎn)發(fā)到flannel0虛擬網(wǎng)卡树叽,這是個(gè)P2P的虛擬網(wǎng)卡,flanneld服務(wù)監(jiān)聽在網(wǎng)卡的另外一端谦絮。
Flannel通過Etcd服務(wù)維護(hù)了一張節(jié)點(diǎn)間的路由表题诵,詳細(xì)記錄了各節(jié)點(diǎn)子網(wǎng)網(wǎng)段 。
源主機(jī)的flanneld服務(wù)將原本的數(shù)據(jù)內(nèi)容UDP封裝后根據(jù)自己的路由表投遞給目的節(jié)點(diǎn)的flanneld服務(wù)层皱,數(shù)據(jù)到達(dá)以后被解包性锭,然后直接進(jìn)入目的節(jié)點(diǎn)的flannel0虛擬網(wǎng)卡,然后被轉(zhuǎn)發(fā)到目的主機(jī)的docker0虛擬網(wǎng)卡叫胖,最后就像本機(jī)容器通信一下的有docker0路由到達(dá)目標(biāo)容器草冈。
配置文件
/etc/sysconfig/flanneld
[root@k8s-master ~]# vi /etc/sysconfig/flanneld
Flanneld configuration options
etcd url location. Point this to the server where etcd runs
FLANNELETCDENDPOINTS="http://etcd:2379"
etcd config key. This is the configuration key that flannel queries
For address range assignment
FLANNELETCDPREFIX="/atomic.io/network"
Any additional options that you want to pass
FLANNEL_OPTIONS=""
Flannel使用Etcd進(jìn)行配置,來保證多個(gè)Flannel實(shí)例之間的配置一致性瓮增,所以需要在etcd上進(jìn)行如下配置:(‘/atomic.io/network/config’這個(gè)key與上文/etc/sysconfig/flannel中的配置項(xiàng)FLANNELETCDPREFIX是相對(duì)應(yīng)的怎棱,錯(cuò)誤的話啟動(dòng)就會(huì)出錯(cuò))
[root@k8s-master ~]# etcdctl mk /atomic.io/network/config '{ "Network": "10.0.0.0/16" }' { "Network": "10.0.0.0/16" }
UDP報(bào)文封裝
我們來看下面這個(gè)圖,這是在其中一個(gè)通信節(jié)點(diǎn)上抓取到的ping命令通信數(shù)據(jù)包钉赁√阊辏可以看到在UDP的數(shù)據(jù)內(nèi)容部分其實(shí)是另一個(gè)ICMP(也就是ping命令)的數(shù)據(jù)包携茂。
原始數(shù)據(jù)是在起始節(jié)點(diǎn)的Flannel服務(wù)上進(jìn)行UDP封裝的你踩,投遞到目的節(jié)點(diǎn)后就被另一端的Flannel服務(wù)還原成了原始的數(shù)據(jù)包,兩邊的Docker服務(wù)都感覺不到這個(gè)過程的存在讳苦。
docker IP 分配
Flannel通過Etcd分配了每個(gè)節(jié)點(diǎn)可用的IP地址段后带膜,偷偷的修改了Docker的啟動(dòng)參數(shù)。
[root@k8s-node-1 ~]# ps aux | grep bip
root 3142 0.1 2.7 560620 27364 ? Ssl 19:50 0:11 /usr/bin/dockerd-current --add-runtime docker-runc=/usr/libexec/docker/docker-runc-current --default-runtime=docker-runc --exec-opt native.cgroupdriver=systemd --userland-proxy-path=/usr/libexec/docker/docker-proxy-current --seccomp-profile=/etc/docker/seccomp.json --insecure-registry registry:5000 --storage-driver overlay2 --bip=10.0.53.1/24 --ip-masq=true --mtu=1472
這個(gè)是在運(yùn)行了Flannel服務(wù)的節(jié)點(diǎn)上查看到的Docker服務(wù)進(jìn)程運(yùn)行參數(shù)鸳谜。
注意其中的“--bip=10.0.53.1/24”這個(gè)參數(shù)膝藕,它限制了所在節(jié)點(diǎn)容器獲得的IP范圍。
這個(gè)IP范圍是由Flannel自動(dòng)分配的咐扭,由Flannel通過保存在Etcd服務(wù)中的記錄確保它們不會(huì)重復(fù)芭挽。
容器IP并不固定,IP分配還是Docker在做蝗肪,F(xiàn)lannel只是分配了子網(wǎng)段袜爪。
數(shù)據(jù)轉(zhuǎn)發(fā)
以下是 k8s集群兩個(gè)node節(jié)點(diǎn)的路由表:
[root@k8s-node-1 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 ens33
10.0.0.0 0.0.0.0 255.255.0.0 U 0 0 0 flannel0
10.0.53.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
[root@k8s-node-2 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 ens33
10.0.0.0 0.0.0.0 255.255.0.0 U 0 0 0 flannel0
10.0.80.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
例如:現(xiàn)在有一個(gè)數(shù)據(jù)包要從IP為10.0.53.2的容器發(fā)到IP為10.0.80.2的容器。根據(jù)數(shù)據(jù)發(fā)送節(jié)點(diǎn)的路由表薛闪,它只與10.0.0.0/16匹配這條記錄匹配辛馆,因此數(shù)據(jù)從docker0出來以后就被投遞到了flannel0。同理在目標(biāo)節(jié)點(diǎn)豁延,由于投遞的地址是一個(gè)容器昙篙,因此目的地址一定會(huì)落在docker0對(duì)于的10.0.80.0/24這個(gè)記錄上腊状,然后投遞到了docker0網(wǎng)卡
安裝與配置
在master苔可、node上均執(zhí)行如下命令,進(jìn)行安裝
[root@k8s-master ~]# yum install flannel
配置Flannel
master焚辅、node上均編輯/etc/sysconfig/flanneld
[root@k8s-master ~]# vi /etc/sysconfig/flanneld
Flanneld configuration options
etcd url location. Point this to the server where etcd runs
FLANNELETCDENDPOINTS="http://etcd:2379"
etcd config key. This is the configuration key that flannel queries
For address range assignment
FLANNELETCDPREFIX="/atomic.io/network"
Any additional options that you want to pass
FLANNEL_OPTIONS=""
配置etcd中關(guān)于flannel的key
Flannel使用Etcd進(jìn)行配置法焰,來保證多個(gè)Flannel實(shí)例之間的配置一致性,所以需要在etcd上進(jìn)行如下配置:(‘/atomic.io/network/config’這個(gè)key與上文/etc/sysconfig/flannel中的配置項(xiàng)FLANNELETCDPREFIX是相對(duì)應(yīng)的埃仪,錯(cuò)誤的話啟動(dòng)就會(huì)出錯(cuò))
[root@k8s-master ~]# etcdctl mk /atomic.io/network/config '{ "Network": "10.0.0.0/16" }'
{ "Network": "10.0.0.0/16" }
啟動(dòng)
啟動(dòng)Flannel之后卵蛉,需要依次重啟docker、kubernete傻丝。
在master執(zhí)行:
systemctl enable flanneld.service
systemctl start flanneld.service
service docker restart
systemctl restart kube-apiserver.service
systemctl restart kube-controller-manager.service
systemctl restart kube-scheduler.service
在node上執(zhí)行:
systemctl enable flanneld.service
systemctl start flanneld.service
service docker restart
systemctl restart kubelet.service
systemctl restart kube-proxy.service