原文地址:https://www.servicemesher.com/istio-handbook/best-practices/how-to-implement-ingress-gateway.html
Kubernetes以Pod作為應(yīng)用部署的最小單位吵冒。kubernetes會(huì)根據(jù)Pod的聲明對(duì)其進(jìn)行調(diào)度抹锄,包括創(chuàng)建啥寇、銷毀、遷移瞳秽、水平伸縮等,因此Pod 的IP地址不是固定的率翅,不方便直接采用Pod IP對(duì)服務(wù)進(jìn)行訪問(wèn)练俐。
為解決該問(wèn)題,Kubernetes提供了Service資源安聘,Service對(duì)提供同一個(gè)服務(wù)的多個(gè)Pod進(jìn)行聚合痰洒。一個(gè)Service提供一個(gè)虛擬的Cluster IP,后端對(duì)應(yīng)一個(gè)或者多個(gè)提供服務(wù)的Pod浴韭。在集群中訪問(wèn)該Service時(shí)丘喻,采用Cluster IP即可,Kube-proxy負(fù)責(zé)將發(fā)送到Cluster IP的請(qǐng)求轉(zhuǎn)發(fā)到后端的Pod上念颈。
Kube-proxy是一個(gè)運(yùn)行在每個(gè)節(jié)點(diǎn)上的go應(yīng)用程序泉粉,支持三種工作模式:
userspace 模式
該模式下kube-proxy會(huì)為每一個(gè)Service創(chuàng)建一個(gè)監(jiān)聽(tīng)端口。發(fā)向Cluster IP的請(qǐng)求被Iptables規(guī)則重定向到Kube-proxy監(jiān)聽(tīng)的端口上,Kube-proxy根據(jù)LB算法選擇一個(gè)提供服務(wù)的Pod并和其建立鏈接嗡靡,以將請(qǐng)求轉(zhuǎn)發(fā)到Pod上跺撼。
該模式下,Kube-proxy充當(dāng)了一個(gè)四層Load balancer的角色讨彼。由于kube-proxy運(yùn)行在userspace中歉井,在進(jìn)行轉(zhuǎn)發(fā)處理時(shí)會(huì)增加兩次內(nèi)核和用戶空間之間的數(shù)據(jù)拷貝,效率較另外兩種模式低一些哈误;好處是當(dāng)后端的Pod不可用時(shí)哩至,kube-proxy可以重試其他Pod。
圖片來(lái)自:Kubernetes官網(wǎng)文檔
iptables 模式
為了避免增加內(nèi)核和用戶空間的數(shù)據(jù)拷貝操作蜜自,提高轉(zhuǎn)發(fā)效率菩貌,Kube-proxy提供了iptables模式。在該模式下重荠,Kube-proxy為service后端的每個(gè)Pod創(chuàng)建對(duì)應(yīng)的iptables規(guī)則箭阶,直接將發(fā)向Cluster IP的請(qǐng)求重定向到一個(gè)Pod IP。
該模式下Kube-proxy不承擔(dān)四層代理的角色戈鲁,只負(fù)責(zé)創(chuàng)建iptables規(guī)則仇参。該模式的優(yōu)點(diǎn)是較userspace模式效率更高,但不能提供靈活的LB策略婆殿,當(dāng)后端Pod不可用時(shí)也無(wú)法進(jìn)行重試冈敛。
圖片來(lái)自:Kubernetes官網(wǎng)文檔
ipvs 模式
該模式和iptables類似,kube-proxy監(jiān)控Pod的變化并創(chuàng)建相應(yīng)的ipvs rules鸣皂。ipvs也是在kernel模式下通過(guò)netfilter實(shí)現(xiàn)的抓谴,但采用了hash table來(lái)存儲(chǔ)規(guī)則,因此在規(guī)則較多的情況下寞缝,Ipvs相對(duì)iptables轉(zhuǎn)發(fā)效率更高癌压。除此以外,ipvs支持更多的LB算法荆陆。如果要設(shè)置kube-proxy為ipvs模式滩届,必須在操作系統(tǒng)中安裝IPVS內(nèi)核模塊。