天天看點

Kubernetes核心概念

本文将會簡單介紹 Kubernetes 的核心概念。因為這些定義可以在Kubernetes的文檔中找到,是以文章也會避免用大段的枯燥的文字介紹。相反,我們會使用一些圖表(其中一些是動畫)和示例來解釋這些概念。我們發現一些概念(比如Service)如果沒有圖表的輔助就很難全面地了解。在合适的地方我們也會提供Kubernetes文檔的連結以便讀者深入學習。

什麼是Kubernetes?

Kubernetes(k8s)是自動化容器操作的開源平台,這些操作包括部署,排程和節點叢集間擴充。如果你曾經用過Docker容器技術部署容器,那麼可以将Docker看成Kubernetes内部使用的低級别元件。Kubernetes不僅僅支援Docker,還支援Rocket,這是另一種容器技術。

使用Kubernetes可以:

  • 自動化容器的部署和複制
  • 随時擴充或收縮容器規模
  • 将容器組織成組,并且提供容器間的負載均衡
  • 很容易地更新應用程式容器的新版本
  • 提供容器彈性,如果容器失效就替換它,等等...

實際上,使用Kubernetes隻需一個

部署檔案

,使用一條指令就可以部署多層容器(前端,背景等)的完整叢集:

 kubectl create -f single-config-file.yaml           

kubectl是和Kubernetes API互動的指令行程式。現在介紹一些核心概念。

叢集

叢集是一組節點,這些節點可以是實體伺服器或者虛拟機,之上安裝了Kubernetes平台。下圖展示這樣的叢集。注意該圖為了強調核心概念有所簡化。

這裡

可以看到一個典型的Kubernetes架構圖。

Kubernetes核心概念

上圖可以看到如下元件,使用特别的圖示表示Service和Label:

  • Pod
  • Container(容器)
  • Label(
    Kubernetes核心概念
    )(标簽)
  • Replication Controller(複制控制器)
  • Service(
    Kubernetes核心概念
    * Node(節點)
  • Kubernetes Master(Kubernetes主節點)

(上圖綠色方框)安排在節點上,包含一組容器和卷。同一個Pod裡的容器共享同一個網絡命名空間,可以使用localhost互相通信。Pod是短暫的,不是持續性實體。你可能會有這些問題:

  • 如果Pod是短暫的,那麼我怎麼才能持久化容器資料使其能夠跨重新開機而存在呢? 是的,Kubernetes支援 的概念,是以可以使用持久化的卷類型。
  • 是否手動建立Pod,如果想要建立同一個容器的多份拷貝,需要一個個分别建立出來麼?可以手動建立單個Pod,但是也可以使用Replication Controller使用Pod模闆建立出多份拷貝,下文會詳細介紹。
  • 如果Pod是短暫的,那麼重新開機時IP位址可能會改變,那麼怎麼才能從前端容器正确可靠地指向背景容器呢?這時可以使用Service,下文會詳細介紹。

Lable

正如圖所示,一些Pod有Label(

Kubernetes核心概念

)。一個Label是attach到Pod的一對鍵/值對,用來傳遞使用者定義的屬性。比如,你可能建立了一個"tier"和“app”标簽,通過Label(tier=frontend, app=myapp)來标記前端Pod容器,使用Label(tier=backend, app=myapp)标記背景Pod。然後可以使用

Selectors

選擇帶有特定Label的Pod,并且将Service或者Replication Controller應用到上面。

Replication Controller

是否手動建立Pod,如果想要建立同一個容器的多份拷貝,需要一個個分别建立出來麼,能否将Pods劃到邏輯組裡?

Replication Controller確定任意時間都有指定數量的Pod“副本”在運作。如果為某個Pod建立了Replication Controller并且指定3個副本,它會建立3個Pod,并且持續監控它們。如果某個Pod不響應,那麼Replication Controller會替換它,保持總數為3.如下面的動畫所示:

Kubernetes核心概念

如果之前不響應的Pod恢複了,現在就有4個Pod了,那麼Replication Controller會将其中一個終止保持總數為3。如果在運作中将副本總數改為5,Replication Controller會立刻啟動2個新Pod,保證總數為5。還可以按照這樣的方式縮小Pod,這個特性在執行滾動

更新

時很有用。

當建立Replication Controller時,需要指定兩個東西:

  1. Pod模闆 :用來建立Pod副本的模闆
  2. Label :Replication Controller需要監控的Pod的标簽。

現在已經建立了Pod的一些副本,那麼在這些副本上如何均衡負載呢?我們需要的是Service。

Service

如果Pods是短暫的,那麼重新開機時IP位址可能會改變,怎麼才能從前端容器正确可靠地指向背景容器呢?

是定義一系列Pod以及通路這些Pod的政策的一層抽象。Service通過Label找到Pod組。因為Service是抽象的,是以在圖表裡通常看不到它們的存在,這也就讓這一概念更難以了解。

現在,假定有2個背景Pod,并且定義背景Service的名稱為‘backend-service’,lable選擇器為(tier=backend, app=myapp)。backend-service 的Service會完成如下兩件重要的事情:

  • 會為Service建立一個本地叢集的DNS入口,是以前端Pod隻需要DNS查找主機名為 ‘backend-service’,就能夠解析出前端應用程式可用的IP位址。
  • 現在前端已經得到了背景服務的IP位址,但是它應該通路2個背景Pod的哪一個呢?Service在這2個背景Pod之間提供透明的負載均衡,會将請求分發給其中的任意一個(如下面的動畫所示)。通過每個Node上運作的代理(kube-proxy)完成。 有更多技術細節。

下述動畫展示了Service的功能。注意該圖作了很多簡化。如果不進入網絡配置,那麼達到透明的負載均衡目标所涉及的底層網絡和路由相對先進。如果有興趣,

有更深入的介紹。

Kubernetes核心概念

有一個特别類型的Kubernetes Service,稱為'

LoadBalancer

',作為外部負載均衡器使用,在一定數量的Pod之間均衡流量。比如,對于負載均衡Web流量很有用。

Node

節點(上圖橘色方框)是實體或者虛拟機器,作為Kubernetes worker,通常稱為Minion。每個節點都運作如下Kubernetes關鍵元件:

  • Kubelet:是主節點代理。
  • Kube-proxy:Service使用其将連結路由到Pod,如上文所述。
  • Docker或Rocket:Kubernetes使用的容器技術來建立容器。

Kubernetes Master

叢集擁有一個Kubernetes Master(紫色方框)。Kubernetes Master提供叢集的獨特視角,并且擁有一系列元件,比如Kubernetes API Server。API Server提供可以用來和叢集互動的REST端點。master節點包括用來建立和複制Pod的Replication Controller。

下一步

現在我們已經了解了Kubernetes核心概念的基本知識,你可以進一步閱讀Kubernetes 

使用者手冊

。使用者手冊提供了快速并且完備的學習文檔。

如果迫不及待想要試試Kubernetes,可以使用

Google Container Engine

。Google Container Engine是托管的Kubernetes容器環境。簡單注冊/登入之後就可以在上面嘗試示例了。