1. 程式人生 > >整體概述和架構_Kubernetes中文社群

整體概述和架構_Kubernetes中文社群

1、Kubernetes是什麼

Kubernetes是一個輕便的和可擴充套件的開源平臺,用於管理容器化應用和服務。通過Kubernetes能夠進行應用的自動化部署和擴縮容。在Kubernetes中,會將組成應用的容器組合成一個邏輯單元以更易管理和發現。Kubernetes積累了作為Google生產環境執行工作負載15年的經驗,並吸收了來自於社群的最佳想法和實踐。Kubernetes經過這幾年的快速發展,形成了一個大的生態環境,Google在2014年將Kubernetes作為開源專案。Kubernetes的關鍵特性包括:

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

2、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核心功能的擴充套件,例如增加網路和網路策略等能力。

2 Master Node(主節點)

2.1 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)的堡壘和代理/通道。

2.2 Cluster state store(叢集狀態儲存)

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

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

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

2.4 Scheduler(排程器)

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

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

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

3、Worker Node(從節點)

3.1 Kubelet

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

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

3.2 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等。

3.3 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的功能,目前主要有網路、服務發現和視覺化這三大類的附加項,下面是可用的一些附加項:

4.4.1 網路和網路策略

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

4.4.2 服務發現

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

4.4.3 視覺化&控制

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

參考資料

  1. 《Introducing Container Runtime Interface (CRI) in Kubernetes》地址:https://kubernetes.io/blog/2016/12/container-runtime-interface-cri-in-kubernetes/
  2. 《Alternative Container Runtimes in Kubernetes》地址:https://www.infoq.com/news/2017/04/alternative-kubernetes-runtimes
  3. 《Kubernetes CRI and Minikube》地址:https://sreeninet.wordpress.com/2017/02/11/kubernetes-cri-and-minikube/
  4. 《CRI: the Container Runtime Interface》地址:https://github.com/kubernetes/community/blob/master/contributors/devel/container-runtime-interface.md
  5. 《Frakti》地址:https://github.com/kubernetes/frakti
  6. 《docker、oci、runc以及kubernetes梳理》地址:https://www.cnblogs.com/xuxinkun/p/8036832.html
  7. 《Kubernetes Containerd整合進入GA階段》地址:https://www.sohu.com/a/233247128_198222

作者簡介:
季向遠,北京神舟航天軟體技術有限公司產品經理。本文版權歸原作者所有。