服務的分類
有狀態
- 代表應用
- nginx
- apache
- 優點
- 對客戶端透明,無依賴關係,可以高效實現擴容,遷移
- 缺點
- 不能儲存資料,需要額外的資料服務支撐
無狀態
- 代表應用
- MYSQL
- Redis
- 優點
- 可以獨立儲存資料,實現資料管理
- 缺點
- 叢集環境下需要實現主從,資料同步,備份,水平擴容負載。
資源和物件
資源等於類,物件等於透過類建立出來的物件
kubernetes中的所有內容都被抽象為“資源”,如pod,service,node等都是資源。
“物件”就是“資源”的例項,是持久化的實體。如某個具體的pod,某個具體的node。kubernetes使用這些實體去表示整個叢集的狀態。
物件的建立,刪除,修改都是透過kubernetes的API介面實現的。這些是“restful”風格的api,與k8s的萬物皆物件的思想對應。命令列工具“kubectl”,實際上也是呼叫kubernetes的api介面。
k8s中資源的型別有很多種,kubectl可以透過配置檔案來建立。這些“物件”,配置檔案更像是描述物件“屬性”的檔案,配置檔案格式可以是“json”或“yaml”,常用“yaml”。
物件規約和狀態
規約
規約(spec),規格的意思,spec是必需的,它描述了物件的期望狀態(Desired State) —— 希望物件所具有的特徵,當建立物件時,必須提供物件的規約,用來描述該物件的期望狀態,以及關於物件的一些基本資訊。
狀態
表示物件的實際狀態,該屬性由k8s自己維護,k8s會透過一系列的控制器對應物件進行管理,儘可能的將物件的實際狀態與期望狀態重合。
資源和物件
後設資料
對於資源的後設資料描述,每一個資源都可以使用源空間的資料
-
Horizontal Pod Autoscaler(HPA)
pod自動擴容,可以根據cpu使用率或自定義指標(metrics)自動對pod進行擴/縮容
控制器每30s(可以透過horizontal pod autoscaler sync period修改),查詢metrics的資源使用情況
支援三種metrics型別
- 預定義metrics(比如pod的cpu)以利用率的方式計算
- 自定義的pod metrics 以原始值的方式計算
- 自定義的object metrics
支援兩種metrics查詢方式,heapster和自定義的rest api
支援多metrics
使用場景類似於京東十點秒殺搶蘋果20,這個時候就需要加伺服器 -
PodTemplate
PodTemplate是關於pod的定義,但是被包含在其他的kubernetes物件中(例如,Deployment,StatefulSet,Job等控制器)。控制器透過PodTemplate的資訊來建立pod。
-
LimitRange
可以對叢集內的Request和Limit的配置做一個全國的同意的限制,相當於批次設定了某一個範圍內(某個名稱空間)的pod的資源使用限制
叢集級
叢集級別的資源,作用在叢集之上,叢集下的所有資源都可以共享使用
- Namespace
名稱空間本身就屬於叢集級別的資源,用來隔離叢集內的資源,每個名稱空間都有自己的資源配額,資源配額可以設定在名稱空間級別,也可以設定在叢集級別。
- Node
節點相當於一臺伺服器的概念,不同於其他的資源(pod和namespace),node的本質上不是kubernetes來建立的,kubernetes只是管理node上的資源,雖然可以透過manifest建立一個node物件(如json所示),但是kubernetes也只是去檢查是否真有該node的存在,如果檢查失敗,也並不會去往上排程pod。
- ClusterRole
宣告資源
ClusterRole和Role的區別在於,ClusterRole是叢集級別的,而Role是名稱空間級別的。 - ClusterRoleBinding
上面只是宣告資源,這個是用來進行繫結。(只能繫結叢集級別的資源)
名稱空間
名稱空間級別的資源,作用在名稱空間之上,通常只能在該名稱空間範圍內使用
工作負載型
pod
![img](https://img2023.cnblogs.com/blog/3303148/202405/3303148-20240505201334362-730976802.png)
> 簡單理解為容器組
> pod(容器組)是kubernetes中最小的可部署單元,一個pod(容器組)包含了一個應用程式容器(某些情況下是多個容器,儲存資源。一個唯一的網路ip地址,以及一些確定容器該如何執行的選項,pod容器組代表了kubernetes中一個獨立的應用程式執行例項,該例項可能由單個的容器或者幾個緊耦合在一起的容器組成)
docker 是 kubernetes pod 中使用最廣泛的容器引擎;kubernetes pod 同時也支援其他型別的容器引擎。
kubernetes叢集中的pod存在如下兩種使用途徑:
> 1. 一個pod中值執行一個容器。這種是kubernetes最常用的方式。此時,我們可以認為pod容器組是該容器的wapper。kubernetes透過pod管理容器而不是直接管理容器。
> 2. 一個pod中執行多個需要互相協作的容器。可以想多個緊密耦合,共享資源且始終在一起執行的容器編排在同一個pod中。
副本(replicas)
副本的概念: 一個pod可以被複製成多份,每一份可以被稱之為一個副本。這些副本除了一些描述性資訊(pod的名字,uid等)不一樣之外,其他的資訊都是一樣的,譬如pod內部的容器,容器數量,容器裡面執行的應用等,這些資訊都是一樣的,這些副本提供同樣的功能。
pod的“控制器”通常包含一個名為“replicas”的屬性。該屬性則指定了特定pod的副本數量。噹噹前叢集中該pod的數量與該屬性指定的值不一致時,k8s會猜去一些策略去使得當前狀態滿足配置的要求。
控制器
- 控制器的型別
適用於無狀態服務
- ReplicationController(RC):幫助我們動態更新pod的副本數,也就是說實現擴容和縮容的效果(在1.11版本被棄用)
- ReplicaSet(RS):幫助我們動態更新pod的副本數,與RC類似,但是RS可以透過selector和label來選擇對哪些pod生效(RS只有擴容和縮容)
- Deployment
是針對RS的更高層次的封層。
- 可以建立ReplicaSet,然後透過RS建立pod。
- 可以滾動升級和回滾pod
3.平滑擴容和縮容- 暫停和恢復
適用於有狀態服務StatefulSet
主要特點:
- 穩定的持久化儲存
- 穩定的網路識別符號
- 有序部署,有序擴充套件
- 有序收縮,有序刪除
組成:- Headless Service
用於定義網路標誌(DNS domain,域名服務,將域名與ip繫結對映關係)- VolumeClaimTemplate
用於建立持久化卷的模板
守護程序
DaemonSet
DaemonSet是保證在每個node上都執行的一個容器副本,常用來部署一些叢集的日誌,監控或者其他系統管理應用。典型的應用包括(日誌收集,系統監控,系統程式)
類似於:為每一個匹配的node都部署一個守護程序
任務/定時任務
- Job
- 一次性任務,執行完pod銷燬,不再重新啟動新容器
- CronJob
- 是在job基礎上加上了定時功能
服務發現
service
pod不能直接提供給外網訪問,而是應該使用service,service就是吧pod暴露出來提供服務,service才是真正的服務,它的中文名就叫‘服務’。可以說service是一個應用服務的抽象,定義了pod邏輯集合和訪問這個pod集合的策略。service代理pod集合,對外表現為一個訪問入口,訪問該入口的請求將進過負載均衡,轉發到後端的容器中。
ingress
實現將k8s內部服務暴露給外網訪問的服務
配置與儲存
Volume
資料卷,共享pod中容器使用的資料。用來放持久化的資料,比如資料庫資料。(Volume ClaimTemplate 就是申請Volume。
CSI
標準介面之一,旨在將任意儲存系統暴露給容器化應用程式。
csi規範定義了儲存提供商實現csi相容的Volume Plugin的最小操作集和部署建議。csi規範的主要焦點是宣告volume plugin 必須實現的介面。
特殊型別配置
ConfigMap
- 鍵值對型別的配置
Secret
- 鍵值對型別的配置,同ConfigMap類似,但Secret中的資料會加密儲存
DownwardAPI
提供了兩種方式用於將pod的資訊直接注入容器內部
- 環境變數
- 用於單個變數,可以將pod資訊直接注入容器內部
- volume掛載
- 將pod資訊生成檔案,直接掛載到容器內部中。
Role
role是一組許可權的集合。例如,role可以包含列出pod許可權及列出Deployment許可權。role用於給某個名稱空間中的資源進行鑑權
RoleBinding
繫結role,將role繫結到某個使用者或者組上。(可以繫結role,也可以繫結clusterRole,他只是決定繫結到哪裡去,rolebinding繫結到某個名稱空間,clusterrolebinding繫結到整個叢集)