Kubernetes 控制器


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

Deployment

Deployment 為 Pod 和 ReplicaSet(副本集) 提供了一個聲明式定義(declarative)方法,用來替代以前的Replication Controller 但是它又具備了Replication Controller之外的新特性,來方便管理應用.

replication controller與deployment的區別:

replication controller特性:

 ● 確保pod數量:它會確保Kubernetes中有指定數量的Pod在運行。如果少於指定數量的pod,Replication Controller會創建新的,反之則會刪除掉多余的以保證Pod數量不變。

 ● 確保pod健康:當pod不健康,運行出錯或者無法提供服務時,Replication Controller也會殺死不健康的pod,重新創建新的。

 ● 彈性伸縮 :在業務高峰或者低峰期的時候,可以通過Replication Controller動態的調整pod的數量來提高資源的利用率。同時,配置相應的監控功能(Hroizontal Pod Autoscaler),會定時自動從監控平台獲取Replication Controller關聯pod的整體資源使用情況,做到自動伸縮。

 ● 滾動升級:滾動升級為一種平滑的升級方式,通過逐步替換的策略,保證整體系統的穩定,在初始化升級的時候就可以及時發現和解決問題,避免問題不斷擴大。

Deployment特性:

 ● Deployment可以看做新一代的Replication Controller。除繼承所有Replication Controller特性外,它又增加了Replication Controller之外的一些新特性:

 ● 回滾:當升級pod鏡像或者相關參數的時候發現問題,可以使用回滾操作回滾到上一個穩定的版本或者指定的版本

 ● 版本記錄: 每一次對Deployment的操作,都能保存下來,給予后續可能的回滾使用

 ● 暫停和啟動:對於每一次升級,都能夠隨時暫停和啟動

 ● 多種升級方案:
   Recreate:刪除所有已存在的pod,重新創建新的;
   RollingUpdate:滾動升級,逐步替換的策略,同時滾動升級時,支持更多的附加參數,例如設置最大不可用pod數量,最小升級間隔時間等等.

deployment的常用命令:

1.使用deployment控制器創建一個Nginx服務.

命令行方式創建:

#kubectl run nginx-deployment --image=nginx --replicas=3 --port=80

為deployment的nginx創建service,並通過Service的8080端口轉發至容器的80端口上

#kubectl expose deployment nginx-deployment --port=8080 --target-port=80 --external-ip=10.20.9.225 

#curl -I nginx-deployment

簡單的yaml文件定義方式創建.

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.8
        ports:
        - containerPort: 80

創建nginx-deployment.

# kubectl create -f nginx-deployment.yaml --record

將kubectl的 --record 的 flag 設置為 true可以在 annotation 中記錄當前命令創建或者升級了該資源。這在未來會很有用,例如,查看在每個 Deployment revision 中執行了哪些命令。

2.擴容,增加副本數量:

#kubectl scale deployment nginx-deployment --replicas 10

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

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

3.升級,將nginx從1.8升級到1.9.1版本.

# kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
deployment.apps "nginx-deployment" image updated

我們也可以使用edit命令來編輯 Deployment,修改 .spec.template.spec.containers[0].image為nginx:1.9.1即可.

#kubectl edit deployment/nginx-deployment
deployment "nginx-deployment" edited

4.檢查 Deployment 升級的歷史記錄

首先,檢查下 Deployment 的 revision:

# kubectl rollout history deployment/nginx-deployment
deployments "nginx-deployment":
REVISION    CHANGE-CAUSE
1           kubectl create -f nginx-deployment.yaml --record
2           kubectl set image deployment/nginx-deployment nginx=nginx:1.9.1
3           kubectl set image deployment/nginx-deployment nginx=nginx:1.8

因為我創建 Deployment 的時候使用了--record參數可以記錄命令,我們可以很方便的查看每次 revision 的變化.

查看單個revision 的詳細信息:

# kubectl rollout history deployment/nginx-deployment --revision=2
deployments "nginx-deployment" with revision #2
Pod Template:
  Labels:       app=nginx
        pod-template-hash=703038527
  Containers:
   nginx:
    Image:      nginx:1.8
    Port:       80/TCP
    Host Port:  0/TCP
    Environment:        <none>
    Mounts:     <none>
  Volumes:      <none>

5.回滾(回滾到上一版本):

#kubectl rollout undo deployment/nginx-deployment

也可以使用 --revision參數指定某個歷史版本:

#kubectl rollout undo deployment/nginx-deployment --to-revision=2

查看 rollout 的狀態.

#kubectl rollout status deployment/nginx-deployment

 6.查看正在創建或者正在更新的deplyment

# kubectl get deployments
NAME               DESIRED   CURRENT   UP-TO-DATE AVAILABLE AGE nginx-deployment 10 10 10 10 20h

查看replica set 和 pod

# kubectl get rs
NAME                          DESIRED   CURRENT   READY     AGE
nginx-deployment-c4747d96c    10        10        10        20h

 查看deployment詳細信息

# kubectl describe deployment

7.清理 Policy

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

 

參考文檔:https://jimmysong.io/kubernetes-handbook/concepts/deployment.html


免責聲明!

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



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