Kubernetes 是 Google 基於 Borg 開源的容器編排調度,用於管理容器集羣自動化部署、擴容以及運維的開源平臺。做爲雲原生計算基金會 CNCF(Cloud Native Computing Foundation)最重要的組件之一(CNCF 另外一個畢業項目 Prometheus ),它的目標不只僅是一個編排系統,而是提供一個規範,可讓你來描述集羣的架構,定義服務的最終狀態,Kubernetes 能夠幫你將系統自動地達到和維持在這個狀態,Kubernetes 也能夠對容器(Docker)進行集羣管理和服務編排(Docker Swarm 相似的功能),對於大多開發者來講,以容器的方式運行一個程序是一個最基本的需求,跟多的是 Kubernetes 可以提供路由網關、水平擴展、監控、備份、災難恢復等一系列運維能力(強烈建議閱讀官方文檔)。html
使用 Kubernetes,能夠快速高效地響應客戶需求:nginx
Kubernetes 這個名字源自希臘語,意思是「舵手」,也是「管理者」,「治理者」等詞的源頭。k8s 是 Kubernetes 的簡稱(用數字『8』替代中間的8個字母『ubernete』)。git
下面是一些關鍵點:github
Kubernetes 不是 PaaS(平臺即服務)後端
Kubernetes 集羣能夠部署在物理機或虛擬機上,用於協調高度可用的計算機集羣,這些計算機羣集被鏈接做爲單個單元工做。 Kubernetes 的抽象性容許您將容器化的應用程序部署到集羣,而沒必要專門將其綁定到單個計算機。爲了利用這種新的部署模型,應用程序須要以將它們與各個主機分離的方式打包: 它們須要被容器化。容器化應用程序比過去的部署模型更靈活和可用,其中應用程序直接安裝到特定機器上,做爲深刻集成到主機中的軟件包。api
Kubernetes 集羣由兩種類型的資源組成:安全
Master 負責管理集羣,Node 協調集羣中的全部活動,例如調度應用程序、維護應用程序的所需狀態、擴展應用程序和滾動更新。每一個工做節點都有一個 Kubelet,Node 節點上還應具備處理容器操做的工做,例如 Docker 或 rkt。服務器
Master網絡
Kubernetes 裏的 Master 指的是集羣控制節點,每一個 Kubernetes 集羣裏須要有一個 Master節 點來負責整個集羣的管理和控制,基本上 Kubernetes 全部的控制命令都是發給它,它來負責具體的執行過程,咱們後面全部的執行命令基本都是在 Master 上運行的,它就是整個集羣的「首腦」。架構
Master節點上運行着如下的一組進程
kube-apiserver 集羣控制的入口,提供了 HTTP Rest 接口的關鍵服務進程,是 Kubernetes 裏全部資源的增刪改查等操做的惟一入口,也是集羣控制的入口進行。
kube-controller-manager,Kubernetes 裏全部資源對象的自動化控制中心,好比故障檢測、自動擴展、滾動更新等。
kube-scheduler 負責 Pod 資源調度。
etcd 用於共享配置和服務發現,存儲 Kubernetes 集羣全部的網絡配置和對象的狀態信息。
Node
除了 Master,Kubernetes 集羣中的其它機器又被稱爲 Node 節點,是 Kubernetes 集羣中的工做負載節點,每一個 Node都會被 Master 分配一些工做負載(Docker 容器),當某個Node 宕機時,其上的工做負載會被 Master 自動轉移到其它節點上。
每一個 Node 節點上都運行着如下的一組關鍵進程:
kubelet:負責 Pod 對應的容器的建立,啓動等任務,同時與Master節點密切協做。
kube-proxy:實現 Kubernetes Service 的通訊與負載均衡機制的重要組件。
lube-proxyContainer Runtime(Docker, rkt, runc):負責本機的容器建立和管理工做。
Pod
Pod 是一組緊密關聯的容器集合,它們共享 PID、IPC、Network 和 UTS namespace,是Kubernetes 調度的基本單位。Pod 的設計理念是支持多個容器在一個 Pod 中共享網絡和文件系統,能夠經過進程間通訊和文件共享這種簡單高效的方式組合完成服務。
Label
Label 是識別 Kubernetes 對象的標籤,以 key/value 的方式附加到對象上(key最長不能超過63字節,value 能夠爲空,也能夠是不超過253字節的字符串)。 Label 不提供惟一性,而且實際上常常是不少對象(如 Pods)都使用相同的 label 來標誌具體的應用。 Label 定義好後其餘對象可使用 Label Selector 來選擇一組相同 label 的對象(好比 Service 用 label 來選擇一組 Pod)。Label Selector支持如下幾種方式:
Namespace
Namespace 是對一組資源和對象的抽象集合,好比能夠用來將系統內部的對象劃分爲不一樣的項目組或用戶組。常見的 pods, services,deployments 等都是屬於某一個 namespace 的(默認是default),而 Node, PersistentVolumes 等則不屬於任何 namespace。
ReplicationController
在舊版本的 Kubernetes 中,只有 ReplicationController對象。它的主要做用是確保Pod以你指定的副本數運行,即若是有容器異常退出,會自動建立新的 Pod 來替代;而異常多出來的容器也會自動回收。能夠說,經過 ReplicationController,Kubernetes實現了集羣的高可用性。
ReplicaSet
ReplicaSet 是 ReplicationController 的代替物,所以用法基本相同,惟一的區別在於 ReplicaSet 支持集合式的 selector。雖然也 ReplicaSet 能夠獨立使用,但建議使用 Deployment 來自動管理 ReplicaSet,這樣就無需擔憂跟其餘機制的不兼容問題(好比 ReplicaSet 不支持 rolling-update 但 Deployment 支持),而且 Deployment 還支持版本記錄、回滾、暫停升級等高級特性。
Deployment
Deployment 確保任意時間都有指定數量的 Pod「副本」在運行。若是爲某個 Pod 建立了 Deployment 而且指定3個副本,它會建立3個 Pod,而且持續監控它們。若是某個 Pod 不響應,那麼 Deployment 會替換它,保持總數爲3。若是以前不響應的 Pod 恢復了,如今就有4個 Pod 了,那麼 Deployment 會將其中一個終止保持總數爲3。若是在運行中將副本總數改成5,Deployment 會馬上啓動2個新 Pod,保證總數爲5。Deployment 還支持回滾和滾動升級。
當建立 Deployment 時,須要指定兩個東西:
如今已經建立了 Pod 的一些副本,那麼在這些副本上如何均衡負載呢?咱們須要的是 Service。
StatefulSet
StatefulSet 是爲了解決有狀態服務的問題(對應 Deployments 和 ReplicaSets是爲無狀態服務而設計),其應用場景包括
DaemonSet
DaemonSet 保證在每一個Node上都運行一個容器副本,經常使用來部署一些集羣的日誌、監控或者其餘系統管理應用。典型的應用包括:
Service
Service 是應用服務的抽象,經過 labels 爲應用提供負載均衡和服務發現。匹配 labels 的Pod IP 和端口列表組成 endpoints,由 kube-proxy 負責將服務 IP 負載均衡到這些endpoints 上。每一個 Service 都會自動分配一個 cluster IP(僅在集羣內部可訪問的虛擬地址)和 DNS 名,其餘容器能夠經過該地址或 DNS 來訪問服務,而不須要了解後端容器的運行。
Job
Job 負責批量處理短暫的一次性任務 (short lived one-off tasks),即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束。
Kubernetes 支持如下幾種 Job:
CronJob
CronJob 即定時任務,就相似於 Linux 系統的 crontab,在指定的時間週期運行指定的任務。在 Kubernetes 1.5,使用 CronJob 須要開啓 batch/v2alpha1 API,即–runtime-config=batch/v2alpha1。
Horizontal Pod Autoscaler(HPA)
Horizontal Pod Autoscaling 能夠根據 CPU 使用率或應用自定義 metrics 自動擴展 Pod 數量(支持replication controller、deployment和replica set),從而合理的擴展性能與使用資源。
上述只是對 Kubernetes 的一些簡單概述,對於 Kubernetes 自己仍是很複雜的,特別是要應用到生產環境中去,須要熟悉各組件的工做機制,另外還須要考慮到網絡 ,存儲,監控,故障轉移,高可用,以及安全性等因素。
REFER:
https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/
https://www.cncf.io/projects/
https://yq.aliyun.com/articles/596889?spm=a2c4e.11153940.blogcont596633.18.66d317fa5uUaVV
https://github.com/rootsongjc/kubernetes-handbook
https://github.com/kubernetes/kubernetes
https://github.com/ramitsurana/awesome-kubernetes
https://www.youtube.com/watch?v=90kZRyPcRZw
https://www.youtube.com/watch?v=1xo-0gCVhTU
https://www.qikqiak.com/k8s-book/
https://jimmysong.io/kubernetes-handbook/
https://www.redhat.com/zh/topics/containers/what-is-kubernetes (紅帽 OpenShift)