Kubernetes 的基本概念和術語
- 2019 年 12 月 30 日
- 筆記
Master
Kubernetes 里的 Master 指的是集群的控制節點,負責整個集群的管理和控制。 在 Master 上運行中以下關鍵進程:
- Kubernetes API Server(kube-apiserver):提供了 HTTP Rest 介面的關鍵服務進程,是 Kubernetes 里所有資源的增刪改查等操作的唯一入口,也是集群控制的入口進程
- Kubernetes Controller Manager(kube-controller-manager):Kubernetes 里所有資源對象的自動化控制中心
- Kubernetes Scheduler(kube-scheduler):負責資源調度(Pod 調度)的進程 此外在 Master 上通常還需要不是 etcd 服務,因為 Kubernetes 里的所有資源對象的數據都被保存在 etcd 中。Node Node 是 Kubernetes 集群中的工作負載的節點,每個 Node 都會被 Master 分配一些工作負載(docker 容器)。 在 Node 上運行著以下關鍵進程:
- kubelet:負責 Pod 對應的容器的創建、啟停等任務,同時與 Master 密切協助,實現集群管理的基本功能
- kube-proxy:實現 Kubernetes Service 的通訊與負載均衡機制的重要組件
- Docker Engine(Docker):Docker 引擎,負責本機的容器創建和管理工作
Pod
每個 Pod 都有一個特殊的被稱為「根容器」的 Pause 容器,除了 Pause 容器,每個 Pod 還包含一個或多個緊密相關的用戶業務容器。 Kubernetes 為每個 Pod 都分配了一個唯一的 IP 地址,稱之為 Pod IP,一個 Pod 里的多個容器共享 Pod IP 地址。 在 Kubernetes 里,一個 Pod 里的容器與另外主機上的 Pod 里的容器能夠直接通訊。 為什麼要有一個 Pause 容器? 1.引入業務無關的且不易死亡的 Pause 容器作為 Pod 的根容器,以它的狀態代表整個容器組的狀態。 2.Pod 里的多個業務容器共享 Pause 容器的 IP,共享 Pause 容器掛載的 Volume,簡化了密切關聯的業務容器之間的通訊問題,也解決了他們之間的文件共享問題。
Label
Label(標籤)是 Kubernetes 系統中另外一個核心概念。一個 Label 是一個 key=value 的鍵值對,其中 key 與 value 由用戶自己指定。Label 可以被附加到各種資源對象上,例如 Node、Pod、Service、RC 等,一個資源對象可以定義任意數量的 Label ,同一個 Label 也可以被添加到任意數量的資源對象上。Label 通常在資源對象定義的時確定,也可以在對象創建後動態的添加或者刪除。
Replication Controller
RC 的定義包括以下幾個部分:
- Pod 期待的副本數量
- 用於篩選目標 Pod 的 Label Selector
- 當 Pod 的副本數量小於預期數量時,用於創建新 Pod 的 Pod 模板(template) Replica Set 與 Deployment 這兩個重要的資源對象逐步替代了之前 RC 的作用。 RC(Replica Set)的一些特性與作用:
- 在大多數的情況下,我們通過定義一個 RC 實現 Pod 的創建及副本數量的自動控制
- 在 RC 里包括完成的 Pod 定義模板
- RC 通過 Label Selector 機制實現對 Pod 副本的自動控制
- 通過改變 RC 里的 Pod 副本數量,可以實現 Pod 的擴容和縮容
- 通過改變 RC 里 Pod 模板中的鏡像版本,可以實現 Pod 的滾動升級
Deployment
Deployment 內部使用了 Replica Set 來實現目的。 Deployment 的典型使用場景有以下幾個:
- 創建一個 Deployment 對象來生成對應的 Replica Set 並完成 Pod 副本的創建
- 檢查 Deployment 的狀態來看部署動作是否完成(Pod 副本數量是否達到預期的值)
- 更新 Deployment 以創建新的 Pod(比如鏡像升級)
- 如果當前 Deployment 不穩定,則回滾到一個早先的 Deployment 版本
- 暫停 Deployment 以便於一次性修改多個 PodTemplateSpec 的配置項,之後在恢復 Deployment ,進行先得發布
- 擴展 Deployment 以應對高負載
- 查看 Deployment 的狀態,以此作為發布是否成功的指標
- 清理不再需要的舊版本 ReplicaSets
Horizontal Pod Autoscaler
Horizontal Pod Autoscaler(Pod 橫向自動擴容,HPA)通過追蹤分析指定 RC 控制的所有目標 Pod 的負載變化情況,來確定是否需要有針對性的調整目標 Pod 的副本數量。 HPA 有以下兩種方式作為 Pod 負載的度量指標:
- CPUUtilizationPercenta
- 應用程式自定義的度量指標,比如服務在每秒內的請求數(TPS 或 QPS)
StatefulSet
在 Kubernetes 系統中,Pod 的管理對象 RC、Deployment、DaemonSet 和 Job 都面向無狀態的服務。 StatefulSet 從本質上來說,可以看作 Deployment/RC 的一個特殊變種,它有如下特性:
- StatefulSet 里的每個 Pod 都有穩定、唯一的網路標識,可以用來發現集群內的其他成員
- StatefulSet 控制的 Pod 副本啟停順序是受控的,操作第 n 個 Pod 時,前 n-1 個 Pod 已經是運行且準備好的狀態
- StatefulSet 里的 Pod 採用穩定的持久化存儲卷,通過 PV 或 PVC 來實現,刪除 Pod 時默認不會刪除與 StatefulSet 相關的存儲卷。
Service
Kubernetes 的 Service 定義了一個服務的訪問入口地址,每個 Service 都有唯一的 Cluster IP 及唯一的名稱。 Kubernetes 里的 3 種 IP:
- Node IP: Node 的 IP 地址
- Pod IP: Pod 的 IP 地址
- Cluster IP: Service 的 IP 地址
Job
Job 控制一組 Pod 容器,Job 也是一種特殊的 Pod 副本自動控制器。Job 控制 Pod 副本與 RC 等控制器的工作機制有以下區別:
- Job 所控制的 Pod 副本是短暫運行的,可以將其視為一組 Docker 容器,其中每個 Docker 容器都僅運行一次。當 Job 控制的所有 Pod 副本都運行結束時,對應的 Job 也就結束了。Job 在實現方式上與 RC 等副本控制器不同,Job 生成的 Pod 副本是不能自動重啟的,對應 Pod 副本的 RestartPolicy 都被設置為 Never.
- Job 所控制的 Pod 副本的工作模式能夠多實例並行計算。
Volume
Volume 是 Pod 中能夠被多個容器訪問的共享目錄。 Kubernetes 提供了以下的 Volume 類型:
- emptyDir 一個 emptyDir Volume 是在 Pod 分配到 Node 的時創建的。他的初始內容為空,並且無需指定宿主機上對應的目錄文件。Kubernetes 自動分配一個目錄,當 Pod 從 Node 上面移除時, emptyDir 中的數據也會被永久刪除。emptyDir 的一些用途如下:
- 臨時空間,例如某些程式運行時所需的臨時目錄
- 長時間任務的中間過程 CheckPoint 的臨時保存目錄
- 一個容器需要從另一個容器中獲取數據的目錄(多容器共享目錄)
- hostPath hostPath 為在 Pod 上掛載宿主機上的文件或目錄,通常用於以下幾個方面:
- 容器應用程式生成的日誌文件需要永久保存時,可以使用宿主機的高速文件系統進行存儲
- 需要訪問宿主機上 Docker 引擎內部數據結構的容器應用時,可以通過定義 hostPath 為宿主機 /var/lib/docker 目錄,使容器內部應用可以直接訪問 Docker 的文件系統 在使用 hostpath 時,需要注意以下幾點:
- 在不同的 Node 上具有相同配置的 Pod,可能會因為宿主機上的目錄和文件不同而導致 Volume 上目錄和文件的訪問結果不一致
- 如果使用了資源配額管理,則 Kubernetes 無法將 hostPath 在宿主機上使用的資源納入管理
- gcePersistentDisk 使用Google雲提供永久磁碟,當 Pod 被刪除時,PD 只是被卸載,不會被刪除。需要在Google雲環境中使用。
- awsElasticBlockStore 使用 AWS 提供的 EBS Volume 存儲數據,需要在 AWS 環境中使用。
- NFS 使用 NFS 網路文件系統提供共享目錄存儲數據。
- 其他類型的 Volume
- iscsi: 使用 iSCSI 存儲設備上的目錄掛載到 Pod 中
- flocker: 使用 Flocker 管理存儲卷
- glusterfs: 使用開源 GlusterFS 網路文件系統的目錄掛載到 Pod 中
- rbd: 使用 Ceph 塊設備共享存儲掛載到 Pod 中
- gitRepo: 通過掛載一個空目錄,並從 Git 庫 clone 一個git repository 供 Pod 使用
- secret: 一個 Secret Volume 用於為 Pod 提供加密的資訊,可以將定義在 Kubernetes 中的 Secret 直接掛載為文件讓 Pod 訪問。
Persistent Volume
PV 可以被理解成 Kubernetes 集群中的某個網路存儲對應的一塊存儲,它與 Volume 類似,但有以下區別。
- PV 只能是網路存儲,不屬於任何 Node,但可以在每個 Node 上訪問
- Pv 並不是定義在 Pod 上,而是獨立於 Pod 之外定義的
- PV 目前支援的類型包括: gcePersistentDisk、awsElasticBlockStore、AzureFile、AzureDisk、FC、Flocker、NFC、iSCSI、RBD、CephFS、Cinder、GlusterFS、VsphereVolume、Quobyte Volumes、VMware Photon、Portworx Volumes、ScaleIO Volumes 和 hostPath(僅供單機測試)
PV 的 accessModes 屬性:
- ReadWriteOnce: 讀寫許可權,並且只能被單個 Node 掛載
- ReadOnlyMany: 只讀許可權,允許被多個 Node 掛載
- ReadWriteMany: 讀寫許可權,允許被多個 Node 掛載
PV 的狀態:
- Available:空閑狀態
- Bound: 已經綁定到某個 PVC 上面
- Released: 對應的 PVC 已經被刪除,但是資源還沒有被集群回收
- Failed: PV 自動回收失敗
Namespace
Namespace 在很多情況下用於實現多租戶的資源隔離,可以給每個租戶創建一個 Namespace 來實現多租戶的資源隔離。
Annotation
Annotation 與 Label 類似,也使用 key/value 鍵值對的形式進行定義。不同的是 Label 就有嚴格的命名規則,它定義的是 Kubernetes 對象的元數據,並且用於 Label Selector。Annotation 則是用戶任意定義的附加資訊,以便於外部工具查找。Kubernetes 的模組自身會通過 Annotation 標記資源對象的一些特殊資訊。 通常來說,用 Annotation 來記錄的資訊如下:
- build 資訊、release 資訊、Docker 鏡像資訊等,例如書簡戳、release id 號、PR 號、鏡像 Hash 值、Docker registry 地址等
- 日誌庫、監控庫、分析庫等資源庫的資訊
- 程式調試工具資訊,例如工具名稱、版本號等
- 團隊的聯繫資訊,例如電話號碼、負責人名稱、網址等
ConfigMap
首先,把所有的配置項都當作 key-value 字元串,這些配置項可以作為 Map 表中的一個項,整個 Map 的數據可以被持久化存儲在 Kubernetes 的 Etcd 資料庫中,然後提供 API 以方便 Kubernetes 相關組件或客戶應用 CRUD 操作這些數據,上述專門用於保存配置參數的 Map 就是 Kubernetes ConfigMap 資源對象。 接下來,Kubernetes 提供了一種內建機制,將存儲在 etcd 中的 ConfigMap 通過 Volume 映射的方式變成目標 Pod 內的配置文件,不管 Pod 被調度到哪台伺服器上,都會完成自動映射。進一步地,如果 ConfigMap 中的 key-value 數據被修改,則映射到 Pod 中的「配置文件」也會隨之更新。
附錄
整理自 《Kubernetes 權威指南(第4版)》