K8s(Kubernetes)架構學習筆記

K8s滿足的需求

    K8s的主要職責是容器編排(Container Orchestration),即在一組服務器上啓動、監控、回收容器,在滿足排程的同時,保證容器可以健康的運行。

K8s架構的概念/術語

    學習K8s架構之前,需要了解一些K8s特有的概念:

  • Cluster 集羣 K8s可利用的主機、存儲和網絡資源的集合。
  • Node 結點 單臺主機,可以是物理的或虛擬的計算機。結點分爲主結點(master)和工作結點(worker)。
  • Pod K8s中的工作單元,K8s是以Pod而非容器爲單位排程的。Pod可以理解爲Docker單機環境,每個Pod中包含一至多個容器,總是被啓動在一個結點;一個Pod的容器在K8s集羣中有相同的地址和端口範圍,即容器暴露於K8s集羣的端口號不可重複。

K8s架構概覽

    K8s集羣由主結點工作結點兩類結點構成。其中主結點上運行着K8s Control Plane,控制並管理着整個K8s系統;工作結點上運行用戶實際部署到K8s應用。


    K8s的結點上運行着一些組件,共同協作以完成容器編排,其中主要的組件有:

  • etcd 一款開源軟件。提供可靠的分佈式數據存儲服務,用於持久化存儲K8s集羣的配置和狀態。
  • K8s API server 用戶程序(如kubectl)、K8s其它組件之間通信的接口。K8s其它組件之間不直接通信,而是通過API server通信的。這一點在上圖的連接中可以體現,例如,只有API server連接了etcd,即其它組件更新K8s集羣的狀態時,只能通過API server讀寫etcd中的數據。
  • Scheduler 排程組件,爲用戶應用的每一可部署組件分配工作結點。
  • Controller Manager 執行集羣級別的功能,如複製組件、追蹤工作結點狀態、處理結點失敗等。Controller Manager組件是由多個控制器組成的,其中很多控制器是按K8s的資源類型劃分的,如Replication Manager(管理ReplicationController 資源),ReplicaSet Controller,PersistentVolume controller。
  • kube-proxy 在應用組件間負載均衡網絡流量。
  • Kubelet 管理工作結點上的容器。
  • Container runtime Docker, rkt等實際運行容器的組件。

在K8s中運行一個容器應用

    下面通過運行一個容器應用的過程,來一起理解一下K8s組件是如何協作的。

    開發者開發一個應用後,打包Docker鏡像,上傳到Docker registry;然後編寫一個yaml部署描述文件,以描述應用的結構和資源需求。開發者通過kubectl(或其它應用),將部署描述文件提交到API server,API server將部署需求更新到etcd。etcd在K8s管理結點中的作用相當於數據庫,其它組件提交到API server的數據都存儲於etcd。API server非常輕量,並不會直接去創建或管理Pod等資源,在多數場景下甚至不會去主動調用其它的K8s組件發出指令。其它組件通過建立和API server的長連接,監視關心的對象,監視到變化後,執行所負責的操作。


    繼續我們的啓動應用之旅,如圖所示,Controller Manager中的控制器監視到新的部署描述後,根據部署描述,創建ReplicaSet、Pod等資源。Scheduler監視到新的Pod資源後,結合集羣的資源情況,選定一或多個工作結點運行Pod。工作結點上的Kubelet監視到有Pod被計劃在自己的結點後,向Docker等Container runtime發出啓動容器的指令,Docker engineer將按照指令從Docker registy拉取鏡像,然後啓動並運行容器。

K8s集羣的高可用部署

    通過之前的介紹,我們看到K8s可以在多個工作結點上啓動並管理容器,下面來學習一下,如何實現管理結點的高可用部署。


    上圖的K8s高可用部署中有3個管理結點。etcd自身是一個分佈式數據存儲系統,按照其多實例部署方案,結點只需在啓動時知道其它結點的IP和端口號即可組成高可用環境。和通常的應用服務器一樣,API Server是無狀態的,可以運行任意多個實例,且彼此之間無需互相知道。爲了能使kubectl等客戶端和Kubelet等組件連接到健康的API Server、減輕單臺API Server的壓力,需使用基礎架構提供的負載均衡器作爲多個API Server實例的入口。如上圖的部署方法,每個主結點上都運行了一個etcd實例,這樣API Server只需連接本地的etcd實例即可,無需再使用負載均衡器作爲etcd的入口。

    Controller Manager和Scheduler需要修改K8s集羣,同時修改時可能引發併發問題。假設兩個ReplicaSet Controller同時監視到需創建一個Pod,然後同時進行創建操作,就會創建出兩個Pod。K8s爲了避免這個問題,一組此類組件的實例將選舉出一個leader,僅有leader處於活動狀態,其它實例處於待命狀態。Controller Manager和Scheduler也可以獨立於API server部署,通過負載均衡器連接到多個API server實例。

參考資料

1. Mastering Kubernetes

2. Kubernetes in Action

發佈了44 篇原創文章 · 獲贊 35 · 訪問量 19萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章