kubernetes 通信淺談

kubernetes 通信淺談

咱們在平常工做中,能碰見的狀況只有下面三種,k8s集羣內部之間的相互鏈接,k8s集羣內部訪問k8s集羣外部的服務,還有就是k8s集羣外部服務訪問k8s集羣內部的訪問。下面咱們來說解下他們都是如何實現的,咱們將使用分步的方式來說解html

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。node

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

若是是單個服務,咱們能夠選擇直接在內部直接鏈接外部的服務,可是若是外部服務是個集羣的話,那若是咱們還這樣作就須要在外部集羣前面作個負載,
image.png
可是這樣若是有不少個集羣咱們就要建立不少個nginx的4層負載,太麻煩了,咱們能夠把負載放到k8s集羣裏面,咱們採用k8s的svc+endpoints來實現外部集羣的負載均衡
image.png
這個時候svcendpoint是經過名字來進行綁定的,這樣咱們就實現了集羣內部和集羣外部通信nginx

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

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

nodeport

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

hostport

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

ingress

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

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

相關文章
相關標籤/搜索