天天看點

Kubernetes 系列(四十五)南北通信用戶端如何與叢集内的服務通信

作者:回首不堪的流年

Kubernetes 系列(四十五)Kubernetes 中的南北通信 — 用戶端如何與叢集内的服務通信?

從Pod ip 到雲原生負載均衡器的逐漸解決問題的方法
Kubernetes 系列(四十五)南北通信用戶端如何與叢集内的服務通信

在開始交流之前,先快速澄清一下Kubernetes中使用的一些基本術語:

Pod - Kubernetes中最小的實體。每個 Pod 都有一個IP位址。為簡單起見,可以将它們看作是運作應用程式的容器的包裝器(就像在docker容器中運作的應用程式)。一個 Pod 可能有多個容器;附加的容器充當主應用程式容器的助手。

Nodes - 實體或虛拟的伺服器/機器,在這些伺服器/機器上部署pods并形成叢集。

現在,假設這個pod正在運作一個web應用程式,兩個節點和四個pod為它提供服務。

Kubernetes 系列(四十五)南北通信用戶端如何與叢集内的服務通信

如果使用者以某種方式獲得了 pod 的公共IP位址,那麼客戶機是否可以從外部通路web應用程式?這些Pod 位于節點内部的單獨網絡上。其次,pod是不穩定的,每次建立一個pod,它都會獲得一個新的IP位址。

我們正在讨論示例中的四個pod,那麼我們要公開誰的IP位址呢?或者我們向外界公開四個IP位址,讓用戶端決定它想在哪個IP位址上碰碰運氣?

1. NodePort 類型的 Service

我們需要在 Pod 的上面加一層。這一層稱為NodePort Service,因為它在節點上建立一個端口來通路pods。

NodePort Service在叢集中有自己的IP位址,它實際上是一組請求轉發規則。它接受來自外部世界的請求,并将其傳播到分布在一個或多個節點上的各個 Pod 中。

Kubernetes 系列(四十五)南北通信用戶端如何與叢集内的服務通信

可以通過使用節點的IP位址和節點端口服務的配置端口來通路Pods。

它還負責使用随機算法和會話關聯将流量配置設定到 Pod。在内部,NodePort服務使用另一個元件與pod通信,也就是ClusterIP服務。

所有問題都解決了嗎?不完全是,還有三個問題:

從外部使用 Ip 位址通路 NodePort Service

使用節點的IP位址' <節點>的IP- address:< NodePort服務>的端口'。是以,如果節點是永久性的,我們可以給出兩個節點的IP位址,客戶機可以使用其中任何一個節點。第一個問題是,我們為它們提供了多個到達伺服器的位址。

第二個問題是彈性和規模。是以,節點也是易變的,可能會停機(通常,可以通過使用對外公開的靜态IP位址來克服這一限制。以及在伸縮事件中調用腳本,将此IP位址配置設定給叢集中的一個節點)。

端口範圍有限制

對于 NodePort Service,端口隻能配置在30000 - 32,767的範圍内。

安全問題

由于工作節點的端口是直接對外開放的,是以産生了許多安全問題。

由于上述限制,在開發或測試環境中可能需要NodePort服務。當定制環境/內建中需要一些自由度時,它可能也很有用。讓我們考慮一下其他選擇:

2. Load Balancer 類型 Service

在NodePort Service之上的附加層可能會有所幫助。當叢集部署在公共雲(如AWS或谷歌)中時,我們可以使用Kubernetes提供的負載均衡器服務,它內建了AWS ELB等雲本地負載均衡器。

Kubernetes 系列(四十五)南北通信用戶端如何與叢集内的服務通信

使用者連接配接到外部負載均衡器,将流量導向Pod。

負載均衡器服務有一個叢集IP位址和一個外部IP位址。負載均衡器服務是NodePort服務的抽象(NodePort服務是ClusterIP服務的抽象)。是以建立了NodePort Service,但是這些端口隻能被雲本地負載均衡通路——不能直接通路外部世界。

可能存在到負載均衡器的DNS路由,使用者可以使用域名通路服務。還可以通過通路負載均衡器直接通路該服務。外部負載均衡器控制流量如何配置設定到 Pod。

作為旁注,根據負載均衡器的類型和雲平台,可以指向節點/執行個體(并在節點級别有一個跳),也可以直接獲得pod本身的IP位址(避免跳,使其更高效)。例如,可以在AWS的網絡負載均衡器中實作。

3. Ingress

如果叢集不在雲中,或者它在雲中,但僅用于處理HTTP通信,則可以使用Kubernetes Ingress而不是負載均衡器。Ingress 是第7層(HTTP)抽象,它為傳入請求指定路由規則。路由/重定向規則由另一個稱為Ingress控制器的元件實作。

Kubernetes 系列(四十五)南北通信用戶端如何與叢集内的服務通信

Ingress controller

Ingress 控制器充當叢集内的反向代理/入口點。根據路由規則,來自客戶機的任何請求通過負載均衡器到達Ingress控制器,在那裡它被重定向到pods。不需要NodePort Service。

另外,值得強調的是,根據服務和控制器實作,還有其他可能的Ingress設定。

總結

Kubernetes使用服務來促進通信。我們研究了NodePort 類型服務、Load Balancer 類型服務,并觸及了 ClusterIP 類型服務。我将在讨論叢集通信的下一篇文章中重新讨論它。

Ingress是Kubernetes中的另一個對象,它可以在叢集之外公開HTTP服務。提供路由、TLS終止和負載均衡功能。

此外,Kubernetes與雲提供商內建得非常好,可以簡化叢集設定。

繼續閱讀