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