K8S kube-proxy- iptable模式实现原理分析
? ?每臺(tái)機(jī)器上都運(yùn)行一個(gè)kube-proxy服務(wù),它監(jiān)聽(tīng)api-server 和endpoint變化情況,維護(hù)service和pod之間的一對(duì)多的關(guān)系,通過(guò)iptable或者ipvs為服務(wù)提供負(fù)載均衡的能力。通常kube-proxy作為deemonset運(yùn)行在各種節(jié)點(diǎn)中。
kube-proxy 常支持以下二種:
1)iptables:iptable模式是目前的默認(rèn)模式,可以看成是userspace模式的升級(jí)版,它將請(qǐng)求的代理轉(zhuǎn)發(fā)規(guī)則全部寫入iptable中,砍掉了kube-proxy轉(zhuǎn)發(fā)的部分。整個(gè)過(guò)程全部發(fā)生在內(nèi)核空間,提高了轉(zhuǎn)發(fā)性能。但是,iptable的規(guī)則是基于鏈表實(shí)現(xiàn)的,規(guī)則數(shù)量隨著Service數(shù)量的增加線性增加,查找時(shí)間復(fù)雜度為O(n)。當(dāng)Service數(shù)量到達(dá)一定量級(jí)時(shí),CPU消耗和延遲增加顯著
2)ipvs:ipvs模式是基于章文嵩博士開(kāi)發(fā)的LVS實(shí)現(xiàn)的,ipvs和iptables都是基于內(nèi)核的netfilter框架實(shí)現(xiàn)的,不同的是iptable主攻防火墻,ipvs主攻內(nèi)核態(tài)4層負(fù)載均衡。可以說(shuō)先天上,ipvs就比iptable更適合做Service的實(shí)現(xiàn)。
下面重點(diǎn)說(shuō)下iptables,下圖是網(wǎng)上看到的一張圖作為理解。
iptables其實(shí)不是真正的防火墻,我們可以把它理解成一個(gè)客戶端代理,用戶通過(guò)iptables這個(gè)代理,將用戶的安全設(shè)定執(zhí)行到對(duì)應(yīng)的”安全框架”中,這個(gè)”安全框架”才是真正的防火墻,這個(gè)框架的名字叫netfilter。
netfilter才是防火墻真正的安全框架(framework),netfilter位于內(nèi)核空間。
iptables其實(shí)是一個(gè)命令行工具,位于用戶空間,我們用這個(gè)工具操作真正的框架。
netfilter 包括 5個(gè)hook(prerouting,input,foeward,output,poostrouting) 函數(shù) 和 4張表(filter, net,mangle, row).
filter表:負(fù)責(zé)過(guò)濾功能,防火墻;內(nèi)核模塊:iptables_filter
nat表:network address translation,網(wǎng)絡(luò)地址轉(zhuǎn)換功能;內(nèi)核模塊:iptable_nat
mangle表:拆解報(bào)文,做出修改,并重新封裝 的功能;iptable_mangle
raw表:關(guān)閉nat表上啟用的連接追蹤機(jī)制;iptable_raw
?下圖是hook函數(shù)和各個(gè)表的對(duì)應(yīng)關(guān)系,黃色代表的鏈?zhǔn)疥P(guān)系。
上圖簡(jiǎn)單說(shuō)明下,一個(gè)請(qǐng)求首先會(huì)進(jìn)入prorouting,prorouting沒(méi)有過(guò)濾的功能,會(huì)判斷這個(gè)請(qǐng)求是流向,是外部還是內(nèi)部的,如果是外部請(qǐng)求就會(huì)直接forward出去,如果是內(nèi)部的請(qǐng)求就會(huì)走到input,然后到達(dá)應(yīng)用層處理后會(huì)經(jīng)過(guò)outoput 然后再發(fā)出去。中間會(huì)經(jīng)過(guò)一系列的過(guò)濾規(guī)則,有一條不符合就會(huì),reject或者drop掉。
通常使用來(lái)查看本機(jī)table名為TABLE_NAME的iptable規(guī)則
iptables -t TABLE_NAME -vnL?比如查看filter 表的規(guī)則信息,下圖展示了input和forward規(guī)則信息。
?
- pkts:處理過(guò)的匹配的報(bào)文數(shù)量
- bytes:累計(jì)處理的報(bào)文大小(字節(jié)數(shù))
- target:如果報(bào)文與規(guī)則匹配,指定目標(biāo)就會(huì)被執(zhí)行。
- prot:協(xié)議,例如?tdp、udp、icmp?和?all。
- opt:很少使用,這一列用于顯示 IP 選項(xiàng)。
- in:入站網(wǎng)卡。
- out:出站網(wǎng)卡。
- source:流量的源 IP 地址或子網(wǎng),后者是?anywhere。
- destination:流量的目的地 IP 地址或子網(wǎng),或者是?anywhere。
還有一列沒(méi)有表頭,顯示在最后,表示規(guī)則的選項(xiàng),作為規(guī)則的擴(kuò)展匹配條件,用來(lái)補(bǔ)充前面的幾列中的配置。prot、opt、in、out、source?和?destination?和顯示在?destination?后面的沒(méi)有表頭的一列擴(kuò)展條件共同組成匹配規(guī)則。當(dāng)流量匹配這些規(guī)則后就會(huì)執(zhí)行?target。
?分析iptables:
?
上圖展示k8s集群中nginx服務(wù),cluster -ip? 是 10.1.125.152.對(duì)主機(jī)暴露了30978端口,對(duì)應(yīng)了二個(gè)后端pod分別是10.244.0.10,10.244.0.9。
?1.iptables -t nat -L KUBE-SERVICES |egrep 'nginx'
?可以看到來(lái)自cluster -ip為 10.1.125.152的流量都會(huì)轉(zhuǎn)發(fā)到KUBE-SVC-27XJ54RMCFYE2CYL 鏈上處理,接下來(lái)看下KUBE-SVC-27XJ54RMCFYE2CYL上的規(guī)則。
2.?iptables -t nat -L KUBE-SVC-27XJ54RMCFYE2CYL
可以看到?KUBE-SVC-27XJ54RMCFYE2CYL 有二條規(guī)則,第一條是50%的概率到KUBE-SEP-VSD6RSQTLEBJCSMF上,匹配不到就會(huì)落到下面的那條規(guī)則。
3.查看那邊50%的概率到KUBE-SEP-VSD6RSQTLEBJCSMF。iptables -t nat -L KUBE-SEP-VSD6RSQTLEBJCSMF
?可以清晰看到上面的規(guī)則就會(huì)路由到一個(gè)pod上了。另一個(gè)也是一樣的規(guī)則只不過(guò)路由到另外一個(gè)pod上了,如下圖:
完!?
總結(jié)
以上是生活随笔為你收集整理的K8S kube-proxy- iptable模式实现原理分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 周六 第八章 iptable
- 下一篇: 几何深度学习