Docker(二):理解容器編排工具Kubernetes內部工作原理


一、Kubernetes是什么

  要說到Docker就不得不說說Kubernetes。當Docker容器在微服務的環境下數量一多,那么統一的,自動化的管理自然少不了。而Kubernetes就是一個這樣的工具,它不僅僅提供了健康檢查和自修復,還有自動擴容縮容,以及服務發現和負載均衡等等功能。總的來說它使我們對於大量的Docker容器管理更加的方便

二、Kubernetes整體架構圖及對應功能分析

 

  1、kubectl:這是相當於用戶客戶端一樣,也是我們較常使用的命令行工具,通過這個工具可以發起對應的請求到master節點中,當然自己開發的客戶端同樣可以通過HTTP協議發起對應的RESTAPI請求訪問APIServer

  2、Master:Master節點是整個Kubernetes的核心節點,主要職責是負責調度,即應用放在哪里運行,同樣為了高可用可運行多個Master。而Master中主要有APIServer,ControllerManager,Scheduler,Etcd,Kube-dns。對應的職責分別如下:

  2.1、APIServer:提供了資源操作的唯一入口,注意其他節點是無法被外面請求操作的(不是說內部運行的容器無法被訪問,而是說無法通過發請求的方式直接操作Node),只有Master節點才能接受外面的請求進行操作Node節點,其中主要提供了認證、授權、訪問控制整個集群。而dashboard是提供了一個展示界面。

  2.2、Scheduler:負責資源的調度,根據一定的調度策略,將對應Node上面的Pod運行起來。

  2.3、ControllerManager:負責維護集群的狀態,比如故障檢測,擴縮容,滾動更新。在Pod運行起來,就由ControllerManager負責管理其狀態

  2.4、ETCD用於一致性存儲,保存pod,service等等的Kubernetes狀態。這里可以理解為MySQL在我們日常項目中的存儲作用,只要是用於存取Kubernetes中所有的持久化數據。

  2.5、Kube-dns:DNS組件負責整個集群的DNS服務。使得內部Pod相互之間可通過名字訪問。有了這個功能就不需要寫繁瑣的IP地址,通過服務的名字即可訪問對方。

  3、Node:理解為分支節點主要作用在於提供Kubernetes運行時的環境,以及維護Pod。內部主要有Kubblet,kube-proxy,docker等

  3.1、Kubblet:通過Master發送的請求到Node分支上的Kubblet,然后就由Kubblet負責維護當前節點上容器的生命周期,也負責維護當前節點的數據卷及網絡。

  3.2、Kube-proxy:提供內部的服務發現和負載均衡。可以在圖上看見虛線框起來的三個框,可以認為這三個Pod算是一個服務,即service,而外部可通過Kube-proxy暴露的端口來進行統一的訪問。並且默認是使用輪詢的負載均衡策略來訪問

