我們?cè)谌粘9ぷ髦?,能遇見的情況只有下面三種,k8s集群內(nèi)部之間的相互連接,k8s集群內(nèi)部訪問k8s集群外部的服務(wù),還有就是k8s集群外部服務(wù)訪問k8s集群內(nèi)部的訪問。下面我們來(lái)講解下他們都是如何實(shí)現(xiàn)的,我們將使用分步的方式來(lái)講解
成都創(chuàng)新互聯(lián)公司成立于2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站制作、做網(wǎng)站網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元南木林做網(wǎng)站,已為上家服務(wù),為南木林各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
當(dāng)k8s里面只有兩個(gè)POD之間的通信是最為簡(jiǎn)單的
上圖所示是我們Pod B
客戶端去鏈接請(qǐng)求Pod A
服務(wù)端,這個(gè)時(shí)候我們只需要把Pod A
的地址告訴Pod B
即可,這個(gè)時(shí)候Pod A
扛不住請(qǐng)求了,我們需要在擴(kuò)展一個(gè)Pod A
那我門是不是就想要辦法在Pod A
服務(wù)端前面放個(gè)Nginx或者什么的來(lái)做負(fù)載,只有這樣Pod B
才能按照以前的地址去請(qǐng)求服務(wù)啊,所以我們這個(gè)時(shí)候在Pod A
上面添加上一個(gè)service
服務(wù)
svc資源通過matchLables
字段選擇打有對(duì)應(yīng)標(biāo)簽的Pod
,這個(gè)時(shí)候Pod B
在來(lái)請(qǐng)求服務(wù)的時(shí)候就直接去訪問SVC A
,我們告訴Pod B
SVC A
所對(duì)應(yīng)的IP地址是什么,SVC A
會(huì)自動(dòng)負(fù)載到后端的POD A
上,需要注意的是:當(dāng)這個(gè)時(shí)候如果 A服務(wù)還是扛不住壓力,那我們就只需要多啟動(dòng)幾個(gè)Pod A
就行了,啟動(dòng)的新的Pod之后,svc還是會(huì)根據(jù)matchLables
把它自動(dòng)添加到負(fù)載里面去
我們k8s集群里面不可能只有兩種服務(wù)啊,肯定有很多服務(wù),但我們不可能每個(gè)都手工去配置吧,所以這個(gè)時(shí)候就引入了CoreDNS
的概念,我們用CoreDNS來(lái)維護(hù)svc 和clusterIP的關(guān)系
其實(shí)這個(gè)時(shí)候 k8s集群內(nèi)部的通訊就大致講清楚了,但是這個(gè)里面有個(gè)及其特殊的svc:headless svc
,這個(gè)svc當(dāng)別的客戶端來(lái)請(qǐng)求他的時(shí)候,他不會(huì)去負(fù)載的向下面pod去做請(qǐng)求,而是把下面POD的所有IP返回給客戶端,由客戶端自己來(lái)決定鏈接那個(gè)POD。
如果是單個(gè)服務(wù),我們可以選擇直接在內(nèi)部直接連接外部的服務(wù),但是如果外部服務(wù)是個(gè)集群的話,那如果我們還這樣做就需要在外部集群前面做個(gè)負(fù)載,
但是這樣如果有很多個(gè)集群我們就要?jiǎng)?chuàng)建很多個(gè)nginx的4層負(fù)載,太麻煩了,我們可以把負(fù)載放到k8s集群里面,我們采用k8s的svc
+endpoints
來(lái)實(shí)現(xiàn)外部集群的負(fù)載均衡
這個(gè)時(shí)候svc
和endpoint
是通過名字來(lái)進(jìn)行綁定的,這樣我們就實(shí)現(xiàn)了集群內(nèi)部和集群外部通訊
在實(shí)際工作中,除了k8s集群內(nèi)部通訊,我認(rèn)為就是這種通訊方式使用的比較多,因?yàn)槲覀冊(cè)趉8s上跑的集群不就是為了讓客戶來(lái)訪問的嗎?下面我們將下三種實(shí)現(xiàn)方式
nodeport是我們?cè)趎ode上面所端口綁定,所以node上都會(huì)開放此pord端口,我們?nèi)我庹?qǐng)求其中一個(gè)node端口,即使這個(gè)pod沒有落在這個(gè)node上也行,當(dāng)請(qǐng)求到node port的時(shí)候他會(huì)自動(dòng)轉(zhuǎn)發(fā)到對(duì)應(yīng)的Podip上來(lái)實(shí)現(xiàn)訪問
必須pod落在那個(gè)node上,那個(gè)node才會(huì)開放對(duì)應(yīng)的端口
ingress是我們使用最普遍的暴漏k8s集群內(nèi)部服務(wù)讓外部來(lái)訪問的方式,ingress是一類資源的統(tǒng)稱,我們現(xiàn)在一般都適用ingress-nginx,關(guān)于ingress 請(qǐng)參考https://www.zhangshoufu.com/articles/2019/07/19/1563529715618.html, 這里不在細(xì)說(shuō)
視頻講解:https://www.bilibili.com/video/av71139472