溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

k8s-service中ipvs cluster ip實(shí)現(xiàn)原理是什么

發(fā)布時(shí)間:2021-11-15 14:25:13 來源:億速云 閱讀:327 作者:柒染 欄目:大數(shù)據(jù)

這篇文章將為大家詳細(xì)講解有關(guān)k8s-service中ipvs cluster ip實(shí)現(xiàn)原理是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

基于iptable方式實(shí)現(xiàn)的k8s集群中cluster ip類型和node port類型service的負(fù)載均衡。本質(zhì)上是當(dāng)網(wǎng)絡(luò)數(shù)據(jù)包從pod的network namespace中通過linux veth pair設(shè)備進(jìn)入到host宿主中的network namespace時(shí),經(jīng)過iptable一系列的NAT轉(zhuǎn)換,把service的cluster ip和端口DNAT成pod的ip和端口。同時(shí)leverage linux iptable的random模塊,實(shí)現(xiàn)了對(duì)pod的負(fù)載均衡,然后再交由host對(duì)目標(biāo)pod的路由策略來實(shí)現(xiàn)將數(shù)據(jù)包發(fā)往pod。當(dāng)然,這一切都是在linux內(nèi)核空間實(shí)現(xiàn)的,和應(yīng)用程序的用戶空間沒有關(guān)系。在這里我們主要介紹基于ipvs的cluster ip類型service的實(shí)現(xiàn)原理。

要實(shí)現(xiàn)基于ipvs的k8s網(wǎng)絡(luò)負(fù)載均衡需要如下:

  • Linux內(nèi)核高于2.4.x,參考如下:

    https://en.wikipedia.org/wiki/IP_Virtual_Server

    k8s-service中ipvs cluster ip實(shí)現(xiàn)原理是什么

  • 在kube-proxy網(wǎng)絡(luò)組件的啟動(dòng)參數(shù)中加入--proxy-mode=ipvs,在以前文章中有所介紹

  • 安裝ipvsadm工具,本質(zhì)是ipvsadm是用戶空間的程序,用來操作和管理ipvs


安裝ipvsadm工具:



yum install ipvsadmwhereis ipvsadm

k8s-service中ipvs cluster ip實(shí)現(xiàn)原理是什么

k8s-service中ipvs cluster ip實(shí)現(xiàn)原理是什么

我們這里是介紹cluster ip類型的service,所以我們基于以前文章里安裝的應(yīng)用,顯示k8s集群中的cluster ip:


kubectl get service --all-namespaces

k8s-service中ipvs cluster ip實(shí)現(xiàn)原理是什么

根據(jù)以前文章,數(shù)據(jù)包會(huì)從pod的network namespace通過linux veth pair設(shè)備進(jìn)入host的network namespace。host開啟了路由轉(zhuǎn)發(fā)功能,數(shù)據(jù)先進(jìn)入到了iptable的PREROUTING chain中,我們查看這個(gè)chain:


iptables -nL -t nat

據(jù)這個(gè)chain,數(shù)據(jù)包會(huì)進(jìn)入到KUBE-SERVICES這個(gè)targe中。

k8s-service中ipvs cluster ip實(shí)現(xiàn)原理是什么

查看KUBE-SERVICES這個(gè)target:


iptables -nL -t nat

k8s-service中ipvs cluster ip實(shí)現(xiàn)原理是什么

根據(jù)KUBE-SERVICES target,數(shù)據(jù)包匹配ipset KUBE-CLUSTER-IP。ipset是linux的內(nèi)核數(shù)據(jù)結(jié)構(gòu),可以存儲(chǔ)一些ip和端口的信息,ipvs模式的集群通過在iptable中匹配ipset,這樣減少了iptable中的entry數(shù)量。在這里匹配了這個(gè)ipset之后進(jìn)入了KUBE-MARK-MASQ這個(gè)target。

查看KUBE-CLUSTER-IP這個(gè)ipset:


ipset list KUBE-CLUSTER-IP

k8s-service中ipvs cluster ip實(shí)現(xiàn)原理是什么

這里我們看到KUBE-CLUSTER-IP這個(gè)ipset里一共有9個(gè)entry,而且也匹配了集群中cluster ip類型service的ip和端口。

根據(jù)KUBE-SERVICES target,匹配KUBE-CLUSTER-IP這個(gè)ipset的items(也就是cluster ip類型的service)會(huì)進(jìn)入到KUBE-MARK-MASQ這個(gè)target中,我們查看這個(gè)target:

k8s-service中ipvs cluster ip實(shí)現(xiàn)原理是什么

我們觀察這個(gè)target是對(duì)所有的items做了mark標(biāo)記。

