1. 程式人生 > >Kubernetes(K8S)簡介

Kubernetes(K8S)簡介

Kubernetes(通常寫成“k8s”)是最開始由google設計開發最後貢獻給Cloud Native Computing Foundation的開源容器叢集管理專案。它的設計目標是在主機叢集之間提供一個能夠自動化部署、可拓展、應用容器可運營的平臺。Kubernetes通常結合docker容器工具工作,並且整合多個執行著docker容器的主機叢集。

歷史

Kubernetes( 來自希臘語κυβερνήτης:,意思為 “操舵員” 或者 “飛行員”)由Joe Beda, Brendan Burns 和Craig McLuckie建立,並在2014年被google公司首次對外公佈。它的發展和設計受到google的Borg系統的嚴重影響。Kubernetes專案的許多主要貢獻者來自Borg專案。在Google內部Kubernetes最開始的名字叫Serven of Nine,引用了電影“星際迷航”中通常被認為“更加友好”的“博格人”這個角色。由於google律師的反對,它的名字被重新命名為Kubernetes。從Kubernetes的logo上面那車輪上的七個幅條就能在一定程度上推斷出Kubernets最開始的名字是什麼。

2015年七月21日Kubernetes釋出了v1.0版本。隨著Kubernetes v1.0版本的釋出,Google和Linux基金會合作成立Cloud Native Computing Foundation(CNCF)並提議使Kubernetes成為種子技術。

Kubernetes還被RedHat使用於OpenShift產品。

特性

Kubernetes經過這幾年的快速發展,形成了一個大的生態環境,Google在2014年將Kubernetes作為開源專案。

Kubernetes的關鍵特性包括:

  • 自動化裝箱:在不犧牲可用性的條件下,基於容器對資源的要求和約束自動部署容器。同時,為了提高利用率和節省更多資源,將關鍵和最佳工作量結合在一起。
  • 自愈能力:當容器失敗時,會對容器進行重啟;當所部署的Node節點有問題時,會對容器進行重新部署和重新排程;當容器未通過監控檢查時,會關閉此容器;直到容器正常執行時,才會對外提供服務。
  • 水平擴容:通過簡單的命令、使用者介面或基於CPU的使用情況,能夠對應用進行擴容和縮容。
  • 服務發現和負載均衡:開發者不需要使用額外的服務發現機制,就能夠基於Kubernetes進行服務發現和負載均衡。
  • 自動釋出和回滾:Kubernetes能夠程式化的釋出應用和相關的配置。如果釋出有問題,Kubernetes將能夠迴歸發生的變更。
  • 保密和配置管理:在不需要重新構建映象的情況下,可以部署和更新保密和應用配置。
  • 儲存編排:自動掛接儲存系統,這些儲存系統可以來自於本地、公共雲提供商(例如:GCP和AWS)、網路儲存(例如:NFS、iSCSI、Gluster、Ceph、Cinder和Floker等)。

設計

Kubernetes定義了一套堆積木,這些堆積木統一提供部署、維護和擴充套件應用的機制。構成Kubernetes的這些元件讓Kubernetes變得一個鬆耦合可延伸的,因此它能滿足各種不同的工作負載。Kubernetes的延展性在很大程度上是由Kubernetes的API提供的,這些API被執行在Kubernetes的內部元件、延伸元件和容器使用。

Pods(豆莢)

Kubernetes中的基本排程單位叫“pod”。它增加了更高層的抽象來容納各種元件。一個pod由一個或者多個容器組成,這些容器能夠部署在同一臺物理主機上面,並能夠共享資源。Kubernetes中叢集內部的每一個pod被指定了唯一的IP地址,使用者程式可以通過相應的埠號無衝突地連線各個pod。pod能夠定義一個卷(volume),比如一個本地磁碟目錄或者一個網路磁碟,然後把它暴露給pod中的容器。使用者可以通過Kubernetes API手動管理pod,或者把管理工作交給一個管理器。

標籤和選擇器

Kubernetes可以讓客戶端(使用者或者內部元件)把被稱之為標籤的鍵值對依附在系統的任何API物件上,比如pods和“nodes”。相應地,”標籤選擇器”是針對標籤的查詢,這些標籤用於解決匹配物件問題。

標籤和選擇器是Kubernetes中的主要分組機制,用來決定哪個操作應用於哪個元件。

比如,如果一個應用的pod有一個系統標籤為:tier(“front-end“, “back-end“,) 和release_track(“canary“, “production“), 然後所有 “back-end” 和”canary“節點 上的操作都可以使用如下所示的標籤選擇器:

