Kubernetes入門學習
什麼是Kubernetes?
Kubernetes(k8s)是自動化容器操作的開源平臺,這些操作包括部署、排程和節點叢集間擴充套件 。docker可以看出Kubernetes內部使用的低級別元件。Kubernetes同時還是支援Rocket(另一種容器技術)。
Kubernetes可以支援:
- 自動化容器的部署和複製
- 隨時擴充套件或收縮容器規模
- 將容器組織成組,並且提供容器間的負載均衡
- 很方便地升級應用程式容器的新版本
- 提供容器彈性,如果容器失敗就替換它
實際上,使用Kubernetes只需一個部署檔案,使用一條命令就可以部署多層容器(前端,後臺等)的完整叢集:
$ kubectl create -f single-config-file.yaml
kubectl是和Kubernetes API互動的命令列程式。
注意: yaml是專門用來寫配置檔案的語言,非常簡潔和強大,遠比json格式方便。
概念解釋
體現服務的架構圖
體現角色的架構圖
核心概念介紹
Pod-容器組
Pod是Kubernetes的基本操作單元,指定多個有關聯容器(有呼叫關係依賴)構成一個Pod。Pod包含的容器執行在同一個Minion上(Worker Node),Pod的設計理念是支援多個容器在一個Pod中共享網路地址和檔案系統。
Pod的設計理念是支援多個容器在一個Pod中共享網路地址和檔案系統,可以通過程序間通訊和檔案共享這種簡單高效的方式組合完成服務。
Pod是K8s叢集中所有業務型別的基礎,可以看作執行在K8s叢集中的小機器人,不同型別的業務就需要不同型別的小機器人去處理。目前K8s中的業務主要可以分為長期伺服型(long-running)、批處理型(batch)、節點後臺支撐型(node-daemon)和有狀態應用型(stateful application);分別對應的小機器人控制器為Deployment、Job、DaemonSet和PetSet。
Deployment-部署
Deployment是最近幾個版本才有的,部署表示使用者對K8s叢集的一次更新操作。部署是一個比RS應用模式更廣的API物件,可以建立,更新一個新的服務,或者滾動升級一個服務。滾動升級一個服務,實際是建立一個新的RS,然後逐漸將新的RS中的副本數增加到理想狀態,將舊RS中的副本數減小到0的複合操作
一個Deployment = 一組Pod + 一個Replica set(副本集)。Replica Set負責環境中有指定數量Pod副本在執行,如果少於指定數量的Pod副本, Replication set會啟動新的Container,反之殺死多餘的以保證數量不變。
Job-任務
Job是K8s用來控制批處理型任務的API物件。批處理業務與長期伺服業務的主要區別是批處理業務的執行有頭有尾,而長期伺服業務在使用者不停止的情況下永遠執行。Job管理的Pod根據使用者的設定把任務成功完成就自動退出了。成功完成的標誌根據不同的spec.completions策略而不同:單Pod型任務有一個Pod成功就標誌完成;定數成功型任務保證有N個任務全部成功;工作佇列型任務根據應用確認的全域性成功而標誌成功。
DaemonSet-後臺支撐服務集
長期伺服型和批處理型服務的核心在業務應用,可能有些節點執行多個同類業務的Pod,有些節點上又沒有這類Pod執行;而後臺支援服務的核心關注點是K8s叢集中的節點(物理機或虛擬機器),要保證每個節點上都有一個此類Pod服務執行。節點可能是所有叢集節點也可能是通過nodeSelector選定的一些特定節點。典型的後臺支援型服務包括,儲存,日誌和監控每個節點上支援K8s叢集執行的服務 。
PetSet-有狀態服務集
K8s在1.3版本里釋出了Alpha版的PetSet功能。。RC和RS主要是控制提供無狀態服務的,其所控制的Pod的名字是隨機設定的,一個Pod出故障了就被丟棄掉,在另一個地方重啟一個新的Pod,名字變了、名字和啟動在哪兒都不重要,重要的只是Pod總數;而PetSet是用來控制有狀態服務,PetSet中的每個Pod的名字都是事先確定的,不能更改。PetSet中Pod的名字作用用於關聯與該Pod對應的狀態 。
對於RC和RS中的Pod,一般不掛載或者掛載共享儲存,儲存是所有Pod共享的狀態,各個Pod之間沒有區別;對於PetSet中的Pod,每個Pod掛載獨立的儲存,如果一個Pod出現故障,從其他節點啟動一個同樣名字的Pod,要掛載上原來Pod的儲存繼續以它的狀態提供服務。
適用於PetSet的業務
- 資料庫服務MySQL和PostgreSQL
- 叢集化管理服務Zookeeper、etcd
- 比普通容器更穩定可靠的模擬虛擬機器的機制
- 傳統的虛擬機器是有狀態的,運維人員需要不斷地維護它。容器剛開始流行時,用容器來模擬虛擬機器使用,所有狀態都儲存在容器裡,這是非常不安全、不可靠的 。使用PetSet,Pod仍然可以通過漂移到不同節點提供高可用,而儲存也可以通過外掛的儲存來提供高可靠性,PetSet做的只是將確定的Pod與確定的儲存關聯起來保證狀態的連續性 。
Replication Controller-複製控制器
RC是K8s叢集中最早的保證Pod高可用的API物件。通過監控執行中的Pod來保證叢集中執行指定數目的Pod副本。動態的檢查Pod的數量是否跟建立的時候指定數量一致,如果多於指定數量則會自動刪除,如果多於指定數量則會自動建立。通過RC執行Pod比直接執行Pod更明智,RC會保證Pod的數量 。
Replica Set-副本集
RS是新一代的RC, 提供同樣的高可用能力,區別,RS 能支援更多種類的匹配模式。副本集一般不單獨使用,而是作為Deployment的狀態引數使用。
Service-服務
RC、RS和Deployment只是保證了支撐服務的微服務Pod的數量,但是沒有解決如何訪問這些服務 。一個Pod只是一個執行服務的例項,隨時可能在一個節點上停止,在另一個節點以新的IP啟動一個新的Pod,因此不能以確定IP和埠號 的方式提供服務。要穩定地提供服務需要服務發現和負載均衡能力。
服務發現
服務發現完成的工作,是針對客戶端訪問的服務,找到對應的後端服務例項。例如,在K8s叢集中,客戶端需要訪問的服務就是Service物件。每個Service會對應一個叢集內部有效的虛擬IP,叢集內部通過虛擬IP訪問一個服務。
負載均衡
在K8s叢集中微服務的負載均衡是由Kube-proxy實現的。kube-proxy是K8s叢集內部的負載均衡器。它是一個分散式代理伺服器,在K8s的每個節點上都有一個;這一設計體現了它的伸縮性優勢,需要訪問服務的節點越多,提供負載均衡能力的Kube-proxy就越多,高可用節點也隨之增多。
Kubernetes還包括以下幾個核心元件:
- etcd儲存了整個叢集狀態
- apiserver提供了資源操作的唯一入口,並提供認證、授權、訪問控制、API註冊和服務發現等機制
- controller manager負責維護叢集的狀態,比如故障檢測、自動擴容、滾動更新等
- scheduler負責資源的排程,按照預定的排程策略將Pod排程到相應的機器上
- Kubelet負責維護容器的生命週期,同時也負責Volume(CVI)和網路(CNI)的管理
- Container runtime負責映象管理以及Pod和容器的真正執行(CRI)
- Kube-proxy負責為service提供cluster內部的服務發現和負載均衡
除了核心元件,還有一些推薦的Add-ons:
- kube-dns負責為整個叢集提供DNS服務
- Ingress Controller為服務提供外網入口
- Heapster提供資源監控
- Dashboard提供GUI
- Federation提供跨可用區的叢集
- Fluentd-elasticsearch提供叢集日誌採集、儲存與查詢