咱們在平常工做中,能碰見的狀況只有下面三種,k8s集羣內部之間的相互鏈接,k8s集羣內部訪問k8s集羣外部的服務,還有就是k8s集羣外部服務訪問k8s集羣內部的訪問。下面咱們來說解下他們都是如何實現的,咱們將使用分步的方式來說解html
當k8s裏面只有兩個POD之間的通訊是最爲簡單的
上圖所示是咱們Pod B
客戶端去連接請求Pod A
服務端,這個時候咱們只須要把Pod A
的地址告訴Pod B
便可,這個時候Pod A
扛不住請求了,咱們須要在擴展一個Pod A
那我門是否是就想要辦法在Pod A
服務端前面放個Nginx或者什麼的來作負載,只有這樣Pod B
才能按照之前的地址去請求服務啊,因此咱們這個時候在Pod A
上面添加上一個service
服務
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的關係
其實這個時候 k8s集羣內部的通信就大體講清楚了,可是這個裏面有個及其特殊的svc:headless svc
,這個svc當別的客戶端來請求他的時候,他不會去負載的向下面pod去作請求,而是把下面POD的全部IP返回給客戶端,由客戶端本身來決定連接那個POD。node
若是是單個服務,咱們能夠選擇直接在內部直接鏈接外部的服務,可是若是外部服務是個集羣的話,那若是咱們還這樣作就須要在外部集羣前面作個負載,
可是這樣若是有不少個集羣咱們就要建立不少個nginx的4層負載,太麻煩了,咱們能夠把負載放到k8s集羣裏面,咱們採用k8s的svc
+endpoints
來實現外部集羣的負載均衡
這個時候svc
和endpoint
是經過名字來進行綁定的,這樣咱們就實現了集羣內部和集羣外部通信nginx
在實際工做中,除了k8s集羣內部通信,我認爲就是這種通信方式使用的比較多,由於咱們在k8s上跑的集羣不就是爲了讓客戶來訪問的嗎?下面咱們將下三種實現方式後端
nodeport是咱們在node上面所端口綁定,因此node上都會開放此pord端口,咱們任意請求其中一個node端口,即便這個pod沒有落在這個node上也行,當請求到node port的時候他會自動轉發到對應的Podip上來實現訪問
負載均衡
必須pod落在那個node上,那個node纔會開放對應的端口less
ingress是咱們使用最廣泛的暴漏k8s集羣內部服務讓外部來訪問的方式,ingress是一類資源的統稱,咱們如今通常都適用ingress-nginx,關於ingress 請參考https://www.zhangshoufu.com/articles/2019/07/19/1563529715618.html, 這裏不在細說ide