OpenvSwitch实现kubernetes依赖的底层网络
kubernetes網(wǎng)絡(luò)模型設(shè)計(jì)的一個(gè)基礎(chǔ)原則是:每個(gè)Pod都擁有一個(gè)獨(dú)立的IP地址,而且假定所有Pod都在一個(gè)可以直接連通的、扁平的網(wǎng)絡(luò)空間中(在GCE里面是現(xiàn)成的網(wǎng)絡(luò)模型)。在kubernetes中,IP是以Pod為單位進(jìn)行分配的。一個(gè)Pod內(nèi)部的所有容器共享一個(gè)網(wǎng)絡(luò)堆棧(實(shí)際上就是一個(gè)網(wǎng)絡(luò)命名空間,包括它們的IP地址、網(wǎng)絡(luò)設(shè)備、配置等都是共享的)。按照這個(gè)網(wǎng)絡(luò)原則抽象出來的一個(gè)Pod一個(gè)IP的設(shè)計(jì)模型也被稱作IP-per-Pod模型。在我們搭建k8s集群的過程中,需要自己實(shí)現(xiàn)這個(gè)網(wǎng)絡(luò)假設(shè),將不同節(jié)點(diǎn)上的Docker容器之間的互相訪問先打通,然后運(yùn)行k8s。目前有許多開源組件支持容器網(wǎng)絡(luò)模型,比如說Flannel、OpenvSwitch和Calico等。在本文中,我們利用OVS作為實(shí)現(xiàn)底層網(wǎng)絡(luò)(如下圖所示),僅實(shí)現(xiàn)了不同節(jié)點(diǎn)之間的docker0網(wǎng)橋之間的互通,沒有搭建基于OVS的完整kubernetes集群。
?
OpenvSwitch是一個(gè)開源的虛擬交換機(jī)軟件,OVS的網(wǎng)橋可以直接建立多種通信通道(隧道)如VxLAN,GRE,在k8s、Docker場景下,我們主要是建立L3到L3的隧道。在這里,我們采取VxLAN隧道的方式實(shí)現(xiàn)。
實(shí)驗(yàn)拓?fù)淙鐖D所示,在VMware上運(yùn)行3臺(tái)ubuntu16.04虛擬機(jī)。
當(dāng)容器內(nèi)的應(yīng)用訪問另一個(gè)容器的地址時(shí),數(shù)據(jù)包會(huì)通過容器內(nèi)的默認(rèn)路由發(fā)送給docker0網(wǎng)橋。OVS的網(wǎng)橋是作為docker0網(wǎng)橋的端口存在的,它會(huì)將數(shù)據(jù)發(fā)送給OVS網(wǎng)橋。OVS網(wǎng)絡(luò)已經(jīng)通過配置建立了和其他OVS網(wǎng)橋的GRE/VxLAN隧道,自然能將數(shù)據(jù)送達(dá)對端的Node,并送往docker0及Pod。接下來進(jìn)行實(shí)際操作。
1.安裝Docker
sudo apt-get install docker.io2.安裝OpenvSwitch
sudo apt-get install openvswitch-switch3.為docker0網(wǎng)橋重新分配IP
為了避免Docker創(chuàng)建的docker0地址產(chǎn)生沖突(因?yàn)镈ocker Daemon啟動(dòng)且給docker0選擇子網(wǎng)時(shí)只有幾個(gè)備選列表,很容易產(chǎn)生沖突,我這里裝完docker,docker0網(wǎng)橋的地址都是172.17.0.1/16),所以我們要給docker0網(wǎng)橋重新分配IP地址,網(wǎng)上有很多種解決方案,眾說紛紜,我這里按照下面的步驟進(jìn)行。首先,停止docker服務(wù),然后將docker0網(wǎng)橋刪除,手動(dòng)建立一個(gè)Linux網(wǎng)橋,然后手動(dòng)給這個(gè)網(wǎng)橋配置IP地址范圍。
sudo service docker stop sudo ip link set dev docker0 down sudo brctl delbr docker0 sudo brctl addbr docker0 sudo ip addr add 172.17.30.1/24 dev docker0 sudo ip link set dev docker0 up查看IP地址信息:
我這里配置是,master節(jié)點(diǎn)的docker0 IP地址為172.17.20.1,node1節(jié)點(diǎn)docker0 IP地址為172.17.10.1,node2節(jié)點(diǎn)docker0 IP地址為172.17.30.1。
4 .創(chuàng)建網(wǎng)橋和Vxlan隧道
建立OpenvSwitch的網(wǎng)橋br0,然后通過ovs-vsctl命令給ovs網(wǎng)橋增加VxLAN端口,添加端口時(shí)要將目標(biāo)連接的NodeIP地址設(shè)置為對端的IP地址。(對于大型集群網(wǎng)絡(luò),需要做自動(dòng)化腳本來完成)
(1) 創(chuàng)建ovs網(wǎng)橋br0
分別在master,node1,node2節(jié)點(diǎn)上執(zhí)行如下命令:
sudo ovs-vsctl add-br br0(2) 創(chuàng)建Vxlan隧道連接到對端
首先建立master節(jié)點(diǎn)到node2節(jié)點(diǎn)之間的隧道:
在master節(jié)點(diǎn)執(zhí)行:
sudo ovs-vsctl add-port br0 vxlan1 -- set interface vxlan1 type=vxlan option:remote_ip=10.0.0.76其中10.0.0.76是node2的ens33網(wǎng)卡地址。
在node2上執(zhí)行:
sudo ovs-vsctl add-port br0 vxlan1 -- set interface vxlan1 type=vxlan option:remote_ip=10.0.0.70其中10.0.0.70是master的ens33網(wǎng)卡地址。
執(zhí)行ovs-vsctl show可看到如下結(jié)果:
同理,建立master到node1之間的隧道,
在master上執(zhí)行:
sudo ovs-vsctl add-port br0 vxlan2 -- set interface vxlan2 type=vxlan option:remote_ip=10.0.0.71其中10.0.0.71是node1的地址,這里注意使用另外一個(gè)端口vxlan2來作為隧道的端口。
在node1上執(zhí)行:
sudo ovs-vsctl add-port br0 vxlan2 -- set interface vxlan2 type=vxlan option:remote_ip=10.0.0.70其中,10.0.0.70是master的IP地址。
執(zhí)行ovs-vsctl可以看到:
master節(jié)點(diǎn)上的br0有兩個(gè)端口用來做隧道,vxlan1和vxlan2。對于node1和node2之間則不需要再建立額外的隧道了,后面可以看到二者之間的docker0網(wǎng)橋能夠相互ping通。
5.添加br0到本地docker0
sudo brctl addif docker0 br0這個(gè)操作就相當(dāng)于把兩個(gè)交換機(jī)給連上了,使得容器流量通過OVS流經(jīng)tunnel。
6. 啟動(dòng)br0與docker0網(wǎng)橋
sudo ip link set dev br0 upsudo ip link set dev docker0 up7. 添加路由規(guī)則
由于10.0.0.70與10.0.0.71以及10.0.0.76的docker0網(wǎng)段分別為172.17.20.1/24、172.17.10.1/24和172.17.30.1/24,這幾個(gè)網(wǎng)段的路由都需經(jīng)過本機(jī)的docker0網(wǎng)橋路由,其中一個(gè)24網(wǎng)段是通過OVS的VxLAN隧道到達(dá)對端的,因此需要在每個(gè)node上添加通過docker0網(wǎng)橋轉(zhuǎn)發(fā)172.17.0.0/16段的路由規(guī)則:
sudo ip route add 172.17.0.0/16 dev docker08.清空Docker自帶的iptables規(guī)則以及Linux規(guī)則
#iptables –t nat –F; iptables –F9.各節(jié)點(diǎn)上docker0之間的互通測試
master節(jié)點(diǎn)ping node1
?
?
master ping node2
?
node1 ping master和node2
?
node2 ping master和node1 :
?
10.wireshark抓包
監(jiān)聽br0網(wǎng)橋,在br0網(wǎng)橋上并沒有VxLAN報(bào)文
在ens33上抓包,發(fā)現(xiàn)了VxLAN封裝的ping包報(bào)文通過,說明VxLAN是在承載網(wǎng)的物理網(wǎng)絡(luò)上完成的封包過程。
至此,基于OVS的網(wǎng)絡(luò)搭建成功。kubernetes還有許多優(yōu)秀的開源網(wǎng)絡(luò)組件,大家各有優(yōu)勢和缺點(diǎn),有時(shí)間做一個(gè)匯總。
?
?
參考資料:
?《kubernetes權(quán)威指南》
?
轉(zhuǎn)載于:https://www.cnblogs.com/neutronman/p/8124757.html
總結(jié)
以上是生活随笔為你收集整理的OpenvSwitch实现kubernetes依赖的底层网络的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js打开新页面的两种方式
- 下一篇: 机器学习练习题