摘要:如果沒有Pod的抽象,就不能在kubernetes中運行容器。那麼,爲什麼我們需要另一項技術,例如 Kubernetes 這樣的容器編排工具呢。

最近,我開始了 Kubernetes 之旅,希望更好地瞭解其內部。下面簡單介紹下吧!

容器

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

容器 :是一個用來存放您放入的所有物品的容器。

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

  • 工作區隔離(進程,網絡)
  • 資源隔離(CPU,內存)
  • 文件系統隔離(聯合文件系統)

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

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

什麼時候使用Kubernetes?

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

進入此狀態時,需要使用它,那裏的容器太多,無法管理

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

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

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

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

問:如何進行滾動升級?

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

爲什麼我更喜歡 Kubernetes

有多個編排工具,例如 docker swarmMesosKubernetes 。我的選擇是Kubernetes(因此是本文),因爲Kubernetes是……

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

Kubernetes 架構

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

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

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

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

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

Scheduler :負責決定哪些有效負載需要在哪臺機器上運行。

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

kubelet :是工作程序節點的心臟。它與主節點 API Server 通信,並負責該宿主機容器的啓停。

kube-proxy :使用 Iptables / IPVS 處理Pod的網絡需求,提供 Service 服務發現。

Pod :是 kubernetes 最小單元。如果沒有Pod的抽象,就不能在kubernetes中運行容器。Pod添加了對kuberenetes容器之間的聯網方式至關重要的功能。

一個 Pod 可以有多個容器,並且在這些容器中運行的所有服務都可以將彼此視爲本地主機。這使得將應用程序的不同方面分離爲單獨的容器,並將它們全部作爲一個容器加載在一起非常方便。有不同的吊艙模式,例如 Sidecar,Proxy 和 ambassador,可以滿足不同的需求。 查看本文以瞭解有關它們的更多信息

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

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

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

Controllers

在kubernetes中,有很多控制器,例如 ReplicaSetReplication ControllersDeploymentStatefulSetsService 。這些是以一種或另一種方式控制吊艙的對象。讓我們看一些重要的。

ReplicaSet

該控制器的主要職責是創建給定Pod的副本。如果某個吊艙因某種原因死亡,則會通知該控制器,並立即採取行動以創建新的吊艙。

Deployment

部署是一個高階對象,它使用 ReplicaSet 來管理副本。它提供了通過擴大滾動升級新 ReplicaSet 和比例下降(最終刪除)現有 ReplicaSet。

Service

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

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

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

Ingress

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

PS:Kubernetes 中還有許多其他控制器對象,例如 DaemonSetsStatefulSetsJobs 。還有一些諸如 SecretsConfigMaps 之類的對象,用於存儲應用程序的機密和配置。

相關文章