K8S—理论知识
K8S
- 一、概述
- 1.1 作用
- 1.2 搭配docker使用
- 1.3 特性
- 二、K8S架構(gòu)
- 2.1 master 組件
- API server
- controller manager
- scheduler
- 2.2 配置存儲中心
- ETCD
- 2.3 Node 組件
- Kubelet
- proxy
- 三、核心概念
- 3.1 pod
- 3.2 pod控制器
- 3.3 label
- 3.4 label 選擇器
- 3.5 service
- 3.6 ingress
- 3.7 name
- 3.8 namespace
- 四、總結(jié)
一、概述
全稱: Kubernetes
1.1 作用
負責(zé)自動化運維管理多個容器化的程序的集群,也是一個容器編排工具
主要和docker搭配
1.2 搭配docker使用
可以完美解決docker的以下幾個弱點
- 單機使用,無法有效集群
- 容器數(shù)量上升,管理成本上升
- 沒有有效的容災(zāi),自愈機制
- 沒有編排模板,無法實現(xiàn)快速,大規(guī)模容器調(diào)度
- 沒有統(tǒng)一配置管理中心工具
- 沒有容器生命周期管理工具
- 沒有圖形化管理工具
總而言之,K8S提供了了容器編排、資源調(diào)度、彈性伸縮、部署管理和服務(wù)發(fā)現(xiàn)等等功能
1.3 特性
彈性伸縮
使用命令、UI或者基于CPU使用情況自動快速擴容和縮容應(yīng)用程序?qū)嵗?#xff0c;保證應(yīng)用業(yè)務(wù)高峰并發(fā)時的高可用性;業(yè)務(wù)低峰時回收資源,以最小成本運行服務(wù)
自我修復(fù)
在節(jié)點故障時重新啟動失敗的容器,替換和重新部署;殺死失敗的容器,并且在未準備好之前不會處理客戶端請求,確保線上服務(wù)不中斷
服務(wù)發(fā)現(xiàn)和負載均衡
K8s為多個容器提供一個統(tǒng)一訪問入口(內(nèi)部IP地址和一個DNS名稱),并且負載均衡關(guān)聯(lián)的所有容器,使得用戶無需考慮容器IP問題
自動發(fā)布(默認滾動發(fā)布模式)和回滾
K8S采用滾動更新策略更新應(yīng)用,一次更新一個Pod,而不是同時刪除所有Pod,如果更新過程中出現(xiàn)問題,將回滾更改,確保升級不受影響業(yè)務(wù)
集中化配置管理和密鑰管理
管理機密數(shù)據(jù)和應(yīng)用程序配置,而不需要把敏感數(shù)據(jù)暴露在鏡像里,提高敏感數(shù)據(jù)安全性。并可以將一些常用的配置存儲在K8S中,方便應(yīng)用程序使用
存儲編排,支持外掛存儲并對外掛存儲資源進行編排
掛載外部存儲系統(tǒng),無論是來自本地存儲,公有云,還是網(wǎng)絡(luò)存儲都作為集群資源的一部分使用,極大提高存儲使用靈活性
任務(wù)批處理運行
提供一次性任務(wù),定時任務(wù),滿足批量數(shù)據(jù)處理和分析的場景
二、K8S架構(gòu)
K8S屬于主從設(shè)備模型,如圖所示master節(jié)點負責(zé)集群的調(diào)度、管理和運維,slave節(jié)點負責(zé)集群的運算工作負載
master組件可以在集群中的任何計算機上運行,不過一般建議單獨用一臺獨立的服務(wù)器,因為master是整個集群的大腦,如果master宕機了,那么所有的控制命令就會失效
某個節(jié)點宕機時,master會把工作負載轉(zhuǎn)移到其他節(jié)點
2.1 master 組件
API server
任何的資源請求或者調(diào)用操作都是通過 API 提供的接口進行,所有對象的增刪改查和監(jiān)聽操作也都是API處理后交給etcd存儲
API就是k8s的請求入口服務(wù),負責(zé)接收所有請求,然后再根據(jù)用戶的需求通知其他組件干活
controller manager
運行管理控制器:k8s中處理常規(guī)任務(wù)的后臺線程,所有資源對象的自動化控制中心
在k8s中,一個資源對應(yīng)一個控制器,controller manager 就是負責(zé)管理這些控制器的
通過API監(jiān)控狀態(tài),如果某個node宕機,controller manager會執(zhí)行自動化修復(fù)流程,確保整個集群都是正常的工作狀態(tài)
主要有一下幾個控制器
- Node Controller (節(jié)點控制器) :負責(zé)在節(jié)點出現(xiàn)故障時發(fā)現(xiàn)和響應(yīng)
- Replication Controller (副本控制器) :負責(zé)保證集群中一個RC (資源對象Replication Controller) 所關(guān)聯(lián)的Pod副本數(shù)始終保持預(yù)設(shè)值。可以理解成確保集群中有且僅有N個Pod實例,N是RC中定義的Pod副本數(shù)量
- Endpoints Controller (端點控制器) :填充端點對象(即連接Services 和Pods) ,負責(zé)監(jiān)聽Service 和對應(yīng)的Pod副本的變化。可以理解端點是一個服務(wù)暴露出來的訪問點,如果需要訪問一個服務(wù),則必須知道它的endpoint
- Service Account & Token Controllers (服務(wù)帳戶和令牌控制器) :為新的命名空間創(chuàng)建默認帳戶和API 訪問令牌
- ResourceQuotaController(資源配額控制器):確保指定的資源對象在任何時候都不會超量占用系統(tǒng)物理資源
- Namespace Controller (命名空間控制器) :管理namespace 的生命周期
- Service Controller (服務(wù)控制器) :屬于K8S 集群與外部的云平臺之間的一個接口控制器
scheduler
負責(zé)資源調(diào)度的進程,根據(jù)調(diào)度算法為新的pod選擇一個合適的node節(jié)點
也就是說這個組件是所有node節(jié)點的調(diào)度器,當(dāng)用戶要部署服務(wù)時,scheduler根據(jù)調(diào)度算法選擇合適的節(jié)點來部署pod
2.2 配置存儲中心
ETCD
分布式鍵值存儲系統(tǒng),存儲了k8s的關(guān)鍵配置和用戶配置
k8s里只有API有讀寫權(quán)限,其他組件想要讀取ETCD必須通過API才可以
2.3 Node 組件
Kubelet
Node節(jié)點的監(jiān)視器,以及與master節(jié)點的通訊器,定時向API回報自己這邊node節(jié)點的狀態(tài)
從master節(jié)點上獲取自己這邊pod的期望狀態(tài),如果不一樣,就調(diào)用對應(yīng)的容器平臺接口到這個狀態(tài)
管理鏡像和容器的清理工作,保證節(jié)點不會被占滿空間,退出的容器又不會占用太多資源
總結(jié):kubelet負責(zé)node節(jié)點大大小小的一切事務(wù),也是和API組件相互通訊的一個重要部分
proxy
在每個node節(jié)點上實現(xiàn)pod網(wǎng)絡(luò)代理,負責(zé)維護網(wǎng)絡(luò)規(guī)則和四層負載均衡工作
proxy本身不提供網(wǎng)絡(luò),pod的網(wǎng)絡(luò)其實是kubelet提供的,proxy實際上只是維護虛擬的pod集群網(wǎng)絡(luò)
API通過監(jiān)控proxy來進行對k8s的更新和端點的維護
proxy是k8s的負載均衡器,也是一個分布式代理服務(wù)器,在每個節(jié)點上都會有proxy組件
三、核心概念
k8s有著多種類型的資源對象:
pod、label、service、replication、contreller 等等
所有的資源對象都可以通過k8s里的 kubectl 來進行增刪改查,并保存在 etcd 中持久化存儲
k8s是一個高度自動化的資源控制系統(tǒng),通過對比etcd里保存的資源期望狀態(tài)和當(dāng)前環(huán)境的差異來實現(xiàn)自動糾錯、控制等高級功能
3.1 pod
pod 是k8s創(chuàng)建的最小基本單位,一個pod代表集群上正在運行的一個進程
- 一個pod有一個或多個容器組成,pod內(nèi)容器共享網(wǎng)絡(luò)、存儲等資源
- 一個pod運行多個容器叫做邊車模式,在生成環(huán)境中一般都是單個容器或者有著強關(guān)聯(lián)互補的多個容器組成一個pod
- 同一個pod之間的容器可以通過localhost互相訪問,并且掛載pod內(nèi)所有的數(shù)據(jù)卷,但是不同的pod之間的容器不能用localhost訪問,也不能掛載
3.2 pod控制器
Pod控制器是Pod啟動的一種模版,用來保證在K8S里啟動的Pod 應(yīng)始終按照用戶的預(yù)期運行(副本數(shù)、生命周期、健康狀態(tài)檢查等)
K8S內(nèi)提供了眾多的Pod控制器,有以下幾種:
Deployment:無狀態(tài)應(yīng)用部署
Deployment 的作用是管理和控制Pod 和ReplicaSet, 管控它們運行在用戶期望的狀態(tài)中
Replicaset:確保預(yù)期的Pod 副本數(shù)量
ReplicaSet 的作用就是管理和控制Pod,管控他們好好干活。但是,ReplicaSet 受控于Deployment
也就是說deployment是老大,監(jiān)督pod干活的
如果有pod出現(xiàn)問題,就會重新找個新pod頂替,replicaset就是負責(zé)這個
資源對象Replication Controller 是ReplicaSet 的前身,官方推薦用Deployment 取代Replication Controller 來部署服務(wù)
Daemonset:確保所有節(jié)點運行同一類Pod, 保證每個節(jié)點上都有一個此類Pod 運行,通常用于實現(xiàn)系統(tǒng)級后臺任務(wù)
Statefulset :有狀態(tài)應(yīng)用部署
Job:一次性任務(wù)
根據(jù)用戶的設(shè)置,Job 管理的Pod把任務(wù)成功完成就自動退出了
cronjob:周期性計劃性任務(wù)
3.3 label
標(biāo)簽
k8s的特色管理方式,用于分類管理資源對象
label可以附加到各種資源對象上,用于關(guān)聯(lián)對象、查詢和篩選
一個資源對象可以定義多個label,同一個label也可以被添加到多個資源對象
可以通過給指定資源對象綁定一個或多個不同的label來實現(xiàn)多維度的資源分組管理功能
3.4 label 選擇器
給某個資源對象定義一個label,相當(dāng)于給他打了個標(biāo)簽,然后就通過這個選擇器來查詢篩選有l(wèi)abel的資源對象
標(biāo)簽選擇器有兩種:基于等值關(guān)系和基于集合關(guān)系
3.5 service
雖然每個Pod會被分配一個單獨的IP地址,但由于Pod是有生命周期的(它們可以被創(chuàng)建,而且銷毀之后不會再啟動),隨時可能會因為業(yè)務(wù)的變更,導(dǎo)致這個IP地址也會隨著Pod 的銷毀而消失
Service就是用來解決這個問題的核心概念
K8S中的service像是網(wǎng)關(guān)層,可以看作一組提供相同服務(wù)的Pod的對外訪問接口、流量均衡器
Service作用于哪些Pod是通過標(biāo)簽選擇器來定義的
每個Service都有一個固定的虛擬ip (這個ip也被稱為Cluster IP) ,自動并且動態(tài)地綁定后端的Pod, 所有的網(wǎng)絡(luò)請求直接訪問Service 的虛擬ip,Service會自動向后端做轉(zhuǎn)發(fā)
Service除了提供穩(wěn)定的對外訪問方式之外,還能起到負載均衡(Load Balance) 的功能,自動把請求流量分布到后端所有的服務(wù).上,Service可以做到對客戶透明地進行水平擴展(scale)
而實現(xiàn)service 這一功能的關(guān)鍵,就是kube-proxy。 kube-proxy 運行在每個節(jié)點上,監(jiān)聽API Server中服務(wù)對象的變化,可通過以 下三種流量調(diào)度模式: userspace (廢棄)、iptables (瀕臨廢棄) 、ipvs (推薦,性能最好)來實現(xiàn)網(wǎng)絡(luò)的轉(zhuǎn)發(fā)
Service是K8S 服務(wù)的核心,屏蔽了服務(wù)細節(jié),統(tǒng)一對外暴露服務(wù)接口
優(yōu)勢非常明顯:一方面外部用戶不需要感知因為Pod上服務(wù)的意外崩潰、K8S 重新拉起Pod 而造成的IP變更,外部用戶也不需要感知因升級、變更服務(wù)帶來的Pod替換而造成的IP變化
3.6 ingress
service主要負責(zé)k8s集群的網(wǎng)絡(luò)拓撲,訪問集群內(nèi)部就要靠ingress了,作為k8s集群的接入層,也負責(zé)集群內(nèi)外通訊
ingress是七層應(yīng)用,訪問方式 http/https
service是四層流量調(diào)度
比如客戶端請求一個網(wǎng)址 → ingress → service → pod 這樣一個順序
3.7 name
k8s內(nèi)部使用資源定義每一種邏輯概念,但是這些資源也有自己的名稱
資源有 api版本(apiversion)、類別(kind)、元數(shù)據(jù)(metadata)、定義清單(spec)、狀態(tài)(status)等信息
名稱就是定義在資源的元數(shù)據(jù)信息里,并且在同一個空間內(nèi)是唯一的
3.8 namespace
隨著項目增多,人員增多,集群擴大,需要一個邏輯上隔離k8s內(nèi)部各種資源的方法,就是namespace
namespace是為了把k8s集群劃分成若干個資源不共享的虛擬集群組
不同的namespace內(nèi)資源名稱可以一樣,但是同空間內(nèi)資源和名稱不能一樣
k8s默認的namespace有:default、kube-system、kube-public等等
四、總結(jié)
k8s集群分為兩個節(jié)點,master節(jié)點和node節(jié)點
master節(jié)點里有API、Controller-manager、Scheduler、etcd組件
node節(jié)點有kubelet、proxy、pod組件
集群的框架概述
API組件接收到請求后創(chuàng)建一批 Pod ,API會讓 Controller-manager 按照所預(yù)設(shè)的模板去創(chuàng)建 Pod,Controller-manager 會通過 API 去找 Scheduler 為新創(chuàng)建的 Pod 選擇最適合的 Node 節(jié)點
比如運行這個 Pod 需要 2C4G 的資源,Scheduler 會通過預(yù)算策略在所有 Node 節(jié)點中挑選最優(yōu)的。
Node 節(jié)點中還剩多少資源是通過匯報給 API Server 存儲在 etcd 里,API Server 會調(diào)用一個方法找到 etcd 里所有 Node 節(jié)點的剩余資源,再對比 Pod 所需要的資源,在所有 Node 節(jié)點中查找哪些 Node 節(jié)點符合要求
如果都符合,預(yù)算策略就交給優(yōu)選策略處理,優(yōu)選策略再通過 CPU 的負載、內(nèi)存的剩余量等因素選擇最合適的 Node 節(jié)點,并把 Pod 調(diào)度到這個 Node 節(jié)點上運行。
總結(jié)
- 上一篇: Python-cdo学习
- 下一篇: python股票分析系列_Python股