k8s整體架構以及描述

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核心功能的擴展,例如增加網絡和網絡策略等能力。

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

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

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

  • kube-dns負責爲整個集羣提供DNS服務
  • Ingress Controller爲服務提供外網入口
  • Heapster提供資源監控
  • Dashboard提供GUI
  • Federation提供跨可用區的集羣
  • Fluentd-elasticsearch提供集羣日誌採集、存儲與查詢

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:指定資源類型,資源類型是大小學敏感的,開發者能夠以單數、複數和縮略的形式。例如:

 
  1. $ kubectl get pod pod1

  2. $ kubectl get pods pod1 

  3. $ 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用戶界面。

分層架構

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

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

參考資料

  1. 《kubenetes Design and Architecture》地址:https://github.com/kubernetes/community/blob/master/contributors/design-proposals/architecture/architecture.md
  2. 《Overview of kubectl》地址:https://kubernetes.io/docs/reference/kubectl/overview/
  3. 《Installing Add-ons》地址:https://kubernetes.io/docs/concepts/cluster-administration/addons/
  4. 《Introducing Container Runtime Interface (CRI) in Kubernetes》地址:https://kubernetes.io/blog/2016/12/container-runtime-interface-cri-in-kubernetes/
  5. 《Alternative Container Runtimes in Kubernetes》地址:https://www.infoq.com/news/2017/04/alternative-kubernetes-runtimes
  6. 《Kubernetes CRI and Minikube》地址:https://sreeninet.wordpress.com/2017/02/11/kubernetes-cri-and-minikube/
  7. 《CRI: the Container Runtime Interface》地址:https://github.com/kubernetes/community/blob/master/contributors/devel/container-runtime-interface.md
  8. 《Frakti》地址:https://github.com/kubernetes/frakti
  9. 《docker、oci、runc以及kubernetes梳理》地址:https://www.cnblogs.com/xuxinkun/p/8036832.html
  10. 《Kubernetes Containerd集成進入GA階段》地址:https://www.sohu.com/a/233247128_198222
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章