什么是Kubernetes?


  剛剛進學校實驗室,第一次開會導師和小組同學說了n次Kubernetes,從來沒聽過,一臉懵逼。

       Kubernetes也有很多人把它叫K8S, 

原文鏈接:http://omerio.com/2015/12/18/learn-the-kubernetes-key-concepts-in-10-minutes/(翻譯:崔婧雯) 

什么是Kubernetes?

Kubernetes(k8s)是自動化容器操作的開源平台,這些操作包括部署,調度和節點集群間擴展。如果你曾經用過Docker容器技術部署容器,那么可以將Docker看成Kubernetes內部使用的低級別組件。Kubernetes不僅僅支持Docker,還支持Rocket,這是另一種容器技術。
使用Kubernetes可以:

  • 自動化容器的部署和復制
  • 隨時擴展或收縮容器規模
  • 將容器組織成組,並且提供容器間的負載均衡
  • 很容易地升級應用程序容器的新版本
  • 提供容器彈性,如果容器失效就替換它,等等...


實際上,使用Kubernetes只需一個部署文件,使用一條命令就可以部署多層容器(前端,后台等)的完整集群:

$ kubectl create -f single-config-file.yaml


kubectl是和Kubernetes API交互的命令行程序。現在介紹一些核心概念。

集群

集群是一組節點,這些節點可以是物理服務器或者虛擬機,之上安裝了Kubernetes平台。下圖展示這樣的集群。

1.png


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

  • Pod
  • Container(容器)
  • Label(label)(標簽)
  • Replication Controller(復制控制器)
  • Service(enter image description here)(服務)
  • Node(節點)
  • Kubernetes Master(Kubernetes主節點)

 

Pod

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

  • 如果Pod是短暫的,那么我怎么才能持久化容器數據使其能夠跨重啟而存在呢? 是的,Kubernetes支持的概念,因此可以使用持久化的卷類型。
  • 是否手動創建Pod,如果想要創建同一個容器的多份拷貝,需要一個個分別創建出來么?可以手動創建單個Pod,但是也可以使用Replication Controller使用Pod模板創建出多份拷貝,下文會詳細介紹。
  • 如果Pod是短暫的,那么重啟時IP地址可能會改變,那么怎么才能從前端容器正確可靠地指向后台容器呢?這時可以使用Service,下文會詳細介紹。

 

Lable

正如圖所示,一些Pod有Label(enter image description here)。一個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.如下面的動畫所示:

2.gif


如果之前不響應的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地址可能會改變,怎么才能從前端容器正確可靠地指向后台容器呢?

Service是定義一系列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的功能。注意該圖作了很多簡化。如果不進入網絡配置,那么達到透明的負載均衡目標所涉及的底層網絡和路由相對先進。

3.gif


有一個特別類型的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借鑒了Borg的設計理念,比如Pod、Service、Labels和單Pod單IP等。Kubernetes的整體架構跟Borg非常像,如下圖所示

 

 

Kubernetes主要由以下幾個核心組件組成:

  • etcd保存了整個集群的狀態;
  • apiserver提供了資源操作的唯一入口,並提供認證、授權、訪問控制、API注冊和發現等機制;
  • controller manager負責維護集群的狀態,比如故障檢測、自動擴展、滾動更新等;
  • scheduler負責資源的調度,按照預定的調度策略將Pod調度到相應的機器上;
  • kubelet負責維護容器的生命周期,同時也負責Volume(CSI)和網絡(CNI)的管理;
  • Container runtime負責鏡像管理以及Pod和容器的真正運行(CRI);
  • kube-proxy負責為Service提供cluster內部的服務發現和負載均衡;

除了核心組件,還有一些推薦的Add-ons:

  • kube-dns負責為整個集群提供DNS服務
  • Ingress Controller為服務提供外網入口
  • Heapster提供資源監控
  • Dashboard提供GUI
  • Federation提供跨可用區的集群

Kubernetes架構示意圖

整體架構

下圖清晰表明了kubernetes的架構設計以及組件之間的通信協議。

Kuberentes架構(圖片來自於網絡)圖片 - Kuberentes架構(圖片來自於網絡)

下面是更抽象的一個視圖:

kubernetes整體架構示意圖圖片 - kubernetes整體架構示意圖

Master架構

Kubernetes master架構示意圖圖片 - Kubernetes master架構示意圖

Node架構

kubernetes node架構示意圖圖片 - kubernetes node架構示意圖

分層架構

Kubernetes設計理念和功能其實就是一個類似Linux的分層架構,如下圖所示

Kubernetes分層架構示意圖圖片 - Kubernetes分層架構示意圖

  • 核心層:Kubernetes最核心的功能,對外提供API構建高層的應用,對內提供插件式應用執行環境
  • 應用層:部署(無狀態應用、有狀態應用、批處理任務、集群應用等)和路由(服務發現、DNS解析等)
  • 管理層:系統度量(如基礎設施、容器和網絡的度量),自動化(如自動擴展、動態Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
  • 接口層:kubectl命令行工具、客戶端SDK以及集群聯邦
  • 生態系統:在接口層之上的龐大容器集群管理調度的生態系統,可以划分為兩個范疇
    • Kubernetes外部:日志、監控、配置管理、CI、CD、Workflow、FaaS、OTS應用、ChatOps等
    • Kubernetes內部:CRI、CNI、CVI、鏡像倉庫、Cloud Provider、集群自身的配置和管理等


免責聲明!

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



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