第八章 資源控制器


一、什么是控制器

Kubernetes 中內建了很多 controller(控制器),這些相當於一個狀態機,用來控制 Pod 的具體狀態和行為

二、控制器類型

① ReplicationController ReplicaSet

② Deployment

③ DaemonSet

④ StateFulSet

⑤ Job/CronJob

⑥ Horizontal Pod Autoscaling

1ReplicationController ReplicaSet

ReplicationControllerRC)用來確保容器應用的副本數始終保持在用戶定義的副本數,即如果有容器異常退出,會自動創建新的 Pod 來替代;而如果異常多出來的容器也會自動回收;在新版本的 Kubernetes 中建議使用 ReplicaSet 來取代 ReplicationController ReplicaSet ReplicationController 沒有本質的不同,只是名字不一樣,並且 ReplicaSet 支持集合式的 selector(標簽

2Deployment

Deployment Pod ReplicaSet 提供了一個聲明式定義 (declarative) 方法,用來替代以前的ReplicationController 來方便的管理應用。典型的應用場景包括;

① 定義 Deployment 來創建 Pod ReplicaSet

② 滾動升級和回滾應用

③ 擴容和縮容

④ 暫停和繼續 Deployment

滾動更新:會創建一個新副本的rs1,舊的rspod減少一個時,rs1會新加一個,直到全部增減完成

  

回滾:同理,需要恢復舊的rs時,會啟動rs,再進行增減操作

3DaemonSet

DaemonSet確保全部(或者一些)Node 上運行一個 Pod 的副本。當有 Node 加入集群時,也會為他們新增一個Pod 。當有 Node 從集群移除時,這些 Pod 也會被回收。刪除 DaemonSet 將會刪除它創建的所有 Pod

使用 DaemonSet 的一些典型用法:

① 運行集群存儲 daemon,例如在每個 Node 上運行glusterdceph

② 在每個 Node 上運行日志收集 daemon,例如fluentdlogstash

③ 在每個 Node 上運行監控 daemon,例如Prometheus Node ExportercollectdDatadog 代理、New Relic 代理,或 Ganglia gmond

  Job 負責批處理任務,即僅執行一次的任務,它保證批處理任務的一個或多個 Pod 成功結束

4CronJobCron Job

管理基於時間的 Job,即:

  • 在給定時間點只運行一次
  • 周期性地在給定時間點運行

使用前提條件:**當前使用的 Kubernetes 集群,版本 >= 1.8(對 CronJob)。對於先前版本的集群,版本 <1.8,啟動 API Server時,通過傳遞選項--runtime-config=batch/v2alpha1=true可以開啟 batch/v2alpha1API**

典型的用法如下所示:

在給定的時間點調度 Job 運行

創建周期性運行的 Job,例如:數據庫備份、發送郵件

5StatefulSet

StatefulSet 作為 Controller Pod 提供唯一的標識。它可以保證部署和 scale 的順序

StatefulSet是為了解決有狀態服務的問題(對應DeploymentsReplicaSets是為無狀態服務而設計),其應用場景包括:

① 穩定的持久化存儲,即Pod重新調度后還是能訪問到相同的持久化數據,基於PVC來實現

② 穩定的網絡標志,即Pod重新調度后其PodNameHostName不變,基於Headless Service(即沒有Cluster IPService)來實現

③ 有序部署,有序擴展,即Pod是有順序的,在部署或者擴展的時候要依據定義的順序依次依次進行(即從0N-1,在下一個Pod運行之前所有之前的Pod必須都是RunningReady狀態),基於init containers來實現

④ 有序收縮,有序刪除(即從N-10

6Horizontal Pod Autoscaling(HPA )

應用的資源使用率通常都有高峰和低谷的時候,如何削峰填谷,提高集群的整體資源利用率,讓service中的Pod個數自動調整呢?這就有賴於Horizontal Pod Autoscaling了,顧名思義,使Pod水平自動縮放

二、控制器實例

1RS RC Deployment 關聯RC ReplicationController

主要的作用就是用來確保容器應用的副本數始終保持在用戶定義的副本數。即如果有容器異常退出,會自動創建新的Pod來替代;而如果異常多出來的容器也會自動回收

Kubernetes 官方建議使用 RSReplicaSet )替代 RC ReplicationController )進行部署,RS RC 沒有本質的不同,只是名字不一樣,並且 RS 支持集合式的 selector

