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核心功能的擴展,例如增加網絡和網絡策略等能力。
  • repliceation 用於伸縮副本數量
  • endpoint 用於管理網絡請求
  • scheduler 調度器

1、准備好一個包含應用程序的Deployment的yml文件,然后通過kubectl客戶端工具發送給ApiServer。

2、ApiServer接收到客戶端的請求並將資源內容存儲到數據庫(etcd)中。

3、Controller組件(包括scheduler、replication、endpoint)監控資源變化並作出反應。

4、ReplicaSet檢查數據庫變化,創建期望數量的pod實例。

5、Scheduler再次檢查數據庫變化,發現尚未被分配到具體執行節點(node)的Pod,然后根據一組相關規則將pod分配到可以運行它們的節點上,並更新數據庫,記錄pod分配情況。

6、Kubelete監控數據庫變化,管理后續pod的生命周期,發現被分配到它所在的節點上運行的那些pod。如果找到新pod,則會在該節點上運行這個新pod。

7、kuberproxy運行在集群各個主機上,管理網絡通信,如服務發現、負載均衡。例如當有數據發送到主機時,將其路由到正確的pod或容器。對於從主機上發出的數據,它可以基於請求地址發現遠程服務器,並將數據正確路由,在某些情況下會使用輪訓調度算法(Round-robin)將請求發送到集群中的多個實例。

 

 

Kubernetes及容器生態系統

 

 

典型的流程

創建Pod的整個流程,時序圖如下:


1. 用戶提交創建Pod的請求,可以通過API Server的REST API ,也可用Kubectl命令行工具,支持Json和Yaml兩種格式;

2. API Server 處理用戶請求,存儲Pod數據到Etcd;

3. Schedule通過和 API Server的watch機制,查看到新的pod,嘗試為Pod綁定Node;

4. 過濾主機:調度器用一組規則過濾掉不符合要求的主機,比如Pod指定了所需要的資源,那么就要過濾掉資源不夠的主機;

5. 主機打分:對第一步篩選出的符合要求的主機進行打分,在主機打分階段,調度器會考慮一些整體優化策略,比如把一個Replication Controller的副本分布到不同的主機上,使用最低負載的主機等;

6. 選擇主機:選擇打分最高的主機,進行binding操作,結果存儲到Etcd中;

7. kubelet根據調度結果執行Pod創建操作: 綁定成功后,會啟動container, docker run, scheduler會調用API Server的API在etcd中創建一個bound pod對象,描述在一個工作節點上綁定運行的所有pod信息。運行在每個工作節點上的kubelet也會定期與etcd同步bound pod信息,一旦發現應該在該工作節點上運行的bound pod對象沒有更新,則調用Docker API創建並啟動pod內的容器。

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


免責聲明!

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



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