圖文詳解 Kubernetes

來源:http://www.dockerchina.cn/?id=46

最近,我開始了 Kubernetes 之旅,並且希望更好地瞭解其內部原理。我在這些方面做了一個演講!

容器

在我們嘗試瞭解 Kubernetes 之前,讓我們花一點時間來澄清容器是什麼,以及它們為什麼如此受歡迎。

畢竟,在不知道容器是什麼的情況下談論容器編排器(Kubernetes)是沒有意義的!

圖文詳解 Kubernetes

容器

“容器”是一個用來存放你放入的所有物品的容器。像應用程序代碼,依賴庫以及它的依賴關係一直到內核。

這裡的關鍵概念是隔離。將所有內容與其餘內容隔離開,以便你更好地控制它們。

容器提供三種隔離類型:

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

考慮一下像 VM 一樣的容器。它們精簡,快速(啟動)且體積小。而且,所有這些都沒有構建起來。

取而代之的是,他們使用 Linux 系統中存在的結構(例如 cgroups,namespaces)在其上構建了一個不錯的抽象。

現在我們知道什麼是容器了,很容易理解為什麼它們很受歡迎。不僅可以分發應用程序的二進制/代碼,還可以以實用的方式交付運行應用程序所需的整個環境。

因為可以將容器構建為非常小的單元,解決“在我的機器上工作”問題的完美解決方案。

什麼時候使用 Kubernetes?

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

圖文詳解 Kubernetes

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

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

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

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

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

問:如何進行滾動升級?

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

為什麼我更喜歡 Kubernetes

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

圖文詳解 Kubernetes

就像樂高積木一樣,它不僅具有大規模運行容器編排所需的組件,而且還具有使用自定義組件交換內部和外部不同組件的靈活性。

想要擁有一個自定義的調度程序,也很方便。需要具有新的資源類型,編寫一個 CRD。此外,社區非常活躍,並且工具迅速發展。

Kubernetes 架構

圖文詳解 Kubernetes

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

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

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

圖文詳解 Kubernetes

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

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

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

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

圖文詳解 Kubernetes

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

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

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

圖文詳解 Kubernetes

快樂的 Pod

一個 Pod 可以有多個容器,並且在這些容器中運行的所有服務器都可以將彼此視為本地主機。

這使得將應用程序的不同方面分離為單獨的容器,並將它們全部作為一個容器加載在一起非常方便。

有多種不同的 Pod 模式,例如 Sidecar,Proxy 和大使,可以滿足不同的需求。Pod 網絡接口提供了一種將其與同一節點和其他工作節點中的其他 Pod 通信的機制。

圖文詳解 Kubernetes

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

所有容器也都可以看到安裝在容器內的卷,有時可以使用這些卷在容器之間進行異步通信。

例如,假設你的應用是照片上傳應用(例如 Instagram),它可以將這些文件保存在一個卷中,而同一 Pod 中的另一個容器可以監視該卷中的新文件,並開始對其進行處理以創建多種尺寸,將它們上傳到雲存儲。

控制器

在 Kubernetes 中,有很多控制器,例如 ReplicaSet,Replication Controllers,Deployments,StatefulSets 和 Service。

這些是以一種或另一種方式控制 Pod 的對象。讓我們看一些重要的。

ReplicaSet

圖文詳解 Kubernetes

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

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

Deployment

圖文詳解 Kubernetes

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

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

Service

圖文詳解 Kubernetes

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

服務是一個控制器對象,其主要職責是在將“數據包”分發到相應節點時充當負載平衡器。

基本上,它是一種控制器構造,用於在工作節點之間對相似的 Pod(通常由 Pod 標籤標識)進行分組。

假設你的“前端”應用程序想與“後端”應用程序通信,則每個應用程序可能有許多正在運行的實例。

你不必擔心對每個後端 Pod 的 IP 進行硬編碼,而是將數據包發送到後端服務,然後由後端服務決定如何進行負載平衡並相應地轉發。

PS:請注意,服務更像是一個虛擬實體,因為所有數據包路由均由 IP 表/IPVS/CNI 插件處理。

它只是使它更容易被視為一個真正的實體,讓它們脫穎而出以瞭解其在 Kubernetes 生態系統中的作用。

Ingress

圖文詳解 Kubernetes

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

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

PS:Kubernetes 中還有很多其他控制器對象,例如 DaemonSets,StatefulSets 和 Jobs。

還有一些諸如 Secrets,ConfigMaps 之類的對象,用於存儲應用程序的機密和配置,後續文章會介紹它們。


分享到:


相關文章: