以卡通的方式了解Kubernetes
最近,我開始了Kubernetes之旅,希望更好地了解其內部。 我在這些方面做了一個演講。
容器
在我們嘗試了解Kubernetes之前,讓我們花一點時間來澄清什么是容器以及它們為什么如此受歡迎。 畢竟,在不知道容器是什么的情況下談論容器編排器(Kubernetes)是毫無意義的。

Container
"容器"是一個用來存放您放入的所有物品的容器。
像應用程序代碼,依賴庫以及它的依賴關系一直到內核。 這里的關鍵概念是隔離。 將所有內容與其余內容隔離開,以便您更好地控制它們。 容器提供三種隔離類型
- Workspace工作區隔離(進程,網絡)
- 資源隔離(CPU,內存)
- 文件系統隔離(文件系統)
考慮一下像VM一樣的容器。 它們精簡,快速(啟動)且體積小。 而且,所有這些都沒有分離。 取而代之的是,他們使用linux系統中存在的構造(例如cgroups,namespace名稱空間)在其上構建了一個不錯的抽象。
現在我們知道什么是容器了,很容易理解為什么它們很受歡迎。 不僅可以發布應用程序二進制/代碼,還可以以實用的方式交付運行應用程序所需的整個環境,因為可以將容器構建為非常小的單元。 解決"在我的機器上工作"問題的完美解決方案
什么時候使用Kubernetes?
容器一切都很好,軟件開發人員的生活現在要好得多。 那么,為什么我們需要另一項技術,如Kubernetes這樣的容器協調器呢?

進入此狀態時,需要用到太多容器來管理
問:我的前端容器在哪里,我要在其中運行多少個容器? 使用容器協調器
問:如何使前端容器與新創建的后端容器對話?答:對IP進行硬編碼。 或者,使用容器協調器
問:如何進行滾動升級?答:在每個步驟中手動控制。 或者,使用容器協調器
為什么我更喜歡Kubernetes
有多個編排器,例如docker swarm,Mesos和Kubernetes。 我的選擇是Kubernetes(因此是本文),因為Kubernetes是……

……就像樂高積木一樣。 它不僅具有大規模運行容器協調器所需的組件,而且還具有使用自定義組件交換不同組件的靈活性。 你可以plugin一個自定義的調度程序。當需要一個新的資源類型,你可以編寫一個CRD(Custom Resource Definition客戶資源定義)。 此外,社區非常活躍,并且工具發展迅速。
Kubernetes體系結構

每個Kubernetes集群都有兩種類型的節點(機器)。 主節點(Master)和工作節點(Worker)。 顧名思義,Master是在運行有效負載(應用程序)的地方控制和監視群集。
群集可以與單個主節點一起使用。 但是最好擁有三個以實現高可用性(稱為HA群集)
讓我們仔細看一下主節點及其組成

etcd:數據庫,用于存儲有關kubernetes對象,其當前狀態,訪問信息和其他集群配置信息的所有數據
API服務器:RESTful API服務器,公開端點以操作集群。 主節點和工作節點中的幾乎所有組件都與該服務器通信以執行其職責
調度程序Scheduler :負責決定哪個有效負載需要在哪臺機器上運行
控制管理器Control Manager:這是一個控制循環,它監視群集的狀態(通過調用API服務器來獲取此數據)并采取措施將其置于預期狀態

kubelet:是工作程序節點的心臟。 它與主節點API服務器通信并運行為其節點安排的容器
kube代理 kubeproxy:使用IP表/ IPVS處理Pod的網絡需求
Pod:運行您所有容器的kubernetes的實體。 如果沒有Pod的抽象,就無法在kubernetes中運行容器。 Pod定義了對容器之間的聯網方式等至關重要的功能

Happy pod
一個Pod可以有多個容器,并且在這些容器中運行的所有服務器都可以將彼此視為本地主機。 這使得將應用程序的不同方面分離為單獨的容器,并可以方便的把它們全部作為一個整體加載。 有不同的Pod模式,例如邊車(Side Car),代理(Proxy)和大使(ambassador),可以滿足不同的需求。
Pod聯網接口提供了一種將其與同一節點和其他工作程序節點中的其他Pod聯網的機制

此外,每個Pod都將分配有自己的IP地址,kube-proxy會使用該IP地址來路由流量。 而且此IP地址僅在群集中可見
所有容器也可以看到安裝在Pod容器內的卷,有時這些卷可用于在容器之間進行異步通信。 例如,假設您的應用是照片上傳應用(例如instagram),它可以將這些文件保存在一個卷中,而同一容器中的另一個容器可以監視該卷中的新文件,并開始對其進行處理以創建多種尺寸, 將它們上傳到云存儲
控制器
在kubernetes中,有很多控制器,例如ReplicaSet,Replication Controllers,Deployments,StatefulSet和Service。 這些是以一種或另一種方式控制Pod對象。 讓我們看看一些重要的控制器。
復制集 ReplicaSet

ReplicaSet doing what it is good at. Replicating pods
該控制器的主要職責是創建給定Pod的副本。 如果Pod因某種原因死亡,則會通知該控制器,并立即采取行動以創建新的Pod
部署 Deployments

Deployment (with a messy hair) trying to control the ReplicaSet
部署是一個高階對象,它使用ReplicaSet來管理副本。 它通過放大新的ReplicaSet和縮小(最終刪除)現有的ReplicaSet來提供滾動升級。
服務 Service

Service represented as a drone delivering data packets to corresponding pods
服務是一個控制器對象,其主要職責是在將"數據包"分發到相應節點時充當負載平衡器。 基本上,它是一種控制器構造,用于在工作節點之間對相似的Pod(通常由Pod標簽標識)進行分組。
假設您的"前端"應用程序想與"后端"應用程序通信,則每個應用程序可能有許多正在運行的實例。 您不必擔心對每個后端Pod的IP進行硬編碼,而是將數據包發送到后端服務,然后由后端服務決定如何進行負載平衡并相應地轉發。
PS:請注意,服務更像是一個虛擬實體,因為所有數據包路由均由IP表/ IPVS / CNI插件處理。 它只是使它更容易被視為一個真正的實體,讓他們脫穎而出,以了解其在kubernetes生態系統中的作用。
入口 Ingress

Ingress a floating platform through which all the packets flow into the cluster
入口控制器是與外界聯系的單點,可以與集群中運行的所有服務進行對話。 這使我們可以輕松地在單個位置設置安全策略,監控甚至記錄日志
P.S:Kubernetes中還有很多其他控制器對象,例如DaemonSets,StatefulSets和Jobs。 還有一些諸如Secrets,ConfigMaps之類的對象,用于存儲應用程序的機密和配置。 我將在收到下一篇博客文章時介紹它們。