天天看點

Kubernetes叢集中的重要對象(資源)一覽

Kubernetes對象也被稱為資源,就是Kubernetes叢集中的各種可持久化實體,如Deployment,Pod,Service等。

從Kubernetes叢集的角度,任何Kubernetes對象都有如下兩個側面:

  • spec,表示Kubernetes對象期望的狀态,往往通過YAML配置檔案給出
  • status,表示Kubernetes對象在目前叢集中實際的狀态,往往通過資源的Controller控制

事實上,Kubernetes叢集的狀态,就是通過大量Kubernetes對象的status表示出來的。

首先通過YAML檔案定義Kubernetes對象的期望狀态,然後調用Kubernetes API,将YAML檔案作為參數交給Kubernetes叢集,Kubernetes叢集根據YAML檔案建立必要的Kubernetes對象,以滿足spec的期望。此後,Kubernetes的Master通過各種Controllers保證Kubernetes對象的status與spec一緻。

1. Kubernetes Workload對象

1) Deployment

一個Deployment就是Kubernetes中運作着的一個應用,可能由一個或多個Pods組成,其中的每個Pod就是一個應用副本。

通過Deployment,一個應用可以被安裝部署多次,每次部署都在Nodes上生成一定數量的應用執行個體。即一個應用可以有多個應用執行個體,每個應用執行個體有一個唯一的名字。

通過Deployment,可以實作應用的滾動更新,逐漸替換容器鏡像。

2) Pod

Pod是Kubernetes叢集負責建立、管理的,可部署的、可水準擴充的、可建立副本的最小計算單元。

一個Pod可以被視為一個靈活排程的邏輯主機,擁有唯一的IP和hostname。但是其IP和hostname對Kubernetes叢集外部是不可見的。

Pod的IP在叢集内部是唯一的,是以叢集中的Pod對任何其他Pod都是可見的,無論這些Pods在哪個Node上。登入到任意一個Node上,都可以ssh通路任何一個Pod(通過Pod的IP,無需Pod的端口)。

通常,一個Pod隻包含一個容器執行個體。Pod的hostname就是Pod内部的容器執行個體的hostname。

個别情況下,一個Pod也可以包含若幹個聯系密切的容器執行個體。這些容器執行個體彼此不同,但是作為一個整體代表一個應用。Pod中的容器執行個體,共享上下文環境(如Linux namespaces, cgroups等)、網絡(共用Pod的hostname,IP和對外開放的端口)、存儲。是以,在Pod内部,容器之間彼此通過localhost即可互相通路。但是不同Pod的容器執行個體之間的通路,隻能通過Pod的IP和端口,以及Pod的端口映射到容器執行個體的端口實作。容器執行個體之間共享存儲volumes作為Pod的組成部分,可以被mount到應用的檔案系統

通常,使用者不應該直接建立Pod,而是通過Controllers建立Pod(有多個Controllers可以建立Pod),如通過建立Deployment建立Pod。

3) Service

Service是一個抽象通路層,能夠将一組Pods以一定的Policy暴露出來響應服務請求,同時實作請求在多個Pods之間的負載均衡。通過YAML/JSON定義,将擁有指定Labe的Pods歸入到一個Service。

因為Pod是短暫的、動态産生和消亡的,是以不能直接暴露出來。Service的CLUSTER-IP是虛拟的IP(Virtual IP, VIP),隻要服務存在,該IP就不變。因而可以将Service的CLUSTER-IP暴露給請求。

Service的Port也是一個抽象端口,通過該端口的請求被映射到對應的Endpoint,轉發給Pod中的容器執行個體進行處理。

Service的Endpoints通常是一組Pods的通路資訊,包括Pod的IP及Pod中容器的端口,以<pod_IP>:<targetPort>表示。

Service的4個類型(type):

  • ClusterIP(預設),服務隻有一個叢集内部可通路的CLUSTER-IP,隻能供叢集内部通路
  • NodePort,通過<Node_IP>:<NodePort>,可供叢集外部通路
  • LoadBalancer,通過外部雲提供者的負載均衡器,将服務直接暴露給叢集外部
  • ExternalName,一個叢集外部的獨立服務,通過--external-name屬性被聲明到Kubernetes叢集中

Service的類型不同,有的Service隻暴露給Kubernetes叢集内部的其他應用;有的Service還能夠暴露給Kubernetes叢集外部的應用。

2. Kubernetes Metadata對象

1) Name

唯一标志

2) Namespace

為Name設定了一個有效的範圍,僅适合有大量使用者的Kubernetes叢集。

Namespace用于區分使用者,Name隻需要在Namespace中唯一即可。

但是,Namespace不用于區分Kubernetes叢集中的資源,通過Label區分Kubernetes叢集中的資源。

Kubernetes叢集中初始預設的3個Namespace:

  • default,未指明Namespace的任何使用者建立的Kubernetes對象
  • kube-system,Kubernetes系統建立的對象
  • kube-public,所有使用者(包括未授權使用者)都可讀的Kubernetes對象

此外,不屬于任何Namespace的Kubernetes對象:

  • Namespace本身不屬于任何Namespace
  • Node
  • persistentVolume

3) UID

唯一标志

4) Label

Label是一組鍵值對,附加到Kubernetes對象上的标志性資訊(identifying information)。

相對于使用者,Label用以區分Kubernetes資源(通過貼标簽),用于後續的分組和排序。相對于Kubernetes系統,Label沒有任何意義。

5) Annotation

Annotation是一組鍵值對,附加到Kubernetes對象上的非标志性資訊(Non-identifying information)。

Annotation相對于使用者,用以補充說明Kubernetes資源(通過貼标簽)。Annotation相對于Kubernetes系統,沒有任何意義

3. Kubernetes Storage對象

1) Volume

Pod級别的存儲

2) PersistentVolume/PersistentVolumeClaim

叢集級别的存儲

參考連結:

https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/

繼續閱讀