1. 程式人生 > >Kubernetes服務發現入門:如何高效管理服務?

Kubernetes服務發現入門:如何高效管理服務?

愈發複雜的應用程式正在依靠微服務來保持可擴充套件性和提升效率。Kubernetes為微服務提供了完美的環境,並能夠讓其與Kubernetes的工具元件和功能相容。當應用程式的每個部分放置在一個容器中,整個系統就會更具可伸縮性。

微服務和容器的運作方式也適合當下的CI/CD工作流程,即無需關閉整個系統進行更新,因為可以分別更新每個微服務(容器)。但是,這會使容器或pod的生命週期縮短,其IP地址會發生變化。

在應用程式及其微服務的生命週期中,其中某些部分可能會出現錯誤,無法執行,進而導致意外狀況,IP地址也很有可能發生變化。此時,服務網格可以幫助應用程式重新路由、提升安全性。

動態IP分配

在我們瞭解如何管理服務以及如何高效建立服務發現之前,我們必須瞭解服務發現所面臨的首要挑戰:IP分配問題。具體而言,Kubernetes將IP地址動態分配給Pod和服務的方式。

我們固然可以為單個Pod和服務定義IP地址,但這樣做會限制Kubernetes環境的可伸縮性。在預設情況下,環境在每次重新啟動叢集、pod或服務時,任意資源都會獲得新的IP地址,因此我們只能對服務使用唯一的名稱。

為了克服這一問題,你可以使用兩種方法。其一,檢視服務的環境變數。與Docker允許容器相互通訊的方式類似,Kubernetes允許你掃描注入到容器中的環境變數。

如果你有在多個埠上執行的服務,你可以執行kubectl exec memcached-rm58b en命令,然後對服務名稱進行快速grep操作,之後將會顯示分配給該服務的可用IP地址和埠。不過,這並不是管理服務發現的最有效方法。因為,這種方法中依賴的服務必須在 pod 啟動之前就存在,不然是不會出現在環境變數中的。

Kube-DNS救場

長遠來看,以下闡述的第二種方法通常被認為效率更高,這得益於Kubernetes的外掛Kube-DNS。我們先來了解什麼是Kube-DNS。顧名思義,Kube-DNS是充當內部DNS解析器的附加元件。它是一個數據庫,其中包含用於查詢的鍵值對。鍵是Kubernetes服務的名稱,值是服務所執行的IP地址。

Kube-DNS僅依賴名稱空間,無需以其他方式配置Pod和服務,甚至無需修改叢集、Pod和服務的配置檔案即可進行基於DNS的服務發現。

Kube-DNS同時也支援高階DNS查詢以及DNS策略。例如,你可以對每個Pod進行配置,將其配置為遵循與其執行的節點不同的DNS屬性。這意味著你可以使用私有DNS空間來自定義pod之間如何進行通訊。

這一方法還能更進一步,在每個pod的基礎上配置DNS策略。你需要做的就是將節點DNS策略設定為“None”,然後手動配置每個Pod以滿足你的特定需求。

Label和Selectors

正如前文所述,你可以使用引數來進一步影響Pod之間和服務之間的通訊方式。Kubernetes服務發現支援對高階控制元件使用label和selector,特別是在管理複雜叢集時,label尤為方便。你可以將label分配給元件和容器,以便於識別。

Kubernetes處理label和selector的方式使得這些引數更易於使用。本質上,它們時新增到元資料中的簡單鍵值引數。也就是說,它們實際上並不會影響系統或環境中的其他部分,你可以在複雜的環境中跨pod和服務(甚至跨節點)自由使用label和selector。

接下來,我們要使用副本控制器。同樣,顧名思義,它是一個可以使Kubernetes的系統具有高可用性和可伸縮性的工具。你可以使用副本控制器來建立和管理pod副本並且維護高可用。同時,你也可以輕鬆地一次性刪除pod及其副本。

Service Mesh和高度彈性伸縮系統

要完成設定,我們需要使用與現有基礎架構和平臺相關的高階服務發現方法。AWS Cloud Map是一個十分有意思的例子。AWS環境中的應用程式資源可以擁有唯一的名稱,並且那些資源會被Cloud Map自動對映。它們註冊完成後,服務會自動變為可發現的,並且在啟動Pod或服務後立即進行註冊過程。

現在有一個新的方法,通過使用服務網格讓管理微服務的複雜陣列變得容易。服務網格標準化了服務和Pod的通訊方式。如果你要建立一個高可用的系統,那麼在環境中使用服務網格來維護Pod的可見性是一個完美的解決方案。

但是,如果你的環境在AWS上,則可以以AWS App Mesh的形式利用其服務網格功能。它會自動處理所有事情,包括流量路由、流量均衡、呼叫以及使用API呼叫的circuit breaking。所有微服務都能夠啟用API Mesh,以簡化管理。由於此工具是Amazon生態的一部分,因此它會自動和Amazon EKS、IAM等其他工具一起使用。

Kubernetes服務發現使得容器平臺具有強大功能以及靈活性,服務網格等方法無疑通過標準化使Kubernetes服務發現更加強大。只要服務在執行,就可以使正確的API呼叫在每個Pod之前來回傳遞資料而不會中斷