查看RS完整模板信息:kubectl explain rs

RS創建模板

apiVersion: extensions/v1beta1

kind: ReplicaSet

metadata:

  name: frontend

spec:

  replicas: 3

  selector:

    matchLabels:

      tier: frontend

  template:

    metadata:

      labels:

        tier: frontend

    spec:

      containers:

      - name: myapp

        image: hub.lqz.com/library/nginx:latest

        env:

        - name: GET_HOSTS_FROM

          value: dns

        ports:

        - containerPort: 80

 

 

資源控制器所創建的pod,刪除后會被新建

kubectl get pod --show-labels  查看標簽

2RS Deployment 的關聯

 

Deployment Pod ReplicaSet 提供了一個聲明式定義(declarative)方法,用來替代以前的ReplicationController 來方便的管理應用。典型的應用場景包括:

① 定義Deployment來創建PodReplicaSet

② 滾動升級和回滾

③ 應用擴容和縮容

④ 暫停和繼續Deployment

三、部署一個簡單的 Nginx 應用

1創建

kubectl apply -f deployment.yaml --record

 

apiVersion: extensions/v1beta1

kind: Deployment

metadata:

name: nginx-deployment

spec:

replicas: 3

 template:

metadata:

labels:

 app: nginx

spec:

containers:

 - name: nginx

image: nginx:1.7.9

ports:

- containerPort: 80

 

 

kubectl create -f https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record## --record參數可以記錄命令,我們可以很方便的查看每次 revision 的變化

2、擴容

kubectl scale deployment nginx-deployment --replicas 10

3如果集群支持 horizontal pod autoscaling 的話,還可以為Deployment設置自動擴展

kubectl autoscale deployment nginx-deployment --min=10--max=15--cpu-percent=80

4更新鏡像也比較簡單

kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1

 

5、回滾

kubectl rollout undo deployment/nginx-deployment

6更新 Deployment

6.1假如我們現在想要讓 nginx pod 使用nginx:1.9.1的鏡像來代替原來的nginx:1.7.9的鏡像

$ kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1deployment "nginx-deployment" image updated

6.2可以使用edit命令來編輯 Deployment

$ kubectl edit deployment/nginx-deploymentdeployment "nginx-deployment" edited

6.3查看 rollout 的狀態

$ kubectl rollout status deployment/nginx-deployment

 

Waiting for rollout to finish: 2 out of 3 new replicas have been updated...deployment "nginx-deployment" successfully rolled out

6.4查看歷史 RS

 

 6.5 Deployment 更新策略

  • Deployment 可以保證在升級時只有一定數量的 Pod down 的。默認的,它會確保至少有比期望的Pod數量少一個是up狀態(最多一個不可用)
  • Deployment 同時也可以確保只創建出超過期望數量的一定數量的 Pod。默認的,它會確保最多比期望的Pod數量多一個的 Pod up 的(最多1surge
  • 未來的 Kuberentes 版本中,將從1-1變成25%-25%

6.6Rollover(多個rollout並行)

假如您創建了一個有5niginx:1.7.9 replicaDeployment,但是當還只有3nginx:1.7.9replica 創建出來的時候您就開始更新含有5nginx:1.9.1 replica Deployment。在這種情況下,Deployment 會立即殺掉已創建的3nginx:1.7.9Pod,並開始創建nginx:1.9.1Pod。它不會等到所有的5nginx:1.7.9Pod 都創建完成后才開始改變航道

6.7回退 Deployment

kubectl set image deployment/nginx-deployment nginx=nginx:1.91

kubectl rollout status deployments nginx-deployment

kubectl get pods

kubectl rollout history deployment/nginx-deployment

kubectl rollout undo deployment/nginx-deployment

kubectl rollout undo deployment/nginx-deployment --to-revision=2  ## 可以使用 --revision參數指定某個歷史版本

kubectl rollout pause deployment/nginx-deployment   ## 暫停 deployment 的更新

您可以用kubectl rollout status命令查看 Deployment 是否完成。如果 rollout 成功完成,kubectl rolloutstatus將返回一個0值的 Exit Code

6.8清理 Policy

您可以通過設置.spec.revisonHistoryLimit項來指定 deployment 最多保留多少 revision 歷史記錄。默認的會保留所有的 revision;如果將該項設置為0Deployment 就不允許回退了

 

鏈接:https://www.bilibili.com/video/av66617940/?p=24


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM