10.Controller詳解
1.Statefulset
Statefulset主要是用來部署有狀態應用
對於StatefulSet中的Pod,每個Pod掛載自己獨立的儲存,如果一個Pod出現故障,從其他節點啟動一個同樣名字的Pod,要掛載上原來Pod的儲存繼續以它的狀態提供服務。
1.1 無狀態應用
我們原來使用 deployment,部署的都是無狀態的應用,那什麼是無狀態應用?
- 認為Pod都是一樣的
- 沒有順序要求
- 不考慮應用在哪個node上執行
- 能夠進行隨意伸縮和擴充套件
1.2 有狀態應用
上述的因素都需要考慮到
- 讓每個Pod獨立的
- 讓每個Pod獨立的,保持Pod啟動順序和唯一性
- 唯一的網路識別符號,持久儲存
- 有序,比如mysql中的主從
適合StatefulSet的業務包括資料庫服務MySQL 和 PostgreSQL,叢集化管理服務Zookeeper、etcd等有狀態服務
StatefulSet的另一種典型應用場景是作為一種比普通容器更穩定可靠的模擬虛擬機器的機制。傳統的虛擬機器正是一種有狀態的寵物,運維人員需要不斷地維護它,容器剛開始流行時,我們用容器來模擬虛擬機器使用,所有狀態都儲存在容器裡,而這已被證明是非常不安全、不可靠的。
使用StatefulSet,Pod仍然可以通過漂移到不同節點提供高可用,而儲存也可以通過外掛的儲存來提供 高可靠性,StatefulSet做的只是將確定的Pod與確定的儲存關聯起來保證狀態的連續性。
1.3部署有狀態應用
無頭service, ClusterIp:none
這裡就需要使用 StatefulSet部署有狀態應用
然後通過檢視pod,能否發現每個pod都有唯一的名稱
然後我們在檢視service,發現是無頭的service
這裡有狀態的約定,肯定不是簡簡單單通過名稱來進行約定,而是更加複雜的操作
- deployment:是有身份的,有唯一標識
- statefulset:根據主機名 + 按照一定規則生成域名
每個pod有唯一的主機名,並且有唯一的域名
- 格式:主機名稱.service名稱.名稱空間.svc.cluster.local
- 舉例:nginx-statefulset-0.default.svc.cluster.local
2.DaemonSet
DaemonSet 即後臺支撐型服務,主要是用來部署守護程序
長期伺服型和批處理型的核心在業務應用,可能有些節點執行多個同類業務的Pod,有些節點上又沒有這類的Pod執行;而後臺支撐型服務的核心關注點在K8S叢集中的節點(物理機或虛擬機器),要保證每個節點上都有一個此類Pod執行。節點可能是所有叢集節點,也可能是通過 nodeSelector選定的一些特定節點。典型的後臺支撐型服務包括:儲存、日誌和監控等。在每個節點上支撐K8S叢集執行的服務。
守護程序在我們每個節點上,執行的是同一個pod,新加入的節點也同樣執行在同一個pod裡面
- 例子:在每個node節點安裝資料採集工具
這裡是不是一個FileBeat映象,主要是為了做日誌採集工作
進入某個 Pod裡面,進入
kubectl exec -it ds-test-cbk6v bash
通過該命令後,我們就能看到我們內部收集的日誌資訊了
3.Job和CronJob
一次性任務 和 定時任務
- 一次性任務:一次性執行完就結束
- 定時任務:週期性執行
Job是K8S中用來控制批處理型任務的API物件。批處理業務與長期伺服業務的主要區別就是批處理業務的執行有頭有尾,而長期伺服業務在使用者不停止的情況下永遠執行。Job管理的Pod根據使用者的設定把任務成功完成就自動退出了。成功完成的標誌根據不同的 spec.completions 策略而不同:單Pod型任務有一個Pod成功就標誌完成;定數成功行任務保證有N個任務全部成功;工作佇列性任務根據應用確定的全域性成功而標誌成功。
3.1 Job
Job也即一次性任務
使用下面命令,能夠看到目前已經存在的Job
kubectl get jobs
在計算完成後,通過命令檢視,能夠發現該任務已經完成
我們可以通過檢視日誌,檢視到一次性任務的結果
kubectl logs pi-qpqff
3.2 CronJob
定時任務,cronjob.yaml如下所示
這裡面的命令就是每個一段時間,這裡是通過 cron 表示式配置的,通過 schedule欄位
然後下面命令就是每個一段時間輸出
我們首先用上述的配置檔案,建立一個定時任務
kubectl apply -f cronjob.yaml
建立完成後,我們就可以通過下面命令檢視定時任務
kubectl get cronjobs
我們可以通過日誌進行檢視
kubectl logs hello-1599100140-wkn79
然後每次執行,就會多出一個 pod
4.刪除svc 和 statefulset
使用下面命令,可以刪除我們新增的svc 和 statefulset
kubectl delete svc web
kubectl delete statefulset --all
5.Replication Controller
Replication Controller 簡稱 RC,是K8S中的複製控制器。RC是K8S叢集中最早的保證Pod高可用的API物件。通過監控執行中的Pod來保證叢集中執行指定數目的Pod副本。指定的數目可以是多個也可以是1個;少於指定數目,RC就會啟動新的Pod副本;多於指定數目,RC就會殺死多餘的Pod副本。
即使在指定數目為1的情況下,通過RC執行Pod也比直接執行Pod更明智,因為RC也可以發揮它高可用的能力,保證永遠有一個Pod在執行。RC是K8S中較早期的技術概念,只適用於長期伺服型的業務型別,比如控制Pod提供高可用的Web服務。
5.1Replica Set
Replica Set 檢查 RS,也就是副本集。RS是新一代的RC,提供同樣高可用能力,區別主要在於RS後來居上,能夠支援更多種類的匹配模式。副本集物件一般不單獨使用,而是作為Deployment的理想狀態引數來使用