Pod的分類
- 自助式Pod: pod退出了,此類型的pod不會被創建
- 控制器管理的Pod:在控制器的生命周期里,始終要維持Pod的副本數
什么是控制器
Kubernetes 中內建了很多 controller(控制器),這些相當於一個狀態機,用來控制 Pod 的具體狀態和行為
控制器類型
- ReplicationController 和 ReplicaSet
- Deployment
- DaemonSet
- StateFulSet J
- ob/CronJob
- Horizontal Pod Autoscaling
ReplicationController 和 ReplicaSet
ReplicationController(RC)用來確保容器應用的副本數始終保持在用戶定義的副本數,即如果有容器異常退 出,會自動創建新的 Pod 來替代;而如果異常多出來的容器也會自動回收;
在新版本的 Kubernetes 中建議使用 ReplicaSet 來取代 ReplicationController 。ReplicaSet 跟 ReplicationController 沒有本質的不同,只是名字不一樣,並且 ReplicaSet 支持集合式的 selector;
Deployment
Deployment 為 Pod 和 ReplicaSet 提供了一個聲明式定義 (declarative) 方法,用來替代以前的 ReplicationController 來方便的管理應用。典型的應用場景包括;
- 定義 Deployment 來創建 Pod 和 ReplicaSet
- 滾動升級和回滾應用
- 擴容和縮容
- 暫停和繼續 Deployment
DaemonSet
DaemonSet 確保全部(或者一些)Node 上運行一個 Pod 的副本。當有 Node 加入集群時,也會為他們新增一個 Pod 。當有 Node 從集群移除時,這些 Pod 也會被回收。刪除 DaemonSet 將會刪除它創建的所有 Pod
使用 DaemonSet 的一些典型用法:
- 運行集群存儲 daemon,例如在每個 Node 上運行 glusterd 、 ceph
- 在每個 Node 上運行日志收集 daemon,例如 fluentd 、 logstash
- 在每個 Node 上運行監控 daemon,例如 Prometheus Node Exporter、 collectd 、Datadog 代理、 New Relic 代理,或 Ganglia gmond
Job
Job 負責批處理任務,即僅執行一次的任務,它保證批處理任務的一個或多個 Pod 成功結束
CronJob
Cron Job 管理基於時間的 Job,即:
- 在給定時間點只運行一次
- 周期性地在給定時間點運行
使用前提條件:**當前使用的 Kubernetes 集群,版本 >= 1.8(對 CronJob)。對於先前版本的集群,版本 < 1.8,啟動 API Server時,通過傳遞選項 --runtime-config=batch/v2alpha1=true 可以開啟 batch/v2alpha1 API**
典型的用法如下所示:
- 在給定的時間點調度 Job 運行
- 創建周期性運行的 Job,例如:數據庫備份、發送郵件
StatefulSet
StatefulSet 作為 Controller 為 Pod 提供唯一的標識。它可以保證部署和 scale 的順序
StatefulSet是為了解決有狀態服務的問題(對應Deployments和ReplicaSets是為無狀態服務而設計),其應用 場景包括:
- 穩定的持久化存儲,即Pod重新調度后還是能訪問到相同的持久化數據,基於PVC來實現
- 穩定的網絡標志,即Pod重新調度后其PodName和HostName不變,基於Headless Service(即沒有 Cluster IP的Service)來實現
- 有序部署,有序擴展,即Pod是有順序的,在部署或者擴展的時候要依據定義的順序依次依次進行(即從0到 N-1,在下一個Pod運行之前所有之前的Pod必須都是Running和Ready狀態),基於init containers來實 現
- 有序收縮,有序刪除(即從N-1到0)
Horizontal Pod Autoscaling
應用的資源使用率通常都有高峰和低谷的時候,如何削峰填谷,提高集群的整體資源利用率,讓service中的Pod 個數自動調整呢?這就有賴於Horizontal Pod Autoscaling了,顧名思義,使Pod水平自動縮放