Kubernetes的控制器类型即使用案例
什么是控制器
Kubernetes中內建了很多的controller(控制器),這些控制器相當于一個狀態機,用來控制Pod的具體狀態和行為
控制器的類型
ReplicationController和ReplicaSet
ReplicationController(RC)用來確保容器應用的副本數始終維持在用戶定義的副本數,即如果有容器異常退出,會自動創建新的Pod來替代,而如果異常多出來的容器也會自動回收。
在新版本的Kubernetes中建議使用ReplicaSet來取代ReplicationController,ReplicaSet跟ReplicationController沒有本質的區別,只是名字不一樣,并且ReplicaSet支持集合式的selector(標簽)。
apiVersion: extensions/v1beta1 kind: ReplicaSet metadata:name: frontend spec:replicas: 3selector:natchLatels:tier: frontendtemplate:metadata:latels:tier: frontendsepc:containsers:- name: myappimage: myapp:v1env:- name: GET_HOST_FROMvalues: dnsports:- containerPort: 80Deployment
Deployment為Pod和ReplicaSet提供了一個聲明式定義(declarative)方法,用來替代以前的ReplicationController類方便的管理應用,典型的應用場景包括:
- 定義Deployment來創建Pod和ReplicaSet
- 滾動升級和回滾應用
- 擴容和縮容
- 暫停和繼續Deployment
擴容
kubectl scale deployment nginx-deployment --replicats 10如果集群支持HPA的話,還可以為Deployment設置自動擴展
kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80更新鏡像也比較簡單
kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1回滾
kubectl rollout undo deployment/nginx-deployment kubectl rollout status deployments nginx-deployment #查看回滾狀態 kubectl rollout history deployment/nginx-deployment #查看回滾歷史 kubectl rollout pause deployment/nginx-deployment #暫停deployment的更新DaemonSet
Daemon確保全部或者一些Node上運行一個Pod的副本,當有Node加入集群時,也會為他們新增一個Pod,當有Node從集群移除時,這些Pod也會被回收,刪除DaemonSet將會刪除它創建的所有Pod
使用DaemonSet的一些典型用法:
- 運行集群存儲daemon,如glusterd、ceph
- 在每個Node上運行日志手機daemon,如fluentd、logstash
- 在每個Node上運行監控daemon,如prometheus Node Exporter、colletcd、Datadog代理、New Relic代理,或Ganglia gmond
StateFulSet
StateFulSet作為Controller為Pod提供唯一的標識,它可以保證部署和scale的順序
StateFulSet是為了解決有狀態服務的問題,對應Deployment和ReplicaSet是為無狀態服務而設計的,器應用場景包括:
- 穩定的持久化存儲,即Pod重新調度后還能訪問到相同的持久化數據,基于PVC來實現
- 穩定的網絡標識,即Pod重新調度后其PodName和HostName不變,基于Headless Service(即沒有Cluster IP的Service)來實現
- 有序部署,有序擴展,即Pod是有順序的,在部署或者擴展的時候要依據定義的順序依次進行(即從0到N-1,在下一個Pod運行之前所有之前的Pod必須都是Runing和Ready狀態),基于init containers來實現
- 有序收縮,有序刪除(即從N-1到0)
Job/CronJob
Job負責批處理任務,即僅執行一次任務,它保證批處理任務的一個或者多個Pod成功結束
CronJob管理基于時間的Job,即:
- 在給定時間只運行一次
- 周期性地在給定時間點運行
典型應用場景如數據庫備份,發送郵件等
Job
apiVersion: batch/v1 kind: Job metadata:name: pi spec:templata:metadata:name: pispec:containers:- name: piimage: perlcommand: ["perl","-Mbignum=bpi","-wle","print bpi(2000)"]restartPolicy: NeverCronJob
apiVersion: batch/v1beta1 kind: CronJob metadata:name: hello spec:schedule: "*/1 * * * *" #必須填寫的字段completions: 1 #標志Job結束需要成功運行的Pod個數,默認為1parallelism: 1 #標志并行運行的Pod個數,默認為1activeDeadlineSeconds: 5 #標志失敗Pod的重試最大時間,超過這個時間不會繼續重試startingDeadlinSeconds: 5 #啟動Job的期限(秒級別)concurrencyPolicy: Allow #并發策略,可選Allow(默認)允許并發運行Job、Forbid禁止編發運行、Replace替換jobTemplate: #必須填寫的字段spec:template:spec:containers:- name: helloimage: busyboxargs:- /bin/sh- -c- date: echo Hello from the Kubernetes clusterrestartPolicy: OnFailureHorizontal Pod Autoscaling
應用的資源使用率通常都有高峰和低谷的時候,如何削峰填谷,提高集群的整體資源利用率,讓service中的Pod個數自動調整呢?這就要依賴于Horizontal Pod Autoscaling了,即Pod的水平自動縮放
總結
以上是生活随笔為你收集整理的Kubernetes的控制器类型即使用案例的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Kubernetes中Pod的生命周期
- 下一篇: Kubernetes中Service的种