初識Kubernetes(K8s):理論基礎

Kubernetes是什麼?
Kubernetes,簡稱K8s,是用8代替8個字符“ubernete”而成的縮寫。Kubernetes是Google開源的一個容器編排引擎,同時也是一個開源的容器集羣管理系統,可以實現容器應用的自動化部署、自動擴縮容、監控和維護等功能。

一、Kubernetes架構

Kubernetes最初源於谷歌內部的Borg,提供了面向應用的容器集羣部署和管理系統。Kubernetes的目標旨在消除編排物理/虛擬計算、網絡和存儲基礎設施的負擔,並使應用程序運營商和開發人員完全將重點放在以容器爲中心的原理上進行自助運營。
Kubernetes具備完善的集羣管理能力,包括多層次的安全防護和准入機制、多租戶應用支撐能力、透明的服務註冊和服務發現機制、內建負載均衡器、故障發現和自我修復能力、服務滾動升級和在線擴容、可擴展的資源自動調度機制、多粒度的資源配額管理能力。
Borg是谷歌內部的大規模集羣管理系統,負責對谷歌內部很多核心服務的調度和管理。Borg的目的是讓用戶能夠不必操心資源管理的問題,從而更專注於自己的核心業務。Borg甚至能做到跨多個數據中心的資源利用率最大化。
初識Kubernetes(K8s):理論基礎
Kubernetes屬於主從分佈式架構,主要由Master和Node組成,以及包括客戶端命令行工具kubectl和其它附加項。

Master:作爲控制節點,對集羣進行調度管理;由kube-apiserver、kube-scheduler、kube-controller-manager和etcd組成。
Node:作爲工作節點,運行業務應用的容器;由kubelet、kube-proxy和docker(或者rocket)組成。

二、Kubernetes組件

Master指的是集羣控制節點,每個Kubernetes集羣裏需要有至少一個Master來負責集羣的管理和控制。Master可以是一臺物理機,也可以是一臺虛擬機,Master節點上運行着以下組件:
kube-apiserver:提供了HTTP Rest接口的關鍵服務進程,是集羣裏所有資源的增、刪、改、查等操作的唯一入口,也是集羣的控制入口。
kube-controller-manager:運行管理控制器,是集羣中處理常規任務的後臺進程,每個Controller都負責一種具體的控制流程,而Controller Manager就是這些Controller的核心管理者。
kube-scheduler:負責資源調度(Pod調度)的進程,爲新創建的Pod選擇一個Node節點。
etcd:是kubernetes默認的存儲系統,集羣裏所有資源對象的數據全部保存在etcd中。

Node指的是集羣的工作節點,和Master一樣,可以是一臺物理主機,也可以是一臺虛擬機。每個Node都會被Master分配一些工作負載(Docker容器),當某個Node宕機時,其上的工作負載會被Master自動轉移到其他節點上去。Node上運行的組件如下:
kubelet:負責Pod對應的容器的創建、啓停等任務,同時與Master節點密切協作,實現集羣管理的基本功能。
kube-proxy:實現Kubernetes Service的通信與負載均衡機制的重要組件。
docker:容器引擎,負責本機的容器創建和管理工作。