tier=back-end AND release_track=canary

控制器

一個控制器是一個調節迴路,通過管理一系列pod來驅動實際的叢集狀態變成所需的叢集狀態。一種控制器叫”複製控制器“,通過執行指定數目的跨叢集的pod副本來進行復制和擴充套件操作。如果底層的節點失敗了,它還能處理和建立用於替換的pod。其他的控制器是核心Kubernetes系統的一部分,包括一個執行在所有機器(或者所有機器的一些子集)但恰好一個pod上的”DaemonSet“控制器,以及一個執行pod直到結束的”Job“控制器(比如,作為批作業的一部分)。控制器所管理的那一系列pod由定義在控制器裡的部分標籤選擇器決定。

服務

一個Kubernetes服務是一系列工作在一起的pod,比如多層應用中其中的一層。這一系列pod構成了由標籤選擇器所定義的一個服務。Kubernetes提供了服務發現和請求路由的功能。請求路由是通過分配固定IP地址和DNS名字給服務。預設的,一個服務會在一個叢集內暴露(比如,後臺的pod會被分到一個服務中,來自前端的pods負載平衡他們之間的請求),但是,它也可以在一個叢集外暴露(比如,為客戶端訪問前端的pod)。

Kubernetes的整體架構

Kubernetes屬於主從分散式架構,主要由Master Node和Worker Node組成,以及包括客戶端命令列工具kubectl和其它附加項。

  • Master Node:作為控制節點,對叢集進行排程管理;Master Node由API Server、Scheduler、Cluster State Store和Controller-Manger Server所組成;
  • Worker Node:作為真正的工作節點,執行業務應用的容器;Worker Node包含kubelet、kube proxy和Container Runtime;
  • kubectl:用於通過命令列與API Server進行互動,而對Kubernetes進行操作,實現在叢集中進行各種資源的增刪改查等操作;
  • Add-on:是對Kubernetes核心功能的擴充套件,例如增加網路和網路策略等能力。

1.Master Node(主節點)

 API Server(API伺服器)

API Server主要用來處理REST的操作,確保它們生效,並執行相關業務邏輯,以及更新etcd(或者其他儲存)中的相關物件。API Server是所有REST命令的入口,它的相關結果狀態將被儲存在etcd(或其他儲存)中。API Server的基本功能包括:

  • REST語義,監控,持久化和一致性保證,API 版本控制,放棄和生效
  • 內建准入控制語義,同步准入控制鉤子,以及非同步資源初始化
  • API註冊和發現

另外,API Server也作為叢集的閘道器。預設情況,客戶端通過API Server對叢集進行訪問,客戶端需要通過認證,並使用API Server作為訪問Node和Pod(以及service)的堡壘和代理/通道。

 Cluster state store(叢集狀態儲存)

Kubernetes預設使用etcd作為叢集整體儲存,當然也可以使用其它的技術。etcd是一個簡單的、分散式的、一致的key-value儲存,主要被用來共享配置和服務發現。etcd提供了一個CRUD操作的REST API,以及提供了作為註冊的介面,以監控指定的Node。叢集的所有狀態都儲存在etcd例項中,並具有監控的能力,因此當etcd中的資訊發生變化時,就能夠快速的通知叢集中相關的元件。

Controller-Manager Server(控制管理伺服器)

Controller-Manager Serve用於執行大部分的叢集層次的功能,它既執行生命週期功能(例如:名稱空間建立和生命週期、事件垃圾收集、已終止垃圾收集、級聯刪除垃圾收集、node垃圾收集),也執行API業務邏輯(例如:pod的彈性擴容)。控制管理提供自愈能力、擴容、應用生命週期管理、服務發現、路由、服務繫結和提供。Kubernetes預設提供Replication Controller、Node Controller、Namespace Controller、Service Controller、Endpoints Controller、Persistent Controller、DaemonSet Controller等控制器。

Scheduler(排程器)

scheduler元件為容器自動選擇執行的主機。依據請求資源的可用性,服務請求的質量等約束條件,scheduler監控未繫結的pod,並將其繫結至特定的node節點。Kubernetes也支援使用者自己提供的排程器,Scheduler負責根據排程策略自動將Pod部署到合適Node中,排程策略分為預選策略和優選策略,Pod的整個排程過程分為兩步:

1)預選Node:遍歷叢集中所有的Node,按照具體的預選策略篩選出符合要求的Node列表。如沒有Node符合預選策略規則,該Pod就會被掛起,直到叢集中出現符合要求的Node。

