Deployment核心概念
Deployment主要管理Pod的生命週期,
根據ReplicaSet來確認Pod數量要如何管理
先了解ReplicaSet是什麼
ReplicaSet的特色
- 為Self-Healing的機制
- 確保指定數量的Pod在運作
- 提供Fault-Tolerance
- 可用來擴展Pods
ReplicaSet結果
若事先在ReplicaSet內定義DESIRED=2
,Deployment會根據該數值,產生2個pod
ReplicaSet使用注意事項
在Deployment中設置.selector.matchLabels
,建立後不要去改動之,不然會導致Deployment找不到原本指定的ReplicaSet
反而是直接建立新的ReplicaSet
,導致舊的ReplicaSet
還在運作
Deployement主要負責管理Pods
- 根據ReplicaSets來管理Pods
- 擴展ReplicaSets
- 支援Zero-Downtime的更新、創建、以及刪除ReplicaSets
- 提供Rollback的功能
- 可建立出獨特的label,並分配給ReplicaSet,和生成Pods
定義Deployment
以一組定義nginx的deployment範例做說明
nginx-deployment.yml
1 | apiVersion: apps/v1 |
在template中,有定義spec內的container資訊,其中最重要的resources關鍵字是用來限制一組pod所能夠用的最高資源為多少,避免同一個Node的其他Pods的資源被吃光光
1 | resources: |
使用kubectl創建Deloyment
kubectl create -f [yaml file]
以yaml檔案為基底,創建deployment
--save-config
:之後若要更新deployment
範例 nginx-deployment.yml
以及可用kubectl describe deployment
檢查目前建制的資訊,紅色匡起來區域為該Pod的資源限制
kubectl apply -f [yaml file]
套用yaml檔案,並做更新
kubectl get deployment
取得deployment資訊
-
--show-labels
,列出所有deployemnt內所定義的labels -
-l
取得所有用-l
指定labels的deployments- ex:
kubectl get deployment -l app=nginx
- ex:
kubectl delete
刪除deployment
1 | k delete deployment.apps/my-nginx |
kubectl scale deployment [deployment-name] --replicas=[n]
將deployment內的pod擴展至n個
1 | spec: |
也可以用
kubectl scale -f [yaml-file] --replicas=n
來更新relicas數量
升級策略
若要透過Deployment來升級Pod的版本,可以透過strategy
類型來達成
先看yaml檔案結構,spec.stratey.type
可以定義升級策略
1 | apiVersion: apps/v1 |
spec.stratey.type
可以定義兩種策略
- RollingUpdate: 滾動升級,先創建新的,再把舊的砍掉
- Recreate: 終止全部舊的Pod,再創建新的Pod
接著再說明細部設定
spec.minReadySeconds
: 容器啟動時間,預設0秒spec.strategy.maxSurge
: 舊與新的Pod同時存在的最大數目為replicaSet
設置的數目 + maxSurgespec.stretegy.maxUnavailable
: 最多幾個舊的Pod處在終止狀態
了解設定後,就可以使用kubectl apply ...
來更新Deployment的Rolling策略,會紀錄revision
以下範例添加 --record
,可以將這次更動的指令紀錄起來,可透過rollout history
的CHANGE-CAUSE
查看操作指令的歷史紀錄
1 | $ kubectl apply -f nginx.yaml --record |
1 | $ kubectl rollout history deployment nginx-deployment |
以下可以針對各種revision的所有操作說明
列出所有 revision
1 | kubectl rollout history deployment |
查看特定 revision 詳細資訊
1 | kubectl rollout history deployment [deployment name] --revision=<revision> |
回退上個 revision
1 | kubectl rollout undo deployment |
回退特定 revision
1 | kubectl rollout undo deployment [deployment name] --to-revision=<revision> |
暫停 rollout 更新
1 | kubectl rollout pause deployment [deployment name] |
繼續 rollout 更新
1 | kubectl rollout resume deployment |
查看rollout 狀況
1 | kubectl rollout status deployment [deployment name] |
Case Study: 使用Deployment的優點: Zero Downtime Depoloyment
如果要更新一個正在運行的pod,我們是希望在更新過程中,不要有停機(Downtime)的時候,這時候Deployment可以讓我們有零停機的效用,對把更新後版本部署到Production環境是挺有幫助的。
詳情可看 使用K8S實現Zero-downtime服務更新/移轉的策略一節
參考
- Kubernetes: Deployments
- Kubernetes for Developers: Core Concepts - Deployment