Kubernetes 有各種資源對象來描述整個集羣的運行狀態。這些對象都須要經過調用 kubernetes api 來進行建立、修改、刪除,能夠經過 kubectl 命令工具,也能夠直接調用 k8s api,或者使用對象語言的客戶端庫(例如:golang , pythion )。python
每一個 kubernetes 對象都會包含兩個關鍵字段:Object Spec 和 Object Status。spec 描述了對象所指望達到的狀態,status 描述了該對象的實際狀態。git
下面會寬泛的介紹一些 Kubernetes 的核心概念,便於初步的理解它們特徵及工做模式。github
Pod 是 Kubernetes 最小的調度單元,能夠由一個或者多個容器組成。golang
Pod 的設計理念是支持多個容器在一個 Pod 中共享網絡和文件系統,能夠經過進程間通訊和文件共享這種簡單高效的方式組合完成服務。docker
Pod 的特徵:api
kubernetes v1.8+ 且 docker >= 1.13.1 才支持容器之間共享
PID
namespace,還須要配置 kubelet —docker-disable-shared-pid=false
Labels 是 Key-Value 對,k8s 用於標識其全部資源;而 Selectors 是標籤選擇器,用於選擇特定 labels 的資源。網絡
Selectors 目前支持兩種選擇器:Equality-based(基於平等) 和 Set-based(基於集合)。app
1. Equality-based負載均衡
基於相等的或者不想等的條件用標籤的 keys 和 values 進行過濾。支持三種運算符:「=」,「==」 和 「!=」。還可使用逗號操做符,鏈接多個運算符。
2. Set-based
Set-based 的選擇器容許用一組 value 來過濾 key。
支持三種操做符:in,notin 和 exists(僅針對於 key 符號)。
例如:
env in (dev, test, staging, prod) env notin (staging, prod) partition !partition
Set-based 能夠和 Equality-based 條件結合使用。
Kubernetes 有幾個版本的副本控制器,好比 Replication Controller、Replica Set(RC 升級版)和 Deployments。
Deployment 是邏輯層的一種抽象,爲 Pod 和 ReplicaSet 提供了一種聲明式定義,來代替之前的 Replication Controller 更方便的管理應用。
在 Kubernetes 的實際使用中,RS 也屬於底層概念,由 Deployment 來管理,所以用戶通常都是與 Deployment 打交道。
Deployment 有幾種 典型的應用場景
,好比:
RC、RS、Deployment 等對象都是爲了解決無狀態服務而設計,下面還會針對有狀態服務,介紹對應的對象。
Kubernetes Pod 有本身的生命週期,能夠隨時被建立和銷燬,而一旦銷燬就永遠結束了。而每一個 Pods 都有本身的 IP,而 Pod 的生命週期也意味着 這些 IP 地址不老是穩定可靠的。因此須要有針對容器的服務發現與負載均衡機制,來訪問這個 Pod 邏輯分組。
service 是對一組提供相同功能的 Pods 集合的抽象,爲這組Pods提供統一的訪問入口。藉助 Service 能夠方便的實現服務發現與負載均衡,並實現應用的零宕機升級。
在 Kubernetes 集羣中,每一個 Node 都會部署一個 kube-proxy 進程。kube-proxy 負責爲 Service 實現了一種 VIP (虛 IP)。
Service 有四種類型:
NodeIP:NodePort
進行服務訪問。一般狀況下,Service 和 Pod 僅支持在集羣內部進行服務訪問。而 Ingress 能夠提供外部服務可訪問的 URL / 負載均衡器等。
Ingress 對象只是配置了一些規則,若要實現集羣外部的訪問,還須要部署一個 Ingress Controller
,它會從 kube-apiserver 監聽 Ingress 和 Service 的變動,並根據 Ingress 的規則配置負載均衡來提供訪問入口。
Job 負責批量處理短暫的一次性任務,僅執行一次,並保證處理的一個或者多個Pod成功結束。
具體的能夠查看:深刻K8S Job(一):介紹
PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 提供了方便的持久化卷:PV 提供網絡存儲資源,而 PVC 請求存儲資源。這樣,設置持久化的工做流包括配置底層文件系統或者雲數據卷、建立持久性數據卷、最後建立 PVC 來將 Pod 跟數據卷關聯起來。PV 和 PVC 能夠將 pod 和數據卷解耦,pod 不須要知道確切的文件系統或者支持它的持久化引擎。
PV 也是集羣的資源(等同於cpu / mem),但不一樣於 pod volume,它是獨立於 Pod 的生命週期。
支持類別劃分,好比不一樣的服務質量級別(SSD / SATA),不一樣的備份策略等。
支持動態 PV(StorageClass)。
支持卷的擴容及快照(v1.8+ 特性)。
支持 Local Volume,容許將 Node 本地的磁盤、分區或者目錄做爲持久化存儲使用。可是須要注意該模式不支持動態建立,使用前須要預先建立好 PV。
PV 是存儲資源,而 PVC 是對 PV 的請求。PVC 和 Pod 相似,Pod 消費 Node 資源,而 PVC 消費 PV 資源;Pod 可以請求 CPU 和內存資源,而 PVC 請求特定大小和訪問模式的數據卷。
StatefulSet 用於支持部署有狀態服務,而有狀態的服務很關鍵的就是持久化存儲,這就依賴上面介紹的 PV & PVC 了。
StatefulSet 的應用場景包括:
參考案例:Running ZooKeeper, A Distributed System Coordinator - Kubernetes
- 推薦在 k8s v1.9 + 的版本使用 statefulSet。
- 爲了保證數據安全,刪除 StatefulSet 是不會刪除 PV 的,須要考慮清理策略。
- StatefulSet 須要提早建立一個 Headless Service 來定義 DNS domain。
還有不少別的資源對象,這裏暫不一一介紹了,由於涉及的篇幅會比較長。
對於上面或者未說起的資源對象須要多瞭解一下的,建議查閱官方文檔。
好比: