kubernetes&&基礎學習2
資源控制器
什麼是控制器
Kubernetes中內建了很多controller(控制器),這些相當於一個狀態機,用來控制Pod的具體狀態和行爲
控制器類型
- ReplicationController和ReplicaSet
- Deployment
- DaemonSet
- StateFulSet
- Job/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
命令式編程:命令式編程側重於如何實現程序,就像我們剛接觸編程的時候那樣,我們需要把程序的實現過程按照邏輯結果一步步寫下來。如常見的函數編寫
聲明式編程:聲明式編程側重於定義想要什麼,然後告訴計算機或引擎,讓他幫你去實現。如sql語句
DaemonSet
DaemonSet確保全部(或者一些)Node上運行一個Pod的副本。當有Node加入集羣時,也會爲他們新增一個Pod。當有Node從集羣移除時,這些Pod也會被回收。刪除DaemonSet將會刪除它創建的所有Pod。
使用DaemonSet的一些典型用法:
- 運行集羣存儲daemon,例如在每個Node上運行glusterd、ceph
- 在每個Node上運行日誌收集daemon,例如fluentd、logstash
- 在每個Node上運行監控daemon,例如Promethus Node Exporter、collectd、Datadog代理、New Relic代理、Ganglia gmond
DaemonSet定義的副本數有且僅有一個。如果想在一個Node上運行多個DaemonSet,就需要定義多個DaemonSet的運行方案。
Job
Job負責批處理任務,即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束
CronJob(在特定的時間循環創建Job)
CronJob管理基於時間的Job,即:
- 在給定時間點只運行一次
- 週期性地在給定時間點運行
**使用前提條件:**當前使用的kubernetes集羣,版本>=1.8(對CronJon)。對於先前版本的集羣,版本 < 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水平自動縮放。
ReplicationController 和 ReplicaSet
示例:
# 查看Pod並顯示其標籤
kubectl get pod --show-labels
# 更改指定Pod的標籤名稱
kubectl label pod frontend-m8hpc tier=newfrontend --overwrite=True
# 刪除所有rs
kubectl delete rs --all
# 刪除所有Pod
kubectl delete pod --all
Deployment
# 創建一個Deployment
kubectl apply -f deployment.yaml --record
# 查詢Deployment
kubectl get deployment
# 查詢rs
kubectl get rs
# 查詢Pod
kubectl get pod
# 查詢Pod詳細信息
kubectl get pod -o wide
DaemonSet
Job
# 查看目標Pod當前創建進度
kubectl describe pod pi-f2fb
# 查看當前全部任務
kubectl get job
# 查看kubectl的log
kubectl log pi-7mbjq
CronJob Spec
# 查看所有CronJob
kubectl get cronjob
# 刪除所有CronJob
kubectl delete cronjob --all