Kubernetes網(wǎng)絡(luò)技術(shù)解析之Pod基于路由模式的通信實(shí)現(xiàn)
前言
Kubernetes集群內(nèi),Pod之間可以通信,是Kubernetes網(wǎng)絡(luò)實(shí)現(xiàn)的重要場(chǎng)景之一。
Kubernetes通過CNI提供統(tǒng)一的接口和協(xié)議,使得我們?cè)谑褂弥锌梢愿鶕?jù)需求自行選擇不同的網(wǎng)絡(luò)組件以及模式。比較常見的選型,如Flannel的VXLAN或者HostGW、Calico的IPIP或者BGP等等。
這些不同的網(wǎng)絡(luò)組件究竟是怎么實(shí)現(xiàn)Pod的通信的,底層的技術(shù)原理是什么,本篇文章就帶大家以Calico的BGP模式的通信模型(基于路由的純?nèi)龑幽P停槔馕銎涞讓拥膶?shí)現(xiàn)原理。
既然提到了容器網(wǎng)絡(luò),就肯定繞不開Network Namespace。Network Namespace是實(shí)現(xiàn)虛擬網(wǎng)絡(luò)的核心技術(shù)(這里就不展開細(xì)說了,有興趣的同學(xué)可以自行了解一下Linux Namespaces),已被廣泛的運(yùn)用在了容器相關(guān)的網(wǎng)絡(luò)場(chǎng)景中。一個(gè)docker創(chuàng)建的容器會(huì)有一個(gè)獨(dú)立的Network Namespace,一個(gè)Kubernetes的Pod里的N個(gè)容器也會(huì)共用一個(gè)獨(dú)立的Network Namespace。
那么Network Namespace之間是怎么實(shí)現(xiàn)通信的?
今天就來自己動(dòng)手實(shí)現(xiàn)基于路由模式,多個(gè)可以跨主機(jī)通信的Network Namespace(網(wǎng)絡(luò)命名空間)。
動(dòng)手創(chuàng)建一個(gè)Network Namespace
1、準(zhǔn)備一臺(tái)Linux主機(jī)(node03--100.100.198.250),檢查 ip
命令是否有效(如果沒有需要安裝iproute2)
2、執(zhí)行以下命令創(chuàng)建一個(gè)新的net-ns demo01
- ip netns add demo01 #創(chuàng)建demo01
- ip netns list #查看結(jié)果,返回中包含`demo01(id:xxx)`,說明創(chuàng)建成功
3、查看demo01下的網(wǎng)卡資源并開啟lo網(wǎng)卡
- ip netns exec demo01 ip addr #ip netns exec demo01 <需要執(zhí)行的命令>可以實(shí)現(xiàn)對(duì)demo01的相關(guān)操作,也可以通過`ip netns exec demo01 /bin/bash`進(jìn)入到demo01的虛擬網(wǎng)絡(luò)環(huán)境中之后,再直接通過執(zhí)行命令的方式操作。操作完成需要退出至主機(jī)網(wǎng)絡(luò)空間,需執(zhí)行exit
- ip netns exec demo01 ip link set lo up #開啟lo網(wǎng)卡,lo網(wǎng)卡自動(dòng)綁定127.0.0.1
- #通過第一條命令可以看到該namespace下只有一塊lo網(wǎng)卡,且該網(wǎng)卡是關(guān)閉狀態(tài)(可以在host主機(jī)網(wǎng)絡(luò)空間直接執(zhí)行`ip addr`觀察兩者區(qū)別)
demo01-lo網(wǎng)卡已啟動(dòng)
至此,一個(gè)新的Network Namespace demo01已經(jīng)創(chuàng)建完成。
目前demo01只具有本地lo網(wǎng)卡,那該如何實(shí)現(xiàn)與Host主機(jī)網(wǎng)絡(luò)空間通信呢?
為demo01配置網(wǎng)卡對(duì)和路由
實(shí)現(xiàn)demo01與Host主機(jī)網(wǎng)絡(luò)空間通信,也可以理解成兩個(gè)獨(dú)立的Network Namespace之間通訊。所以我們要?jiǎng)?chuàng)建一個(gè)網(wǎng)卡對(duì),且把兩端分別放在host主機(jī)網(wǎng)絡(luò)空間和demo01中,并啟動(dòng)網(wǎng)卡。
- ip link add vethhost01 type veth peer name vethdemo01 #創(chuàng)建虛擬網(wǎng)卡對(duì) ip link add <網(wǎng)卡名稱> type veth peer name <配對(duì)的網(wǎng)卡名稱>
- ip addr #查看網(wǎng)卡信息,可以看到host主機(jī)網(wǎng)絡(luò)空間下多了兩張新建的網(wǎng)卡
可以看到host主機(jī)網(wǎng)絡(luò)空間下創(chuàng)建的新網(wǎng)卡對(duì)
將網(wǎng)卡對(duì)的一端分配至demo01中,并將其開啟:
- ip link set vethdemo01 netns demo01 #將虛擬網(wǎng)卡vethdemo01分配到demo01中 ip link set <網(wǎng)卡名稱> netns <net-ns名稱>
- ip link set vethhost01 up #開啟host主機(jī)網(wǎng)絡(luò)空間端的網(wǎng)卡
- ip netns exec demo01 ip link set vethdemo01 up #開啟demo01端的網(wǎng)卡,至此兩張網(wǎng)卡已全部開啟,并且分別在兩個(gè)網(wǎng)絡(luò)命名空間下
要實(shí)現(xiàn)通訊,還需要給demo01的網(wǎng)卡一個(gè)IP地址(host主機(jī)網(wǎng)絡(luò)空間下的網(wǎng)卡vethhost01這里不需要設(shè)置IP):
- ip netns exec demo01 ip addr add 10.0.1.2/24 dev vethdemo01 #將vethdemo01的IP設(shè)置為10.0.1.2(地址可以隨便設(shè)置,只要不與主機(jī)網(wǎng)絡(luò)同一網(wǎng)段即可) 添加IP的命令格式-- `ip addr add <IP地址/子網(wǎng)掩碼> dev <網(wǎng)卡>`
demo01-vethdemo01網(wǎng)卡IP已配置完成
設(shè)置好IP是不是就能實(shí)現(xiàn)通訊呢?比如ping通?
驗(yàn)證
- 在Host主機(jī)網(wǎng)絡(luò)空間執(zhí)行
ping 10.0.1.2
,結(jié)果:并無響應(yīng),數(shù)據(jù)包全部丟失,通過mtr發(fā)現(xiàn)數(shù)據(jù)流向了主機(jī)的默認(rèn)網(wǎng)關(guān) - 在demo01反向請(qǐng)求
ping 100.100.198.250
,結(jié)果:connect: Network is unreachable
為什么不通?
- 10.0.1.2
- 10.0.1.0/24
結(jié)論:缺少路由。
添加雙向路由
要實(shí)現(xiàn)能ping通,一定是雙向可達(dá)的,所以來去兩個(gè)方向都需要有路由指向才能通信。
1、在Host主機(jī)網(wǎng)絡(luò)空間添加通往 10.0.1.2
的路由指向,將固定IP 10.0.1.2
指向同一網(wǎng)絡(luò)空間下的網(wǎng)卡vethhost01(它的對(duì)端就是demo01的網(wǎng)卡)
2、在demo01添加通往 100.100.198.250
的指向,只需要添加默認(rèn)路由網(wǎng)關(guān)指向自己的網(wǎng)卡vethdemo01(它的對(duì)端網(wǎng)卡vethhost01就在 100.100.198.252
的網(wǎng)絡(luò)空間下)
- route add -host 10.0.1.2 dev vethhost01 #host主機(jī)網(wǎng)絡(luò)空間添加-->demo01方向的路由 路由命令`route <動(dòng)作-常用的add或者del> <目標(biāo)地址類型-常用net或者h(yuǎn)ost> <目標(biāo)地址,如果是網(wǎng)段必須要加/子網(wǎng)掩碼> <下一跳的類型,網(wǎng)卡設(shè)備-dev、ip地址-gw> <下一條網(wǎng)卡名稱或者ip地址>` 這條路由的規(guī)則解讀是:當(dāng)主機(jī)收到目的地址是10.0.1.2的數(shù)據(jù)包,將其轉(zhuǎn)發(fā)到本機(jī)的vethost1網(wǎng)卡上
- ip netns exec demo01 route add default dev vethdemo01 #demo01添加默認(rèn)的路由,這條路由是為了下一條路由能生效
- ip netns exec demo01 route add -net 0.0.0.0 gw 100.100.198.250 #為了演示方便,這條路由是為了將Host主機(jī)網(wǎng)絡(luò)空間模擬成路由器的角色。將默認(rèn)的下一跳指向100.100.198.250,讓其轉(zhuǎn)發(fā)請(qǐng)求。 這條路由的規(guī)則解讀是:當(dāng)主機(jī)收到的數(shù)據(jù)包的目的地址在其他路由規(guī)則中匹配不到時(shí),將默認(rèn)都轉(zhuǎn)發(fā)到100.100.198.250
再次驗(yàn)證,雙向已經(jīng)實(shí)現(xiàn)互通。
雙向互ping成功
到這里,一個(gè)可以能與Host主機(jī)網(wǎng)絡(luò)空間實(shí)現(xiàn)通信的Network Namespace就已經(jīng)創(chuàng)建完成了。
創(chuàng)建demo02,實(shí)現(xiàn)demo01與其互通
參照demo01的步驟我們可以再創(chuàng)建一個(gè)Network Namespace。
- 命名為demo02
- IP地址設(shè)置為
10.0.2.2
- 添加雙向路由,實(shí)現(xiàn)
100.100.198.252
與10.0.2.2
互通
目前的網(wǎng)絡(luò)模型
以上都實(shí)現(xiàn)之后,驗(yàn)證網(wǎng)絡(luò)聯(lián)通情況:
- 在Host主機(jī)網(wǎng)絡(luò)空間與demo01/02雙向互ping
- 預(yù)期結(jié)果都為通,說明demo02也順利創(chuàng)建完成
驗(yàn)證demo01<---->demo02是否互通:
- 結(jié)果:并無響應(yīng),數(shù)據(jù)包全部丟失,通過mtr發(fā)現(xiàn)數(shù)據(jù)流向了主機(jī)的默認(rèn)網(wǎng)關(guān)
100.100.198.250
之后數(shù)據(jù)包就不知去向 - 現(xiàn)象與之前主機(jī)未添加到demo01的路由時(shí)很相似,但是目前Host主機(jī)網(wǎng)絡(luò)空間存在通往
10.0.1.2
、10.0.2.2
的路由,數(shù)據(jù)包是可以從100.100.198.250
通往demo01/02的
- 唯一的不同是這次的數(shù)據(jù)包原地址是
10.0.1.2
和10.0.2.2
,數(shù)據(jù)包經(jīng)過100.100.198.250
網(wǎng)卡進(jìn)行轉(zhuǎn)發(fā)
- 唯一的不同是這次的數(shù)據(jù)包原地址是
demo01/02的雙向互ping
demo01的mtr結(jié)果
demo02的mtr結(jié)果
數(shù)據(jù)包去哪了?
已經(jīng)有了路由,為什么數(shù)據(jù)包沒有被Host主機(jī)網(wǎng)絡(luò)空間轉(zhuǎn)發(fā)?
要弄清楚報(bào)文是如何通過內(nèi)核處理并最終抵達(dá)協(xié)議棧的,首先需要了解iptables對(duì)報(bào)文的處理流程。
什么是 4表5鏈
?
報(bào)文被內(nèi)核基于iptables相關(guān)規(guī)則處理的邏輯走向
鏈
- 每一條鏈用通俗的話講就是一個(gè)
關(guān)卡
(報(bào)文邏輯走向圖中的標(biāo)紅部分,分別是PREROUTING、INPUT、OUTPUT、FORWARD、POSTROUTING) - 每一個(gè)
關(guān)卡
里都可以配置相應(yīng)的規(guī)則
- 一個(gè)
關(guān)卡
上可能不止有一條規(guī)則,可能有很多條規(guī)則,把這些規(guī)則串成一個(gè)集合的時(shí)候,就形成了鏈
- 每個(gè)經(jīng)過這個(gè)
關(guān)卡
的報(bào)文,都要將這條鏈上的所有規(guī)則匹配一遍,如果有符合條件的規(guī)則,則執(zhí)行規(guī)則對(duì)應(yīng)的動(dòng)作(可能被丟棄,可能被處理之后流向下游,也可能直接流向下游)
- 一個(gè)
表
- 相同功能的規(guī)則的集合叫做
表
,不同功能的規(guī)則,我們可以放置在不同的表中進(jìn)行管理 - 鏈中的這些規(guī)則基于功能的不同大概分為四類(過濾、網(wǎng)絡(luò)地址轉(zhuǎn)換、拆解報(bào)文\修改\重新封裝、關(guān)閉連接追蹤)
- filter表:負(fù)責(zé)過濾功能,防火墻。內(nèi)核模塊:
iptables_filter
,可以實(shí)現(xiàn)對(duì)報(bào)文的過濾,限制某些報(bào)文無法通行(相關(guān)使用場(chǎng)景:防火墻的黑名單功能,禁止某些IP不能訪問,或者限制主機(jī)對(duì)外通信) - nat表:network address translation,網(wǎng)絡(luò)地址轉(zhuǎn)換功能。內(nèi)核模塊:
iptable_nat
,可以實(shí)現(xiàn)對(duì)外發(fā)報(bào)文中的源、目的地址的轉(zhuǎn)換(相關(guān)使用場(chǎng)景:Docker的覆蓋網(wǎng)絡(luò),Docker啟動(dòng)的容器對(duì)外通信的源地址都不是容器的IP) - mangle表:拆解報(bào)文,做出修改,并重新封裝 的功能。內(nèi)核模塊:
iptable_mangle
,可以實(shí)現(xiàn)修改數(shù)據(jù)包的一些標(biāo)志位,以便其他規(guī)則或程序可以利用這種標(biāo)志對(duì)數(shù)據(jù)包進(jìn)行過濾或策略路由(相關(guān)使用場(chǎng)景:Kubernetes-calico對(duì)集群容器網(wǎng)絡(luò)的policy實(shí)現(xiàn)) - raw表:關(guān)閉nat表上啟用的連接追蹤機(jī)制。內(nèi)核模塊:
iptable_raw
,可以實(shí)現(xiàn)對(duì)報(bào)文處理跳過NAT表和ip_conntrack
處理,即不再做地址轉(zhuǎn)換和數(shù)據(jù)包的鏈接跟蹤處理了(相關(guān)使用場(chǎng)景:RAW表可以應(yīng)用在那些不需要做nat的情況下,以提高性能。如大量訪問的web服務(wù)器,可以讓80端口不再讓iptables做數(shù)據(jù)包的鏈接跟蹤處理,以提高用戶的訪問速度)
- filter表:負(fù)責(zé)過濾功能,防火墻。內(nèi)核模塊:
表和鏈的關(guān)系
- 5個(gè)鏈的職責(zé)不同,所以某些鏈中注定不會(huì)包含某類規(guī)則
- 在實(shí)際的使用過程中,是通過表作為操作入口,對(duì)規(guī)則進(jìn)行定義。在表中添加的規(guī)則時(shí)需要指定其所在的鏈
每個(gè)鏈中包含的規(guī)則類型
梳理報(bào)文走向
以Host主機(jī)網(wǎng)絡(luò)空間為分析對(duì)象,分析Host主機(jī)網(wǎng)絡(luò)空間主動(dòng)發(fā)起ping的過程
Host主機(jī)網(wǎng)路空間---->demo01(發(fā)送數(shù)據(jù)):
1、當(dāng)從 100.100.198.250
主動(dòng)發(fā)起ping時(shí),報(bào)文的起始位置在圖中的最上層的協(xié)議棧
2、經(jīng)過路由表判斷--用目的地址匹配到路由(如果匹配不到路由,不知道下一條去哪里,那么直接丟棄),標(biāo)記數(shù)據(jù)的下一跳--vethhost01
3、經(jīng)過OUTPUT鏈檢查(4種類型的規(guī)則policy默認(rèn)均為ACCEPT--不阻攔),由于也沒有其他規(guī)則,直接流轉(zhuǎn)到下游
- iptables -t raw --line-numbers -nvL OUTPUT #查看iptables指定表的指定鏈的相關(guān)規(guī)則命名 `riptables -t <表名> --line-numbers -nvL <鏈名稱>` 該命令的解讀:打印OUTPUT鏈中的所有raw類型的規(guī)則,并能從policy的值獲取該類規(guī)則集合的默認(rèn)通行策略
- iptables -t mangle --line-numbers -nvL OUTPUT
- iptables -t nat --line-numbers -nvL OUTPUT
- iptables -t filter --line-numbers -nvL OUTPUT #該鏈功能最強(qiáng)大,四種類型的功能都有
OUTPUT鏈的規(guī)則
4、經(jīng)過POSTROUTING鏈檢查(mangle和nat類型的規(guī)則policy默認(rèn)為ACCEPT--不阻攔),由于也沒有其他規(guī)則,最終將報(bào)文發(fā)送給100.100.198.252的網(wǎng)卡enp2s0
- iptables -t mangle --line-numbers -nvL POSTROUTING #命令使用方式同上,POSTROUTING是網(wǎng)絡(luò)命名空間的`出口關(guān)卡`
- iptables -t nat --line-numbers -nvL POSTROUTING
POSTROUTING鏈的規(guī)則
5、網(wǎng)卡enp2s0將報(bào)文發(fā)送至路由標(biāo)記的vethhost01,vethhost01會(huì)默認(rèn)將報(bào)文流轉(zhuǎn)到自己的網(wǎng)卡對(duì)對(duì)端--vethdemo01,抵達(dá)demo01的內(nèi)核
Host主機(jī)網(wǎng)路空間<----demo01(接收數(shù)據(jù)):
1、當(dāng)從demo01收到報(bào)文并返回應(yīng)答報(bào)文時(shí),應(yīng)答報(bào)文抵達(dá) 100.100.198.252
的網(wǎng)卡enp2s0(報(bào)文抵達(dá)網(wǎng)卡enp2s0前的過程,就是上述 發(fā)送數(shù)據(jù)
的過程,報(bào)文的起始位置就是demo01的協(xié)議棧)
2、內(nèi)核接受到網(wǎng)卡的報(bào)文,先經(jīng)過PREROUTING鏈檢查(policy默認(rèn)為ACCEPT--不阻攔),由于也沒有其他規(guī)則,直接流轉(zhuǎn)到下游
- iptables -t raw --line-numbers -nvL PREROUTING #命令使用方式同上,PREROUTING是網(wǎng)絡(luò)命名空間的`入口關(guān)卡`
- iptables -t mangle --line-numbers -nvL PREROUTING
- iptables -t nat --line-numbers -nvL PREROUTING
PREROUTING鏈的規(guī)則
3、判斷報(bào)文目的地址是否是本機(jī)(目標(biāo)地址是本機(jī))
4、經(jīng)過INPUT鏈檢查(policy默認(rèn)為ACCEPT--不阻攔),由于也沒有其他規(guī)則,最終抵達(dá)協(xié)議棧,ping的發(fā)起端接收到返回報(bào)文,完成一次完整ICMP通訊
- iptables -t mangle --line-numbers -nvL INPUT #命令使用方式同上,經(jīng)過INPUT鏈的報(bào)文就能進(jìn)協(xié)議棧了
- iptables -t nat --line-numbers -nvL INPUT
- iptables -t filter --line-numbers -nvL INPUT
INPUT鏈的規(guī)則
以Host主機(jī)網(wǎng)絡(luò)空間作為 路由器
轉(zhuǎn)發(fā)ping包為例
demo01---->host主機(jī)網(wǎng)路空間---->demo02(轉(zhuǎn)發(fā)數(shù)據(jù)):
1、起始報(bào)文從demo01發(fā)出抵達(dá) 100.100.198.252
的網(wǎng)卡enp2s0
2、內(nèi)核接受到網(wǎng)卡的報(bào)文,先經(jīng)過PREROUTING鏈檢查(同上)
3、判斷報(bào)文目的地址是否是本機(jī)(目標(biāo)地址不是本機(jī)),經(jīng)過路由表判斷--用目的地址匹配到路由(如果匹配不到路由,不知道下一條去哪里,那么直接丟棄),標(biāo)記數(shù)據(jù)的下一跳-- 10.1.2.2
4、經(jīng)過FORWARD鏈檢查,(filter類型的規(guī)則policy默認(rèn)為DROP--阻攔),只有當(dāng)匹配到可以通行的規(guī)則,報(bào)文才能流轉(zhuǎn)到下游
- iptables -t mangle --line-numbers -nvL FORWARD #mangle類型的規(guī)則默認(rèn)policy規(guī)則ACCEPT
- iptables -t filter --line-numbers -nvL FORWARD #filter類型的規(guī)則policy默認(rèn)為DROP
- # 可以看到該類規(guī)則已經(jīng)DROP了很多個(gè)packets,如果一直測(cè)試ping,能看到被DROP的包會(huì)一直增長(zhǎng)
FORWARD鏈的filter類型規(guī)則
5、經(jīng)過POSTROUTING鏈檢查(同上),最終將報(bào)文發(fā)送給 100.100.198.252
的網(wǎng)卡enp2s0
6、網(wǎng)卡enp2s0將報(bào)文發(fā)送至路由標(biāo)記的vethhost02,vethhost02會(huì)默認(rèn)將報(bào)文流轉(zhuǎn)到自己的網(wǎng)卡對(duì)對(duì)端--vethdemo02,抵達(dá)demo02的內(nèi)核
7、demo02內(nèi)核按照上述中的 接收數(shù)據(jù)
流程處理報(bào)文,并將ICMP的應(yīng)答報(bào)文按照 發(fā)送數(shù)據(jù)
的流程,以demo01的IP地址 10.0.1.2
為目的地址反向發(fā)送數(shù)據(jù)
8、Host主機(jī)網(wǎng)路空間同樣按上述 轉(zhuǎn)發(fā)數(shù)據(jù)
的過程再轉(zhuǎn)發(fā)一次,只是這次轉(zhuǎn)發(fā)的是demo02發(fā)出的應(yīng)答報(bào)文(Host主機(jī)網(wǎng)路空間,完成了兩個(gè)方向的報(bào)文轉(zhuǎn)發(fā),去包方向和回包方向)
9、最終demo01的協(xié)議棧接收到應(yīng)答報(bào)文,完成一次通過 100.100.198.252
轉(zhuǎn)發(fā)的ICMP通訊
內(nèi)核處理的報(bào)文的三個(gè)鏈路
- 發(fā)送數(shù)據(jù),內(nèi)核處理協(xié)議棧的發(fā)送數(shù)據(jù)的鏈路:路由判斷(匹配下一跳)-->OUTPUT-->POSTROUTING-->網(wǎng)卡-->下一跳
- 接受數(shù)據(jù),內(nèi)核處理網(wǎng)卡接受的外部數(shù)據(jù)鏈路:PREROUTING-->路由判斷(是本機(jī))-->INPUT-->協(xié)議棧
- 轉(zhuǎn)發(fā)數(shù)據(jù),內(nèi)核處理網(wǎng)卡接受的外部數(shù)據(jù)鏈路:PREROUTING-->路由判斷(不是本機(jī),匹配下一跳)-->FORWARD-->POSTROUTING-->網(wǎng)卡-->下一跳
通過上述的信息我們可以梳理出,目前demo01/02無法實(shí)現(xiàn)互ping的原因,是被作為 路由器
角色的host主機(jī)網(wǎng)絡(luò)空間內(nèi)核將相關(guān)的報(bào)文攔截并丟棄了。
攔截的 關(guān)卡
位于FORWARD鏈,F(xiàn)ORWARD鏈中的 過濾
規(guī)則默認(rèn)是不允許通過。
- 需要為來自demo01/02雙方都
頒發(fā)"通行證"
- 互通是雙向的,需要為demo01/02分別配置
來
和去
兩條規(guī)則,一共四條規(guī)則
- iptables -t filter -A FORWARD -o vethhost01 -j ACCEPT #添加命令 `iptables -t <表> -A <鏈> -o <網(wǎng)卡> -j ACCEPT` 命令解讀:在FORWARD鏈添加一條類型為filter的規(guī)則,規(guī)則內(nèi)容是--目的地址在路由表上的下一跳是vethhost01的報(bào)文,都放行
- iptables -t filter -A FORWARD -i vethhost01 -j ACCEPT #添加命令 `iptables -t <表> -A <鏈> -i <網(wǎng)卡> -j ACCEPT` 命令解讀:在FORWARD鏈添加一條類型為filter的規(guī)則,規(guī)則內(nèi)容是--只要是從vethhost01傳來的報(bào)文,都放行
- iptables -t filter -A FORWARD -i vethhost02 -j ACCEPT #同上
- iptables -t filter -A FORWARD -o vethhost02 -j ACCEPT
FORWARD鏈的filter類型規(guī)則已添加
驗(yàn)證:
demo01/02雙向已互通
跨主機(jī)通信(實(shí)現(xiàn)demo01/02與其他主機(jī)互通)
準(zhǔn)備一臺(tái)Linux主機(jī)(node02--100.100.198.253)。
- node02并不知道要訪問10.0.1.2/10.0.2.2在node03上,需要在node02上添加相關(guān)路由,將目的地址的下一跳指向node03(100.100.198.250)
- node02和node03本就互通(且在同一網(wǎng)段),所以node03上不用添加任何路由和iptables相關(guān)配置
node02的路由
驗(yàn)證:
node02-->demo01/02
demo01/02-->node02
在node02上抓包,顯示的源地址就是10.0.1.2
目前的網(wǎng)絡(luò)模型
至此,可以跨主機(jī)通信的Network Namespace就已經(jīng)創(chuàng)建并配置完成了。
Node02上的N3和N4的創(chuàng)建以及配置過程就不做演示了,操作步驟參考以上即可。
結(jié)語
Network Namespace通訊模型不止一種,每種模型也有各自的優(yōu)缺點(diǎn)。此次實(shí)現(xiàn)的Network Namespace間的通信模型,是基于路由模式實(shí)現(xiàn)的( 純?nèi)龑?/code> 的實(shí)現(xiàn))。
該種通訊模型的相關(guān)網(wǎng)絡(luò)方案性能更接近于主機(jī)網(wǎng)絡(luò),Kubernetes網(wǎng)絡(luò)組件Calico的BGP模式的實(shí)現(xiàn)就是基于此種模型,性能較IPIP模式(Overlay類型的網(wǎng)絡(luò))有很大提升。
此類的方案明顯的特征是終端收到的包并未被nat處理過,比如從node02的抓包顯示,報(bào)文的源地址就是發(fā)起端demo01的IP: 10.0.1.2
。在一些需求場(chǎng)景下,請(qǐng)求的接收端是必須要獲取到源IP的。這種場(chǎng)景下,Overlay類型的網(wǎng)絡(luò)方案就無法滿足。
希望這篇文章能幫助到大家了解Kubernetes網(wǎng)絡(luò)底層的一些技術(shù)實(shí)現(xiàn)。