經(jīng)過了PREROUTING chain以及相關(guān)的target之后數(shù)據(jù)會(huì)來到INPUT chain,這是因?yàn)閷?duì)于ipvs模式,會(huì)在host的network namespace里創(chuàng)建kube-ipvs0網(wǎng)絡(luò)設(shè)備,并且綁定了所有的cluster ip,這樣數(shù)據(jù)就可以進(jìn)入到INPUT chain。


ip addr|grep kube

k8s-service中ipvs cluster ip實(shí)現(xiàn)原理是什么

對(duì)于k8s集群的ipvs負(fù)載均衡來說,其核心工作就是在INPUT chain,采用NAT模式(http://www.linuxvirtualserver.org/VS-NAT.html,當(dāng)然ipvs不僅僅只有NAT模式,還有更多模式,詳細(xì)的資料可以到LVS項(xiàng)目的官方網(wǎng)站參考www.linuxvirtualserver.org/Documents.html),linux操作系統(tǒng)網(wǎng)絡(luò)內(nèi)核會(huì)對(duì)目標(biāo)ip來做轉(zhuǎn)DNAT換。這里我們以service service-nginx-app做為例子,它的cluster ip是10.254.226.173,我們查看ipvs如何做DNAT



kubectl describe service service-nginx-app --namespace defaultipvsadm -L

k8s-service中ipvs cluster ip實(shí)現(xiàn)原理是什么

k8s-service中ipvs cluster ip實(shí)現(xiàn)原理是什么

我們看到service service-nginx-app cluster ip為10.254.226.173:80,對(duì)應(yīng)兩個(gè)endpoint為10.1.86.6:80和10.1.86.7:80。然后通過ipvsadm工具查看確實(shí)是ipvs將其映射成兩個(gè)endpoints,并且使用round robin的分配方式,分配權(quán)重為1和1,也就是均勻的實(shí)現(xiàn)負(fù)載均衡。

ipvs在INPUT chain完成上述DNAT操作,然后將數(shù)據(jù)送入POSTROUTING chain,我們查看這個(gè)chain。


iptables -nL -t nat

k8s-service中ipvs cluster ip實(shí)現(xiàn)原理是什么

這里我們發(fā)現(xiàn)數(shù)據(jù)在POSTROUTING chain會(huì)進(jìn)入KUBE-POSTROUTING這個(gè)target中。

查看KUBE-POSTROUTING target:


iptables -nL -t nat

k8s-service中ipvs cluster ip實(shí)現(xiàn)原理是什么

這里我們發(fā)現(xiàn)是對(duì)數(shù)據(jù)包做了MASQUERADE偽裝,并且匹配的就是在KUBE-MARK-MASQ target中做的標(biāo)記,也就是用下一跳路由所使用網(wǎng)路設(shè)備的ip做了SNAT操作。所以到這里我們的數(shù)據(jù)包源ip為下一跳路由所使用網(wǎng)路設(shè)備的ip,目標(biāo)ip為10.1.86.6或者10.1.86.7(RR 1:1的負(fù)載均衡方式),然后根據(jù)host network namespace的路由表做下一跳路由選擇。

總結(jié)對(duì)于ipvs下的cluster ip的通訊方式為:

  • 數(shù)據(jù)包從pod network namespace發(fā)出,進(jìn)入host的network namespace,源ip為pod ip,源端口為隨機(jī)端口,目標(biāo)ip為cluster ip,目標(biāo)port為指定port。

  • 數(shù)據(jù)包在host network namespace中進(jìn)入PREROUTING chain。

  • 在PREROUTING chain中經(jīng)過匹配ipset KUBE-CLUSTER-IP做mask標(biāo)記操作。

  • 在host network namespace中創(chuàng)建網(wǎng)絡(luò)設(shè)備kube-ipvs0,并且綁定所有cluster ip,這樣從pod發(fā)出的數(shù)據(jù)包目標(biāo)ip為cluster ip,有kube-ipvs0網(wǎng)絡(luò)設(shè)備對(duì)應(yīng),數(shù)據(jù)進(jìn)入INPUT chain中。

  • 數(shù)據(jù)在INPUT chain中被ipvs的內(nèi)核規(guī)則修改(可由ipvsadm查看規(guī)則),完成DNAT,然后將數(shù)據(jù)直接送入POSTROUTING chain。這時(shí)源ip為pod ip,源端口為隨機(jī)端口,目標(biāo)ip為映射選擇的pod ip,目標(biāo)port為映射選擇的port。

  • 數(shù)據(jù)在POSTROUTING chain中,經(jīng)過KUBE-POSTROUTING target完成MASQUERADE SNAT。這時(shí)源ip為下一跳路由所使用網(wǎng)路設(shè)備的ip,源端口為隨機(jī)端口,目標(biāo)ip為映射選擇的pod ip,目標(biāo)port為映射選擇的port。

  • 數(shù)據(jù)包根據(jù)host network namespace的路由表做下一跳路由選擇。

關(guān)于k8s-service中ipvs cluster ip實(shí)現(xiàn)原理是什么就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI