以圖形化的方式瞭解Kubernetes

1.容器

在我們嘗試瞭解Kubernetes之前,讓我們花一點時間來澄清容器是什麼,以及它們爲什麼如此受歡迎。畢竟,在不知道容器是什麼的情況下談論容器編排器(Kubernetes)是沒有意義的:)

 

                                                                                              容器

“容器”是一個用來存放你放入的所有物品的容器。

像應用程序代碼,依賴庫以及它的依賴關係一直到內核。這裏的關鍵概念是隔離。將所有內容與其餘內容隔離開,以便你更好地控制它們。容器提供三種隔離類型:

  • 工作區隔離(流程,網絡)

  • 資源隔離(CPU,內存)

  • 文件系統隔離(聯合文件系統)

考慮一下像VM一樣的容器。它們精簡,快速(啓動)且體積小。而且,所有這些都沒有構建起來。取而代之的是,他們使用Linux系統中存在的結構(例如cgroups,namespaces)在其上構建了一個不錯的抽象。

現在我們知道什麼是容器了,很容易理解爲什麼它們很受歡迎。不僅可以分發應用程序的二進制/代碼,還可以以實用的方式交付運行應用程序所需的整個環境,因爲可以將容器構建爲非常小的單元。解決“在我的機器上工作”問題的完美解決方案。

2. 什麼時候使用Kubernetes?

容器一切都很好,軟件開發人員的生活現在要好很多。那麼,爲什麼我們需要另一項技術,如Kubernetes這樣的容器編排工具呢?

 

當進入某個狀態時,你需要用到它來管理衆多容器。

問:我的前端容器在哪裏,我要運行幾個?

答:很難說,使用容器編排工具。

 

問:如何使前端容器與新創建的後端容器對話?

答:對IP進行硬編碼,或者,使用容器編排工具。

 

問:如何進行滾動升級?

答:在每個步驟中手動握住,或者,使用容器編排工具。

3.爲什麼我更喜歡Kubernetes

 

有很多容器編排工具,例如Docker Swarm,Mesos和Kubernetes。我的選擇是Kubernetes(因此有了本文),因爲Kubernetes是……

就像樂高積木一樣,它不僅具有大規模運行容器編排所需的組件,而且還具有使用自定義組件交換內部和外部交換不同組件的靈活性。想要擁有一個自定義的調度程序,也很方便。需要具有新的資源類型,編寫一個CRD。此外,社區非常活躍,並且工具迅速發展。

4.Kubernetes架構

 

每個Kubernetes集羣都有兩種類型的節點,主節點和工作節點。顧名思義,主節點是在工作程序運行有效負載(應用程序)的地方控制和監視羣集。

集羣可以與單個主節點一起工作,但是最好擁有三個以實現高可用性(稱爲HA羣集)。

讓我們仔細看一下主節點及其組成。

etcd:數據庫,用於存儲有關kubernetes對象,其當前狀態,訪問信息和其他集羣配置信息的所有數據。

API Server:RESTful API服務器,公開端點以操作整個集羣。主節點和工作節點中的幾乎所有組件都與該服務器通信以執行其職責。

調度程序:負責決定哪個有效負載需要在哪臺機器上運行。

控制管理器:這是一個控制循環,它監視集羣的狀態(通過調用API服務器來獲取此數據)並採取措施將其置於預期狀態。

 

 

kubelet:是工作節點的心臟。它與主節點API服務器通信並運行爲其節點安排的容器。

kube-proxy:使用IP表/IPVS處理Pod的網絡需求。

Pod:運行所有容器的Kubernetes的功勞。如果沒有Pod的抽象,就無法在kubernetes中運行容器。Pod添加了對容器之間的kuberenetes聯網方式至關重要的功能。

                                                                                       快樂的Pod

一個Pod可以有多個容器,並且在這些容器中運行的所有服務器都可以將彼此視爲本地主機。這使得將應用程序的不同方面分離爲單獨的容器,並將它們全部作爲一個容器加載在一起非常方便。有多種不同的Pod模式,例如sidecar,proxy和大使,可以滿足不同的需求。

Pod網絡接口提供了一種將其與同一節點和其他工作節點中的其他Pod通信的機制。

 

 

而且,每個Pod都將分配有自己的IP地址,kube-proxy將使用該IP地址來路由流量,而且此IP地址僅在羣集中可見。

所有容器也都可以看到安裝在容器內的卷,有時可以使用這些卷在容器之間進行異步通信。例如,假設你的應用是照片上傳應用(例如instagram),它可以將這些文件保存在一個卷中,而同一Pod中的另一個容器可以監視該卷中的新文件,並開始對其進行處理以創建多種尺寸,將它們上傳到雲存儲。

5.控制器

在Kubernetes中,有很多控制器,例如ReplicaSet,Replication Controllers,Deployments,StatefulSets和Service。這些是以一種或另一種方式控制Pod的對象。讓我們看一些重要的。

 

5.1 ReplicaSet

 

 

ReplicaSet做自己擅長的事情,複製Pod

該控制器的主要職責是創建給定Pod的副本,如果Pod因某種原因死亡,則會通知該控制器,並立即跳入操作以創建新的Pod。

5.2 Deployment

 

試圖控制ReplicaSet的部署(頭髮凌亂)

部署是一個高階對象,它使用ReplicaSet來管理副本。它通過放大新的ReplicaSet和縮小(最終刪除)現有的ReplicaSet來提供滾動升級。

5.3 Service

 

表示爲無人機的服務,將數據包傳遞到相應的Pod

服務是一個控制器對象,其主要職責是在將“數據包”分發到相應節點時充當負載平衡器。基本上,它是一種控制器構造,用於在工作節點之間對相似的Pod(通常由Pod標籤標識)進行分組。

假設你的“前端”應用程序想與“後端”應用程序通信,則每個應用程序可能有許多正在運行的實例。你不必擔心對每個後端Pod的IP進行硬編碼,而是將數據包發送到後端服務(service),然後由後端服務決定如何進行負載平衡並相應地轉發。

PS:請注意,服務更像是一個虛擬實體,因爲所有數據包路由均由IP表/IPVS/CNI插件處理。它只是使它更容易被視爲一個真正的實體,讓它們脫穎而出以瞭解其在Kubernetes生態系統中的作用。

5.4 Ingress

 

進入一個浮動平臺,所有數據包都通過該平臺流入集羣

入口控制器是與外界聯繫的單點,可以與集羣中運行的所有服務進行對話。這使我們可以輕鬆地在單個位置設置安全策略,監視甚至記錄日誌。

PS:Kubernetes中還有很多其他控制器對象,例如DaemonSets,StatefulSets和Jobs。還有一些諸如Secrets,ConfigMaps之類的對象,用於存儲應用程序的機密和配置。我將在下一篇博客文章介紹它們。

 

相關鏈接:

  1. https://matthewpalmer.net/kubernetes-app-developer/articles/multi-container-pod-design-patterns.html

原文鏈接:https://medium.com/tarkalabs/know-kubernetes-pictorially-f6e6a0052dd0

發佈了172 篇原創文章 · 獲贊 40 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章