2)優選Node:預選Node列表的基礎上,按照優選策略為待選的Node進行打分和排序,從中獲取最優Node。

2.Worker Node(從節點)

Kubelet

Kubelet是Kubernetes中最主要的控制器,它是Pod和Node API的主要實現者,Kubelet負責驅動容器執行層。在Kubernetes中,應用容器彼此是隔離的,並且與執行其的主機也是隔離的,這是對應用進行獨立解耦管理的關鍵點。

在Kubernets中,Pod作為基本的執行單元,它可以擁有多個容器和儲存資料卷,能夠方便在每個容器中打包一個單一的應用,從而解耦了應用構建時和部署時的所關心的事項,已經能夠方便在物理機/虛擬機器之間進行遷移。API准入控制可以拒絕或者Pod,或者為Pod新增額外的排程約束,但是Kubelet才是Pod是否能夠執行在特定Node上的最終裁決者,而不是scheduler或者DaemonSet。kubelet預設情況使用cAdvisor進行資源監控。負責管理Pod、容器、映象、資料卷等,實現叢集對節點的管理,並將容器的執行狀態彙報給Kubernetes API Server。

Container Runtime(容器執行時)

每一個Node都會執行一個Container Runtime,其負責下載映象和執行容器。Kubernetes本身並不停容器執行時環境,但提供了介面,可以插入所選擇的容器執行時環境。kubelet使用Unix socket之上的gRPC框架與容器執行時進行通訊,kubelet作為客戶端,而CRI shim作為伺服器。

protocol buffers API提供兩個gRPC服務,ImageService和RuntimeService。ImageService提供拉取、檢視、和移除映象的RPC。RuntimeSerivce則提供管理Pods和容器生命週期管理的RPC,以及與容器進行互動(exec/attach/port-forward)。容器執行時能夠同時管理映象和容器(例如:Docker和Rkt),並且可以通過同一個套接字提供這兩種服務。在Kubelet中,這個套接字通過–container-runtime-endpoint–image-service-endpoint欄位進行設定。Kubernetes CRI支援的容器執行時包括docker、rkt、cri-o、frankti、kata-containers和clear-containers等。

kube proxy

基於一種公共訪問策略(例如:負載均衡),服務提供了一種訪問一群pod的途徑。此方式通過建立一個虛擬的IP來實現,客戶端能夠訪問此IP,並能夠將服務透明的代理至Pod。每一個Node都會執行一個kube-proxy,kube proxy通過iptables規則引導訪問至服務IP,並將重定向至正確的後端應用,通過這種方式kube-proxy提供了一個高可用的負載均衡解決方案。服務發現主要通過DNS實現。

在Kubernetes中,kube proxy負責為Pod建立代理服務;引到訪問至服務;並實現服務到Pod的路由和轉發,以及通過應用的負載均衡。

3.kubectl

kubectl是Kubernetes叢集的命令列介面。執行kubectl命令的語法如下所示:

$ kubectl [command][TYPE][NAME][flags]

這裡的command,TYPE、NAME和flags為:

  • comand:指定要對資源執行的操作,例如create、get、describe和delete
  • TYPE:指定資源型別,資源型別是大小學敏感的,開發者能夠以單數、複數和縮略的形式。例如:
$ kubectl get pod pod1 
$ kubectl get pods pod1 
$ kubectl get po pod1
  • NAME:指定資源的名稱,名稱也大小寫敏感的。如果省略名稱,則會顯示所有的資源,例如:
 $kubectl get pods
  • flags:指定可選的引數。例如,可以使用-s或者–server引數指定Kubernetes API server的地址和埠。

另外,可以通過執行kubectl help命令獲取更多的資訊。

4.附加項和其他依賴

在Kunbernetes中可以以附加項的方式擴充套件Kubernetes的功能,目前主要有網路、服務發現和視覺化這三大類的附加項,下面是可用的一些附加項:

網路和網路策略

  • ACI 通過與Cisco ACI整合的容器網路和網路安全。
  • Calico 是一個安全的3層網路和網路策略提供者。
  • Canal 聯合Fannel和Calico,通過網路和網路側。
  • Cilium 是一個3層網路和網路側外掛,它能夠透明的加強HTTP/API/L7 策略。其即支援路由,也支援overlay/encapsultion模式。
  • Flannel 是一個overlay的網路提供者。

服務發現

  • CoreDNS 是一個靈活的,可擴充套件的DNS伺服器,它能夠作為Pod叢集內的DNS進行安裝。
  • Ingress 提供基於Http協議的路由轉發機制。

視覺化&控制

  • Dashboard 是Kubernetes的web使用者介面。