圖文詳解 Kubernetes,刺激…

最近,我開始了 Kubernetes 之旅,而且但願更好地瞭解其內部原理。我在這些方面作了一個演講!前端

容器java

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

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

「容器」是一個用來存放你放入的全部物品的容器。像應用程序代碼,依賴庫以及它的依賴關係一直到內核。數據庫

這裏的關鍵概念是隔離。將全部內容與其他內容隔離開,以便你更好地控制它們。後端

容器提供三種隔離類型:安全

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

考慮一下像 VM 同樣的容器。它們精簡,快速(啓動)且體積小。並且,全部這些都沒有構建起來。服務器

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

如今咱們知道什麼是容器了,很容易理解爲何它們很受歡迎。不只能夠分發應用程序的二進制/代碼,還能夠以實用的方式交付運行應用程序所需的整個環境。多線程

由於能夠將容器構建爲很是小的單元,解決「在個人機器上工做」問題的完美解決方案。

何時使用 Kubernetes?

容器一切都很好,軟件開發人員的生活如今要好不少。那麼,爲何咱們須要另外一項技術,如 Kubernetes 這樣的容器編排工具呢?

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

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

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

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

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

問:如何進行滾動升級?

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

爲何我更喜歡 Kubernetes

有不少容器編排工具,例如 Docker Swarm,Mesos 和 Kubernetes。個人選擇是 Kubernetes(所以有了本文),由於 Kubernetes 是……

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

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

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 和大使,能夠知足不一樣的需求。查看這篇文章[1]能夠了解有關它們的更多信息。

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

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

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

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

控制器

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

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

ReplicaSet

ReplicaSet 作本身擅長的事情,複製 Pod

該控制器的主要職責是建立給定 Pod 的副本,若是 Pod 因某種緣由死亡,則會通知該控制器,並當即跳入操做以建立新的 Pod。

Deployment

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

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

Service

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

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

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

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

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

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

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

Ingress

進入一個浮動平臺,全部數據包都經過該平臺流入集羣

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

PS:Kubernetes 中還有不少其餘控制器對象,例如 DaemonSets,StatefulSets 和 Jobs。

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

做者:劉志超
http://www.dockerchina.cn/?id=46

推薦去個人博客閱讀更多:

1.Java JVM、集合、多線程、新特性系列教程

2.Spring MVC、Spring Boot、Spring Cloud 系列教程

3.Maven、Git、Eclipse、Intellij IDEA 系列工具教程

4.Java、後端、架構、阿里巴巴等大廠最新面試題

生活很美好,明天見~

相關文章
相關標籤/搜索