三、Pod詳解

  Pod作為Kubernetes的核心資源,這里單獨拿出來解釋。在Kubernetes集群中,Pod是所有業務類型的基礎,它是一個或多個容器的組合,也就是Pod內部可以有多個Docker容器存在,不是一個Pod代表一個容器,注意區分概念。在其中的這些容器共享存儲、網絡和命名空間,以及如何運行的規范。在Pod中,所有容器都被同一安排和調度,並運行在共享的上下文中。對於具體應用而言,Pod是它們的邏輯主機,Pod包含業務相關的多個應用容器。這些容器可以通過localhost發現彼此。每一個Pod有自己的一個IP地址。

  1、Pod工作方式

    在Kubernetes中一般不會直接創建一個獨立的Pod,這是因為Pod是臨時存在的一個實體。當直接創建一個獨立的Pod時,如果缺少資源或者所被調度到的Node失敗,則Pod會直接被刪除。這里需要注意的是,重起Pod重起Pod中的容器不是一個概念,Pod自身不會運行,它只是容器所運行的一個環境。Pod本身沒有自愈能力,如果Pod所在的Node失敗,或者如果調度操作本身失敗,則Pod將會被刪除;同樣的,如果缺少資源,Pod也會失敗。Kubernetes使用高層次的抽象,即控制器來管理臨時的Pod。通過控制器能夠創建和管理多個Pod,並在集群范圍內處理副本、部署和提供自愈能力。

  2、重啟策略

    Pod既然內部運行着容器,那么免不了會因為異常等原因導致其終止退出,Pod支持三種重啟策略,需要在配置文件中通過restartPolicy字段設置重啟策略:

    Always:只要退出就會重啟

    OnFailure:只有在失敗退出(即exit code不等於0時),才會重啟

    Never:只要退出就不再重啟

  3、鏡像拉取策略

    前一篇博客有講容器與鏡像的概念,在Kubernetes中運行容器時,需要為容器獲取鏡像。Pod中容器的鏡像有三個來源,即Docker公共鏡像倉庫、私有鏡像倉庫和本地鏡像。當在內網使用的Kubernetes場景下,就需要搭建和使用私有鏡像倉庫。Pod支持三種鏡像拉取策略,在配置文件中通過imagePullPolicy字段設置鏡像拉取策略:

    Always:不管本地是否存在鏡像都會進行一次拉取

    Never:不管本地是否存在鏡像都不會進行拉取

    IfNotPresent:僅在本地鏡像不存在時,才會進行鏡像拉取

  這里有需要注意的點:鏡像拉取策略的默認值IfNotPresent,但:lastest標簽的鏡像默認為Always。所以生產環境中避免使用:lastest標簽。還有就是拉取鏡像時docker會進行校驗,如果鏡像中的MD5碼沒有變,則不會拉取鏡像數據。

  4、資源限制

    Kubernetes通過cgroups來限制容器的CPU和內存等計算資源,在創建Pod時,可以為Pod中的每個容器設置資源請求(request)和資源限制(limit),資源請求是容器需要的最小資源要求,資源限制為容器所能使用的資源上限。CPU的單位是核(core),內存(Memory)的單位是字節(byte)。

  5、終止Pod

    在集群中,Pod代表運行的進程,但不再需要這些進程時,如何優雅的終止這些進程是非常重要的。當用戶請求刪除一個Pod時,Kubernetes將會發送一個終止信號給每個容器,一旦過了優雅期,就會發送kill信號,從而通過APIServer刪除Pod。通常默認的優雅退出時間為30s。緩慢關閉的Pod依然可以對外繼續服務,直到負載均衡器將其移除,當超過優雅的退出時間,在Pod中任何正在運行的進程都會被kill。

四、Pod的生命周期

  1、Pending

    Pod已經被Kubernetes系統接受,但是還有一個或者多個容器鏡像未被創建。這包括Pod正在被調度和從網絡上下載鏡像的時間。

  2、Running

    Pod已經被綁定到了一個Node,所有容器已經被創建,至少有一個容器在運行

  3、Succeeded

    在Pod中所有容器已經被成功停止,並且不再重啟

  4、Failed

    在Pod中所有容器已經被終止,並且至少有一個容器是非正常終止的,即容器以非零狀態退出或者被系統強行終止的。

  5、Unknown

    Pod在某些原因下不能被獲取。通常是網絡問題。

五、service圖

  前面有說到Docker目前在微服務架構運行的很廣泛,而Kubernetes作為編排Docker容器的強大工具自然是我們的首選。而Kubernetes又是怎么和微服務結合起來的呢?

 

  上面有說到Pod擁有自己的IP地址,實際上在Pod外面還包裹着一層Service,這個Service是邏輯存在的,在最上面的架構圖中就類似kube-proxy串在一起的三個Pod,而service的IP是由kube-proxy給我們提供。這就是與微服務之間能夠連起來了。其中同一個service的Pod應該是相同的,kube-proxy會自動給我們做負載均衡,默認使用輪詢。同樣與Docker不相同的是Pod之間是可以通過名字直接訪問的,Node同樣也是,這就為我們的服務調用提供了很便利的方式。

六、總結

  Kubernetes是一個容器編排及其自動化管理的工具。隨着業務增長Docker容器越來越多,如果需要每一個自己手動管理,那么將會翻倍的增加我們的工作量。所以Kubernetes是我們在學習Docker中需要進階的知識。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM