在上一篇文章中工育,我們一起了解了 Kubernetes 提供的資源,重點講解了通過 yaml 的方式創(chuàng)建 Pod ,以及 Pod 和容器的生命周期。
這種創(chuàng)建 Pod 的方式我們稱為 **自主式創(chuàng)建 Pod **摩梧,當 Pod 退出了,此類型的 Pod 不會被創(chuàng)建宣旱,如上一節(jié)講的那樣仅父,我使用 kubectl delete pod podname
刪除 Pod 后不會自動創(chuàng)建。
還有一種創(chuàng)建 Pod 的方式我們稱為 控制器管理的 Pod浑吟, 通過字面意思應該能想到驾霜,這種 Pod 會被管理起來,始終要維持 Pod 副本的數(shù)量买置,即當 Pod 刪除之后會被自動創(chuàng)建。
通過這篇文章你將了解到這些 控制器
一强霎、什么是控制器
Kubernetes 中內(nèi)建了很多 controller(控制器)忿项,這些相當于一個狀態(tài)機,用來控制 Pod 的具體狀態(tài)和行為城舞。
二轩触、控制器類型
- ReplicationController 和 ReplicaSet
- Deployment
- DaemonSet
- StatefulSet
- Job/CronJob
- Horizontal Pod Autoscaling
2.1 ReplicationController 和 ReplicaSet
ReplicationController(RC)用來確保容器應用的副本數(shù)始終保持在用戶定義的副本數(shù),即如果有容器異常退出家夺,會自動創(chuàng)建新的 Pod 來替代脱柱;而如果異常多出來的容器也會自動回收。
在新版本的 Kubernetes 中建議使用 ReplicaSet 來取代 ReplicationController拉馋,ReplicaSet 跟 ReplicationController 沒有本質(zhì)的不同榨为,只是名字不一樣,并且 ReplicaSet 支持集合式的 selector煌茴。
2.2 Deployment
Deployment 為 Pod 和 ReplicaSet 提供了一個聲明式定義方法随闺,用來替代以前的 ReplicationController 來方便的管理應用。
命令式和聲明式
命令式編程:它側(cè)重于如何實現(xiàn)程序蔓腐,就像我們剛接觸編程的時候那樣矩乐,我們需要把程序的實現(xiàn)過程按照邏輯結(jié)果一步步寫下來。
聲明式編程:它側(cè)重于想要什么,然后告訴計算機/引擎散罕,讓它幫你去實現(xiàn)分歇。
典型的應用場景包括:
- 定義 Deployment 來創(chuàng)建 Pod 和 ReplicaSet(Deployment 并不是直接管理 Pod,而是通過 RS 去管理 Pod)
- 滾動升級和回滾應用
- 擴容和縮容
- 暫停和繼續(xù) Deployment
2.3 DeamonSet
DaemonSet 確保全部(或者一些)Node上運行一個 Pod 的副本欧漱。當有 Node 加入集群時职抡,也會為它們新增一個 Pod,當有 Node 從集群移除時硫椰,這些 Pod 也會被回收繁调。刪除 DaemonSet 將會刪除它創(chuàng)建的所有 Pod。
使用 DaemonSet 的一些典型用法:
- 運行集群存儲 deamon靶草,例如在每個 Node 上運行
glusterd
蹄胰、ceph
- 在每個 Node 上運行日志收集 deamon,例如
fluentd
奕翔、logstash
- 在每個 Node 上運行監(jiān)控 daemon裕寨,例如
Prometheus Node Exporter
2.4 Job
Job 負責批處理任務,即僅執(zhí)行一次的任務派继,它保證批處理任務的一個或多個 Pod 成功結(jié)束宾袜。
2.5 CronJob
Cron Job 管理基于時間的 Job,即:
- 在給定時間點只運行一次
- 周期性地在給定時間點運行
典型的用法示例:
- 在給你寫的時間點調(diào)度 Job 運行
- 創(chuàng)建周期性運行的 Job驾窟,例如:數(shù)據(jù)庫備份庆猫、發(fā)送郵件
2.6 StatefulSet
StatefulSet 作為 Controller 為 Pod 提供唯一的標識,它可以保證部署和 scale 的順序绅络。
StatefulSet 是為了解決有狀態(tài)服務的問題(對應 Deployment 和 ReplicaSet 是為無狀態(tài)服務而設計)月培,其應用場景包括:
- 穩(wěn)定的持久化存儲,即 Pod 重新調(diào)度后還是能訪問到相同的持久化數(shù)據(jù)恩急,基于 PVC 來實現(xiàn)
- 穩(wěn)定的網(wǎng)絡標識杉畜,即 Pod 重新調(diào)度后其 Pod Name 和 Host Name 不變,基于 Headless Service (即沒有 Cluster IP 的 Service)來實現(xiàn)
- 有序部署衷恭、有序擴展此叠,即 Pod 是有順序的,在部署或者擴展的時候要住所定義的順序依次進行(即從 0 到 N-1随珠,在下一個 Pod 運行之前所有之前的 Pod 必須都是 Running 和 Ready 狀態(tài))灭袁,基于 init containers 來實現(xiàn)
- 有序收縮,有序刪除(即從 N-1 到 0 )
2.7 Horizontal Pod Autoscaling
顧名思義窗看,使 Pod 水平自動縮放简卧,提高集群的整體資源利用率。
Horizontal Pod Autoscaling 僅適用于 Deployment 和 ReplicaSet烤芦。在 v1 版本中僅支持根據(jù) Pod 的 CPU 利用率擴縮容举娩,在 v1alpha 版本中,支持根據(jù)內(nèi)存和用戶自定義的 metric 擴縮容。
下篇文章將對以上幾種類型的控制器單獨講解铜涉。