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
- 以應用程序爲中心的管理: 將抽象級別從在虛擬硬件上運行操做系統上升到了在使用特定邏輯資源的操做系統上運行應用程序。
- 開發和運維的關注點分離: 提供構建和部署的分離;這樣也就將應用從基礎設施中解耦。
- 敏捷的應用建立和部署: 相對使用虛擬機鏡像,容器鏡像的建立更加輕巧高效。
- 持續開發,持續集成以及持續部署: 提供頻繁可靠地構建和部署容器鏡像的能力,同時能夠快速簡單地回滾(由於鏡像是固化的)。
- 鬆耦合,分佈式,彈性,自由的微服務: 應用被分割爲若干獨立的小型程序,能夠被動態地部署和管理 -- 而不是一個運行在單機上的超級臃腫的大程序。
- 開發,測試,生產環境保持高度一致: 不管是再筆記本電腦仍是服務器上,都採用相同方式運行。
- 兼容不一樣的雲平臺或操做系統上: 可運行與 Ubuntu,RHEL,on-prem 或者 Google Container Engine,覆蓋了開發,測試和生產的各類不一樣環境。
- 資源分離: 帶來可預測的程序性能。
- 資源利用: 高性能,大容量。
Kubernetes 不是 PaaS(平臺即服務)後端
- Kubernetes 並不對支持的應用程序類型有任何限制。 它並不指定應用框架,限制語言類型,Kubernetes 旨在支持各類多種多樣的負載類型:只要一個程序可以在容器中運行,它就能夠在Kubernetes中運行。
- 因爲 Kubernetes 運行再應用層而不是硬件層,因此它提供了一些通常 PaaS 提供的功能,好比部署,擴容,負載均衡,日誌,監控,等等。不管如何,Kubernetes 不是一個單一應用,因此這些解決方案都是可選可插拔的。
- Kubernetes 並非單單的"編排系統";「編排」的技術定義爲按照指定流程執行一系列動做:執行A,而後B,而後C。相反,Kubernetes 有一系列控制進程組成,持續地控制從當前狀態到指定狀態的流轉。無需關注你是如何從A到C:只需結果如此。這樣將使得系統更加易用,強大,健壯和彈性。
Kubernetes 核心組件
Kubernetes 集羣能夠部署在物理機或虛擬機上,用於協調高度可用的計算機集羣,這些計算機羣集被鏈接做爲單個單元工做。 Kubernetes 的抽象性容許您將容器化的應用程序部署到集羣,而沒必要專門將其綁定到單個計算機。爲了利用這種新的部署模型,應用程序須要以將它們與各個主機分離的方式打包: 它們須要被容器化。容器化應用程序比過去的部署模型更靈活和可用,其中應用程序直接安裝到特定機器上,做爲深刻集成到主機中的軟件包。api
Kubernetes 集羣由兩種類型的資源組成:安全
- Master 節點是集羣的調度節點 (Master 節點管理集羣,而 Node 用於託管正在運行的應用程序)
- Node 節點是應用程序實際運行的工做節點(Node節點使用 Master 公開的 Kubernetes API 與 Master 通訊)
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支持如下幾種方式:
- 等式,如app=nginx和env!=production
- 集合,如env in (production, qa)
- 多個label(它們之間是AND關係),如app=nginx,env=test
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 模板:用來建立 Pod 副本的模板
- Label 標籤:Deployment 須要監控的 Pod 的標籤。
如今已經建立了 Pod 的一些副本,那麼在這些副本上如何均衡負載呢?咱們須要的是 Service。
StatefulSet
StatefulSet 是爲了解決有狀態服務的問題(對應 Deployments 和 ReplicaSets是爲無狀態服務而設計),其應用場景包括
- 穩定的持久化存儲,即 Pod 從新調度後仍是能訪問到相同的持久化數據,基於 PVC 來實現
- 穩定的網絡標誌,即 Pod 從新調度後其 PodName 和 HostName 不變,基於 Headless Service(即沒有Cluster IP的Service)來實現
- 有序部署,有序擴展,即 Pod 是有順序的,在部署或者擴展的時候要依據定義的順序依次依次進行(即從0到N-1,在下一個Pod運行以前全部以前的 Pod 必須都是 Running 和 Ready 狀態),基於 init containers來實現
- 有序收縮,有序刪除(即從N-1到0)
DaemonSet
DaemonSet 保證在每一個Node上都運行一個容器副本,經常使用來部署一些集羣的日誌、監控或者其餘系統管理應用。典型的應用包括:
- 日誌收集,好比 fluentd,logstash 等
- 系統監控,好比 Prometheus Node Exporter,collectd,New Relic agent,Ganglia gmond 等
- 系統程序,好比 kube-proxy, kube-dns, glusterd, ceph 等
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:
- 非並行 Job:一般建立一個 Pod 直至其成功結束
- 固定結束次數的 Job:設置 .spec.completions,建立多個 Pod,直到 .spec.completions 個 Pod 成功結束
- 帶有工做隊列的並行 Job:設置 .spec.Parallelism 但不設置 .spec.completions,當全部Pod結束而且至少一個成功時,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)