k8s-總體概述和架構

一、Kubernetes是什麼

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

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

二、Kubernetes的總體架構

 

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

  • 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 調度器

一、準備好一個包含應用程序的Deployment的yml文件,而後經過kubectl客戶端工具發送給ApiServer。

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

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

四、ReplicaSet檢查數據庫變化,建立指望數量的pod實例。

五、Scheduler再次檢查數據庫變化,發現還沒有被分配到具體執行節點(node)的Pod,而後根據一組相關規則將pod分配到能夠運行它們的節點上,並更新數據庫,記錄pod分配狀況。

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

七、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的基本功能包括:docker

  • 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等控制器。api

2.4 Scheduler(調度器)

scheduler組件爲容器自動選擇運行的主機。依據請求資源的可用性,服務請求的質量等約束條件,scheduler監控未綁定的pod,並將其綁定至特定的node節點。Kubernetes也支持用戶本身提供的調度器,Scheduler負責根據調度策略自動將Pod部署到合適Node中,調度策略分爲預選策略和優選策略,Pod的整個調度過程分爲兩步:安全

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

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

三、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的路由和轉發,以及經過應用的負載均衡。

三、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用戶界面。
相關文章
相關標籤/搜索