Kubernetes是一個輕便的和可擴展的開源平臺,用於管理容器化應用和服務。經過Kubernetes可以進行應用的自動化部署和擴縮容。在Kubernetes中,會將組成應用的容器組合成一個邏輯單元以更易管理和發現。Kubernetes積累了做爲Google生產環境運行工做負載15年的經驗,並吸取了來自於社區的最佳想法和實踐。Kubernetes通過這幾年的快速發展,造成了一個大的生態環境,Google在2014年將Kubernetes做爲開源項目。Kubernetes的關鍵特性包括:node
Kubernetes屬於主從分佈式架構,主要由Master Node和Worker Node組成,以及包括客戶端命令行工具kubectl和其它附加項。web
7. kubelet根據調度結果執行Pod建立操做: 綁定成功後,會啓動container, docker run, scheduler會調用API Server的API在etcd中建立一個bound pod對象,描述在一個工做節點上綁定運行的全部pod信息。運行在每一個工做節點上的kubelet也會按期與etcd同步bound pod信息,一旦發現應該在該工做節點上運行的bound pod對象沒有更新,則調用Docker API建立並啓動pod內的容器。算法
API Server主要用來處理REST的操做,確保它們生效,並執行相關業務邏輯,以及更新etcd(或者其餘存儲)中的相關對象。API Server是全部REST命令的入口,它的相關結果狀態將被保存在etcd(或其餘存儲)中。API Server的基本功能包括:docker
另外,API Server也做爲集羣的網關。默認狀況,客戶端經過API Server對集羣進行訪問,客戶端須要經過認證,並使用API Server做爲訪問Node和Pod(以及service)的堡壘和代理/通道。數據庫
Kubernetes默認使用etcd做爲集羣總體存儲,固然也可使用其它的技術。etcd是一個簡單的、分佈式的、一致的key-value存儲,主要被用來共享配置和服務發現。etcd提供了一個CRUD操做的REST API,以及提供了做爲註冊的接口,以監控指定的Node。集羣的全部狀態都存儲在etcd實例中,並具備監控的能力,所以當etcd中的信息發生變化時,就可以快速的通知集羣中相關的組件。後端
Controller-Manager Serve用於執行大部分的集羣層次的功能,它既執行生命週期功能(例如:命名空間建立和生命週期、事件垃圾收集、已終止垃圾收集、級聯刪除垃圾收集、node垃圾收集),也執行API業務邏輯(例如:pod的彈性擴容)。控制管理提供自愈能力、擴容、應用生命週期管理、服務發現、路由、服務綁定和提供。Kubernetes默認提供Replication Controller、Node Controller、Namespace Controller、Service Controller、Endpoints Controller、Persistent Controller、DaemonSet Controller等控制器。api
scheduler組件爲容器自動選擇運行的主機。依據請求資源的可用性,服務請求的質量等約束條件,scheduler監控未綁定的pod,並將其綁定至特定的node節點。Kubernetes也支持用戶本身提供的調度器,Scheduler負責根據調度策略自動將Pod部署到合適Node中,調度策略分爲預選策略和優選策略,Pod的整個調度過程分爲兩步:安全
1)預選Node:遍歷集羣中全部的Node,按照具體的預選策略篩選出符合要求的Node列表。如沒有Node符合預選策略規則,該Pod就會被掛起,直到集羣中出現符合要求的Node。服務器
2)優選Node:預選Node列表的基礎上,按照優選策略爲待選的Node進行打分和排序,從中獲取最優Node。網絡
Kubelet是Kubernetes中最主要的控制器,它是Pod和Node API的主要實現者,Kubelet負責驅動容器執行層。在Kubernetes中,應用容器彼此是隔離的,而且與運行其的主機也是隔離的,這是對應用進行獨立解耦管理的關鍵點。
在Kubernets中,Pod做爲基本的執行單元,它能夠擁有多個容器和存儲數據卷,可以方便在每一個容器中打包一個單一的應用,從而解耦了應用構建時和部署時的所關心的事項,已經可以方便在物理機/虛擬機之間進行遷移。API准入控制能夠拒絕或者Pod,或者爲Pod添加額外的調度約束,可是Kubelet纔是Pod是否可以運行在特定Node上的最終裁決者,而不是scheduler或者DaemonSet。kubelet默認狀況使用cAdvisor進行資源監控。負責管理Pod、容器、鏡像、數據卷等,實現集羣對節點的管理,並將容器的運行狀態彙報給Kubernetes API Server。
每個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等。
基於一種公共訪問策略(例如:負載均衡),服務提供了一種訪問一羣pod的途徑。此方式經過建立一個虛擬的IP來實現,客戶端可以訪問此IP,並可以將服務透明的代理至Pod。每個Node都會運行一個kube-proxy,kube proxy經過iptables規則引導訪問至服務IP,並將重定向至正確的後端應用,經過這種方式kube-proxy提供了一個高可用的負載均衡解決方案。服務發現主要經過DNS實現。
在Kubernetes中,kube proxy負責爲Pod建立代理服務;引到訪問至服務;並實現服務到Pod的路由和轉發,以及經過應用的負載均衡。
kubectl是Kubernetes集羣的命令行接口。運行kubectl命令的語法以下所示:
$ kubectl [command] [TYPE] [NAME] [flags]
這裏的command,TYPE、NAME和flags爲:
$ kubectl get pod pod1 $ kubectl get pods pod1 $ kubectl get po pod1
$kubectl get pods
另外,能夠經過運行kubectl help命令獲取更多的信息。
在Kunbernetes中能夠以附加項的方式擴展Kubernetes的功能,目前主要有網絡、服務發現和可視化這三大類的附加項,下面是可用的一些附加項: