這篇文章將為大家詳細講解有關(guān)k8s-service中ipvs cluster ip實現(xiàn)原理是什么,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
創(chuàng)新互聯(lián)建站堅持“要么做到,要么別承諾”的工作理念,服務領(lǐng)域包括:做網(wǎng)站、成都網(wǎng)站建設、企業(yè)官網(wǎng)、英文網(wǎng)站、手機端網(wǎng)站、網(wǎng)站推廣等服務,滿足客戶于互聯(lián)網(wǎng)時代的涉縣網(wǎng)站設計、移動媒體設計的需求,幫助企業(yè)找到有效的互聯(lián)網(wǎng)解決方案。努力成為您成熟可靠的網(wǎng)絡建設合作伙伴!
基于iptable方式實現(xiàn)的k8s集群中cluster ip類型和node port類型service的負載均衡。本質(zhì)上是當網(wǎng)絡數(shù)據(jù)包從pod的network namespace中通過linux veth pair設備進入到host宿主中的network namespace時,經(jīng)過iptable一系列的NAT轉(zhuǎn)換,把service的cluster ip和端口DNAT成pod的ip和端口。同時leverage linux iptable的random模塊,實現(xiàn)了對pod的負載均衡,然后再交由host對目標pod的路由策略來實現(xiàn)將數(shù)據(jù)包發(fā)往pod。當然,這一切都是在linux內(nèi)核空間實現(xiàn)的,和應用程序的用戶空間沒有關(guān)系。在這里我們主要介紹基于ipvs的cluster ip類型service的實現(xiàn)原理。
要實現(xiàn)基于ipvs的k8s網(wǎng)絡負載均衡需要如下:
Linux內(nèi)核高于2.4.x,參考如下:
https://en.wikipedia.org/wiki/IP_Virtual_Server
在kube-proxy網(wǎng)絡組件的啟動參數(shù)中加入--proxy-mode=ipvs,在以前文章中有所介紹
安裝ipvsadm工具,本質(zhì)是ipvsadm是用戶空間的程序,用來操作和管理ipvs
安裝ipvsadm工具:
yum install ipvsadmwhereis ipvsadm
我們這里是介紹cluster ip類型的service,所以我們基于以前文章里安裝的應用,顯示k8s集群中的cluster ip:
kubectl get service --all-namespaces
根據(jù)以前文章,數(shù)據(jù)包會從pod的network namespace通過linux veth pair設備進入host的network namespace。host開啟了路由轉(zhuǎn)發(fā)功能,數(shù)據(jù)先進入到了iptable的PREROUTING chain中,我們查看這個chain:
iptables -nL -t nat
據(jù)這個chain,數(shù)據(jù)包會進入到KUBE-SERVICES這個targe中。
查看KUBE-SERVICES這個target:
iptables -nL -t nat
根據(jù)KUBE-SERVICES target,數(shù)據(jù)包匹配ipset KUBE-CLUSTER-IP。ipset是linux的內(nèi)核數(shù)據(jù)結(jié)構(gòu),可以存儲一些ip和端口的信息,ipvs模式的集群通過在iptable中匹配ipset,這樣減少了iptable中的entry數(shù)量。在這里匹配了這個ipset之后進入了KUBE-MARK-MASQ這個target。
查看KUBE-CLUSTER-IP這個ipset:
ipset list KUBE-CLUSTER-IP
這里我們看到KUBE-CLUSTER-IP這個ipset里一共有9個entry,而且也匹配了集群中cluster ip類型service的ip和端口。
根據(jù)KUBE-SERVICES target,匹配KUBE-CLUSTER-IP這個ipset的items(也就是cluster ip類型的service)會進入到KUBE-MARK-MASQ這個target中,我們查看這個target:
我們觀察這個target是對所有的items做了mark標記。
經(jīng)過了PREROUTING chain以及相關(guān)的target之后數(shù)據(jù)會來到INPUT chain,這是因為對于ipvs模式,會在host的network namespace里創(chuàng)建kube-ipvs0網(wǎng)絡設備,并且綁定了所有的cluster ip,這樣數(shù)據(jù)就可以進入到INPUT chain。
ip addr|grep kube
對于k8s集群的ipvs負載均衡來說,其核心工作就是在INPUT chain,采用NAT模式(http://www.linuxvirtualserver.org/VS-NAT.html,當然ipvs不僅僅只有NAT模式,還有更多模式,詳細的資料可以到LVS項目的官方網(wǎng)站參考www.linuxvirtualserver.org/Documents.html),linux操作系統(tǒng)網(wǎng)絡內(nèi)核會對目標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
我們看到service service-nginx-app cluster ip為10.254.226.173:80,對應兩個endpoint為10.1.86.6:80和10.1.86.7:80。然后通過ipvsadm工具查看確實是ipvs將其映射成兩個endpoints,并且使用round robin的分配方式,分配權(quán)重為1和1,也就是均勻的實現(xiàn)負載均衡。
ipvs在INPUT chain完成上述DNAT操作,然后將數(shù)據(jù)送入POSTROUTING chain,我們查看這個chain。
iptables -nL -t nat
這里我們發(fā)現(xiàn)數(shù)據(jù)在POSTROUTING chain會進入KUBE-POSTROUTING這個target中。
查看KUBE-POSTROUTING target:
iptables -nL -t nat
這里我們發(fā)現(xiàn)是對數(shù)據(jù)包做了MASQUERADE偽裝,并且匹配的就是在KUBE-MARK-MASQ target中做的標記,也就是用下一跳路由所使用網(wǎng)路設備的ip做了SNAT操作。所以到這里我們的數(shù)據(jù)包源ip為下一跳路由所使用網(wǎng)路設備的ip,目標ip為10.1.86.6或者10.1.86.7(RR 1:1的負載均衡方式),然后根據(jù)host network namespace的路由表做下一跳路由選擇。
總結(jié)對于ipvs下的cluster ip的通訊方式為:
數(shù)據(jù)包從pod network namespace發(fā)出,進入host的network namespace,源ip為pod ip,源端口為隨機端口,目標ip為cluster ip,目標port為指定port。
數(shù)據(jù)包在host network namespace中進入PREROUTING chain。
在PREROUTING chain中經(jīng)過匹配ipset KUBE-CLUSTER-IP做mask標記操作。
在host network namespace中創(chuàng)建網(wǎng)絡設備kube-ipvs0,并且綁定所有cluster ip,這樣從pod發(fā)出的數(shù)據(jù)包目標ip為cluster ip,有kube-ipvs0網(wǎng)絡設備對應,數(shù)據(jù)進入INPUT chain中。
數(shù)據(jù)在INPUT chain中被ipvs的內(nèi)核規(guī)則修改(可由ipvsadm查看規(guī)則),完成DNAT,然后將數(shù)據(jù)直接送入POSTROUTING chain。這時源ip為pod ip,源端口為隨機端口,目標ip為映射選擇的pod ip,目標port為映射選擇的port。
數(shù)據(jù)在POSTROUTING chain中,經(jīng)過KUBE-POSTROUTING target完成MASQUERADE SNAT。這時源ip為下一跳路由所使用網(wǎng)路設備的ip,源端口為隨機端口,目標ip為映射選擇的pod ip,目標port為映射選擇的port。
數(shù)據(jù)包根據(jù)host network namespace的路由表做下一跳路由選擇。
關(guān)于k8s-service中ipvs cluster ip實現(xiàn)原理是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
分享文章:k8s-service中ipvsclusterip實現(xiàn)原理是什么
網(wǎng)頁鏈接:http://chinadenli.net/article46/jsiehg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站收錄、網(wǎng)頁設計公司、手機網(wǎng)站建設、響應式網(wǎng)站、網(wǎng)站改版、微信小程序
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)