kubernetes 通訊淺談

kubernetes 通訊淺談

我們在日常工作中,能遇見的情況只有下面三種,k8s集羣內部之間的相互連接,k8s集羣內部訪問k8s集羣外部的服務,還有就是k8s集羣外部服務訪問k8s集羣內部的訪問。下面我們來講解下他們都是如何實現的,我們將使用分步的方式來講解

kubernetes集羣內部的通訊

當k8s裏面只有兩個POD之間的通信是最爲簡單的
image.png
上圖所示是我們Pod B客戶端去鏈接請求Pod A服務端,這個時候我們只需要把Pod A的地址告訴Pod B即可,這個時候Pod A扛不住請求了,我們需要在擴展一個Pod A
image.png
那我門是不是就想要辦法在Pod A服務端前面放個Nginx或者什麼的來做負載,只有這樣Pod B才能按照以前的地址去請求服務啊,所以我們這個時候在Pod A上面添加上一個service服務
image.png
svc資源通過matchLables字段選擇打有對應標籤的Pod,這個時候Pod B在來請求服務的時候就直接去訪問SVC A,我們告訴Pod B SVC A所對應的IP地址是什麼,SVC A會自動負載到後端的POD A上,需要注意的是:當這個時候如果 A服務還是扛不住壓力,那我們就只需要多啓動幾個Pod A就行了,啓動的新的Pod之後,svc還是會根據matchLables把它自動添加到負載裏面去
我們k8s集羣裏面不可能只有兩種服務啊,肯定有很多服務,但我們不可能每個都手工去配置吧,所以這個時候就引入了CoreDNS的概念,我們用CoreDNS來維護svc 和clusterIP的關係
image.png
其實這個時候 k8s集羣內部的通訊就大致講清楚了,但是這個裏面有個及其特殊的svc:headless svc,這個svc當別的客戶端來請求他的時候,他不會去負載的向下面pod去做請求,而是把下面POD的所有IP返回給客戶端,由客戶端自己來決定鏈接那個POD。

k8s集羣內部請求集羣外部的服務

如果是單個服務,我們可以選擇直接在內部直接連接外部的服務,但是如果外部服務是個集羣的話,那如果我們還這樣做就需要在外部集羣前面做個負載,
image.png
但是這樣如果有很多個集羣我們就要創建很多個nginx的4層負載,太麻煩了,我們可以把負載放到k8s集羣裏面,我們採用k8s的svc+endpoints來實現外部集羣的負載均衡
image.png
這個時候svcendpoint是通過名字來進行綁定的,這樣我們就實現了集羣內部和集羣外部通訊

k8s集羣外部和k8s集羣內部通信

在實際工作中,除了k8s集羣內部通訊,我認爲就是這種通訊方式使用的比較多,因爲我們在k8s上跑的集羣不就是爲了讓客戶來訪問的嗎?下面我們將下三種實現方式

nodeport

nodeport是我們在node上面所端口綁定,所以node上都會開放此pord端口,我們任意請求其中一個node端口,即使這個pod沒有落在這個node上也行,當請求到node port的時候他會自動轉發到對應的Podip上來實現訪問
image.png

hostport

必須pod落在那個node上,那個node纔會開放對應的端口

ingress

ingress是我們使用最普遍的暴漏k8s集羣內部服務讓外部來訪問的方式,ingress是一類資源的統稱,我們現在一般都適用ingress-nginx,關於ingress 請參考https://www.zhangshoufu.com/articles/2019/07/19/1563529715618.html, 這裏不在細說

視頻講解:https://www.bilibili.com/video/av71139472

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章