結束本章之前的最後一點。如您所知,就緒探測在 Pod 啟動時最重要,但它們還確保當某些原因導致 Pod 在正常運行期間不再處於就緒狀態時,Pod 會停止服務。但是當 pod 終止時呢?正在關閉的 pod 不應成為任何Service的一部分。在實施就緒探測時是否需要考慮這一點?

幸運的是,當你刪除一個 Pod 時,k8s不僅會向 Pod 的容器發送終止信號,還會從所有Service中移除該Pod。這表示您不必為終止就緒探測中的 pod 做出任何特殊規定。 當您的應用程序接收到終止信號時,您不必確保探測失敗。

如今,人們通常不會只運行單個Pod來提供特定服務,而是運行Pod的多個副本,以便將負載分散在多個叢集節點上。 但這表示提供相同服務的所有pod副本都應該可以在單一位址進行存取,以便客戶端可以使用此單一位址,而不用追蹤並直接連接到某單個pod實例。 在k8s中,您可以使用Service物件來做到這一點。

您在本書中構建的Kiada套件包含三個服務 → Kiada服務、Quiz服務、Quote服務。 到目前為止,這是您各別與三個隔離服務的互動,但我們計劃是將這些服務連接起來,如下圖。

圖 11.1 Kiada套件的架構和操作。

圖 11.1 Kiada套件的架構和操作。

Kiada服務將呼叫其他兩個服務,並將它們返回的資訊整合到Kiada服務發送給客戶端的回應中。 多個pod副本將提供每個服務,因此您需要使用Service物件來暴露它們。

在建立Service物件之前,請先apply Chapter11/SETUP/目錄中的manifest來部署pod和其他物件,如下:

$ kubectl apply -f SETUP/ --recursive

您可能還記得在上一章中,此指令apply了指定目錄及其子目錄中的所有manifest。apply這些manifest後,您目前的命名空間中應該會有多個pod。

<aside> 💡 了解 POD 的通信方式

您在第 5 章中了解了 pod 是什麼,什麼時候將多個容器組合成一個pod,以及這些容器如何通訊。但是來自不同pod的容器是如何通訊的呢?

每個pod都有自己的網路介面和自己的IP。叢集中的所有pod都是透過一個具有扁平位址空間的私有網路連接。 如下圖,即使託管Pod的節點在地理位置上是分散的,中間有許多路由器,Pod也可以利用自己的扁平網路進行通訊,不需要NAT(網路位址轉換)。 這個pod網路通常是一個軟體定義網路(SDN),軟體定義網路(SDN)在連接節點的實體網路之上。

圖 11.2 Pod 利用自己的電腦網路進行通訊

圖 11.2 Pod 利用自己的電腦網路進行通訊

當一個pod向另一個pod發送網路封包時,不會對封包進行SNAT和DNAT。 這表示Pod之間直接封包交換的來源IP和port以及目的IP和port永遠不會改變。 如果發送端Pod知道接收端Pod的IP,發送端Pod就可以向IP發送封包。發送端Pod可以看到發送者的IP當作封包的來源IP。

儘管有許多k8s網路plugins,但網路plugins的行為都必須如上所述。 因此,兩個pod之間的通訊始終是相同的,無論這些pod是運行在同一個節點上還是運行在位於不同地理區域的節點上。 Pod中的容器可以利用扁平無NAT的網路相互通訊,就像連線到一台網路switch的區域網路(LAN)上的電腦一樣。 從應用程式的角度來看,節點之間的實際網路拓撲並不重要。

</aside>

11.1 利用Service暴露pod

如果在一個pod中運行的應用程式需要連線到運行在不同pod中的另一個應用程式,需要知道另一個pod的IP。這說起來容易做起來難,原因如下:

此外,一些 pod 需要暴露給叢集外的客戶端。 到目前為止,每當您想連線到在pod中運行的應用程式時,您都會使用port forwarding,這只能適用於開發。正確方法是使用k8s Service來讓一組pod可以被外部訪問。

k8s Service是您建立的物件,用來為提供相同服務的一組pod給出單一、固定的存取點。每個Service都有一個固定的IP,只要Service存在就不會改變。 客戶端在暴露此IP上的port打開連線,然後這些連線被轉發到提供此Service的Pod 之一。 利用這種方式,客戶端不需要知道提供Service的每個pod的位址,因此可以將這些pod橫向擴展或縮小,並隨意從一個叢集節點移動到另一個叢集節點。 Service會在這些pod前面擔任負載平衡器。

Kiada套件是解釋Service的最佳範例。Kiada套件包含三組提供三種不同服務的Pod。 Kiada服務呼叫Quote服務來索取quote(引言),並且呼叫Quiz服務來索取quiz問題。

作者對Kiada 0.5版中進行了必要的修改。放在Chapter11/目錄中。您將在本章中使用這個新版本。 您將學習如何設定Kiada應用程式來連線到其他兩個服務,並且將服務暴露到外面世界。 由於每個服務中的pod數量及IP都可以更改,因此您將利用Service物件暴露它們,如下圖。

圖 11.3 使用Service物件暴露 pod

圖 11.3 使用Service物件暴露 pod