三、Kubernetes對象

  • Pod
    Pod是Kubernetes集羣創建或部署的最基本、最小的單位,每個Pod裏運行着一個或多個容器,每個Pod裏都有一個特殊的被稱爲Pause的容器,其他容器則爲業務容器,這些業務容器共享Pause容器的網絡棧和Volume(存儲卷)。Kubernetes爲每個Pod都分配了唯一的IP地址,稱爲Pod IP,一個Pod裏的所有容器共享這一個Pod IP。
  • Service
    Service定義了這樣一種抽象:一個Pod的邏輯分組,一種可以訪問它們的策略。Service通常被稱爲微服務,定義了一個服務的訪問入口地址,前端的應用(Pod)通過這個入口訪問其背後的一組由Pod副本組成的集羣實例,Service與其後端Pod副本集羣之間通過Label Selector來實現通信。
  • Label
    標籤,一個Label就是一個key=value的鍵值對,由用戶自己指定。Label可以附加到各種資源對象上,例如Pod、Service等,一個資源對象可以定義任意數量的Label,同一個Label也可以被添加到任意數量的資源對象上去。Label通常在資源對象定義時確定,也可以在對象創建後動態添加或者刪除。
  • Volume
    存儲卷,與Docker的Volume比較類似,不同的是,Kubernetes中的Volume定義在Pod上,這個Pod裏的所有容器都可以將其掛載到具體的文件目錄下,實現容器間的資源共享。
  • Persistent Volume
    網絡存儲卷,與Volume不同的是,它是在Node之間共享資源,每個Node都可以掛載使用。Pod可通過定義一個PersistentVolumeClaim(PVC)對象,來使用Persistent Volume資源。
  • Name
    Kubernetes REST API中的所有對象都用Name和UID來明確地標識。Name在一個對象中同一時間只能擁有一個Name,如果對象被刪除,也可以使用相同的Name創建新的對象,Name用於在資源引用URL中的對象。
  • Namespace
    命名空間,很多情況下用於實現多租戶的資源隔離。Namespace通過將集羣內部的資源對象“分配”到不同的Namespace中,形成邏輯上分組的不同項目、小組或用戶組,便於不同的分組在共享使用整個集羣的資源的同時還能被分別管理。
  • Horizontal Pod Autoscaling
    簡稱HPA,是Kubernetes中實現Pod水平自動伸縮的功能。對於Pod集羣來說,HPA可以實現很多自動化功能,當Pod中業務負載上升的時候,可以創建新的Pod來保證業務系統穩定運行;當Pod中業務負載下降的時候,可以銷燬Pod來提高資源利用率。
  • Annotation
    註解,與Label類似,使用key/value鍵值對的形式進行定義。Annotation是用戶任意定義的“附加”信息,以便於外部工具進行查找。很多時候,Kubernetes的模塊自身會通過Annotation的方式標記資源對象的一些特殊信息。
  • ReplicaSet
    ReplicaSet(RS)是Replication Controller(RC)的升級版本,確保運行指定數量的Pod。RC與RS的唯一區別就是對Lable Selector的支持不同,RS支持新的基於集合的標籤,RC僅支持基於等式的標籤。
    當我們定義了一個RS並提交到Kubernetes集羣中,Master節點上的Controller Manager組件就得到通知,定期巡檢系統中當前存活的目標Pod,並確保目標Pod實例的數量剛好等於此RS的期望值,如果有過多的Pod副本在運行,系統就會停掉多餘的Pod;如果小於RS的期望值,系統就會自動創建一些新的Pod,使其目標Pod實例的數量等於RS的期望值。
  • Deployment
    Deployment爲Pod和ReplicaSet提供聲明式更新,通過它來管理Pod和ReplicaSet。當我們要部署一個Pod時,需要創建、調度、綁定節點和啓動容器這一完整過程,而Deployment就是負責這一整個部署過程的。
    Deployment的典型使用場景有以下幾個:
    創建一個Deployment對象來生成對應的ReplicaSet,並完成Pod副本的創建過程。
    檢查Deployment的狀態來查看部署工作是否完成(Pod副本的數量是否達到預期的值)。
    更新Deployment以創建新的Pod(比如鏡像升級)。
    如果當前Deployment不穩定,則回滾到一個早先的Deployment版本。
    掛起或者恢復一個Deployment。
  • StatefulSet
    StatefulSet爲Pod提供唯一標識,實現有序的部署、刪除和擴展。Deployment用於部署無狀態服務,StatefulSet用來部署有狀態服務。
    StatefulSet的使用場景如下:
    穩定性,唯一的網絡標識。
    穩定性,持久化存儲。
    有序的部署和擴展。
    有序的刪除和終止。
    有序的自動滾動更新。
  • DaemonSet
    DaemonSet能夠讓所有(或者特定)的Node節點運行同一個Pod。當節點加入到Kubernetes集羣中,Pod會被DaemonSet調度到該節點上運行,當節點從集羣中移除時,被DaemonSet調度到該節點上的Pod也會被移除。如果刪除DaemonSet,與DaemonSet相關的Pod都會被刪除。
  • Job
    僅執行一次的任務,任務執行完成後Pod銷燬,可批量處理一次性任務。還可以讓任務定時運行。

    四、總結

    上述這些組件都是Kubernetes系統的核心組件,它們共同構成了Kubernetes系統的框架和計算模型。通過對它們進行靈活組合,用戶就可以快速、方便地對容器集羣進行配置、創建和管理。除了本文所介紹的核心組件,Kubernetes中還有許多輔助配置的資源對象,例如LimitRange、ResourceQuota等。另外,還有一些系統內部使用的對象,例如Binding、Event等可參考官方API文檔。
    說在最後
    本人也是剛接觸Kubernetes(K8s),本文內容是摘自相關書籍和網上的相關資料,並結合自己的理解所寫的,如有理解錯誤的地方還請大家不吝指出,共同進步。
    由於國內關於Kubernetes的學習資料很少,51cto上倒是有相關的訂閱專欄,但都是要錢的,對於這個我不做評論。這裏向跟我一樣的初學者推薦一本書《Kubernetes權威指南(第2版)》,網上可以下載到PDF版本,雖然這本書講的Kubernetes的版本是1.3的,版本比較老,但對於初學者可以學習它的理論知識,並結合網上新版本的相關資料自行理解,也是一種非常不錯的學習方法。
    對Kubernetes(K8s)有興趣的朋友,可以關注我的博客,後面我會繼續發表學習Kubernetes的博文,歡迎各位朋友和我一起踏上Kubernetes(K8s)的旅程。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章