媒體公關(guān)廈門谷歌seo
PeplicaSet
ReplicaSet 的目的是維護一組在任何時候都處于運行狀態(tài)的 Pod 副本的穩(wěn)定集合,通常用來保證給定數(shù)量的、完全相同的 Pod 的可用性。
最佳實踐
Deployment
是一個可以擁有 ReplicaSet 并使用聲明式方式在服務(wù)器端完成對 Pod 滾動更新的對象。 盡管 ReplicaSet 可以獨立使用,目前它們的主要用途是提供給 Deployment 作為編排 Pod 創(chuàng)建、刪除和更新的一種機制。當使用 Deployment 時,不必關(guān)心如何管理它所創(chuàng)建的 ReplicaSet,Deployment 擁有并管理其 ReplicaSet。 因此,建議在需要 ReplicaSet 時使用 Deployment。
Deployment
作用: Deployment 為 Pod 和 ReplicaSet 提供聲明式的更新能力。
使用
負責啟動3個nginx Pod的 Deployment用例
nginx-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deploymentlabels:app: nginx
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:1.14.2ports:- containerPort: 80
-
創(chuàng)建deployment
kubectl apply -f ./nginx-deployment.yaml
-
查看狀態(tài)
kubectl get deployments |grep nginx-deployment
參數(shù)說明:
NAME
列出了名字空間中 Deployment 的名稱。READY
顯示應(yīng)用程序的可用的“副本”數(shù)。顯示的模式是“就緒個數(shù)/期望個數(shù)”。UP-TO-DATE
顯示為了達到期望狀態(tài)已經(jīng)更新的副本數(shù)。AVAILABLE
顯示應(yīng)用可供用戶使用的副本數(shù)。AGE
顯示應(yīng)用程序運行的時間。
-
查看deployment的上線狀態(tài)
kubectl rollout status deployment/nginx-deployment
-
查看Deployment創(chuàng)建的ReplicaSet
kubectl get rs
-
查看創(chuàng)建的pod
kubectl get pods
-
查看deployment啟動日志,pod啟動日志
kubectl describe deployment <deployment-name> kubectl describe pod <pod-name>
更新與回滾Deployment
-
修改鏡像版本
kubectl set image deployment/nginx-deployment nginx=nginx:1.161
-
檢查Deployment 上線歷史
kubectl rollout history deployment/nginx-deployment
輸出類似于
deployments "nginx-deployment" REVISION CHANGE-CAUSE 1 kubectl apply --filename=https://k8s.io/examples/controllers/nginx-deployment.yaml 2 kubectl set image deployment/nginx-deployment nginx=nginx:1.16.1 3 kubectl set image deployment/nginx-deployment nginx=nginx:1.161
CHANGE-CAUSE
的內(nèi)容是從 Deployment 的 kubernetes.io/change-cause
注解復(fù)制過來的。 復(fù)制動作發(fā)生在修訂版本創(chuàng)建時??梢酝ㄟ^以下方式設(shè)置 CHANGE-CAUSE
消息:
- 使用
kubectl annotate deployment/nginx-deployment kubernetes.io/change-cause="image updated to 1.16.1"
為 Deployment 添加注解。 - 手動編輯資源的清單。
-
要查看修訂歷史的詳細信息
kubectl rollout history deployment/nginx-deployment --revision=2
-
回滾到上一個修改的版本
kubectl rollout undo deployment/nginx-deployment
-
回滾到指定版本
kubectl rollout undo deployment/nginx-deployment --to-revision=2
縮放Deployment
-
縮放指定大小
kubectl scale deployment/nginx-deployment --replicas=10
-
自動縮放
kubectl autoscale deployment/nginx-deployment --min=10 --max=15 --cpu-percent=80
Deployment 設(shè)置自動縮放器,并基于現(xiàn)有 Pod 的 CPU 利用率選擇要運行的 Pod 個數(shù)下限和上限。
暫定運行中的deployment
kubectl rollout pause deployment/nginx-deployment
此時可以更新deployment
恢復(fù)deployment
kubectl rollout resume deployment/nginx-deployment
不可以回滾處于暫停狀態(tài)的 Deployment,除非先恢復(fù)其執(zhí)行狀態(tài)
deployment的狀態(tài)
- Progressing(進行中)
- Complete(已完成)
- Failed(失敗)
進行中的Deployment
執(zhí)行下面的任務(wù)期間,Kubernetes 標記 Deployment 為進行中(Progressing):
- Deployment 創(chuàng)建新的 ReplicaSet
- Deployment 正在為其最新的 ReplicaSet 擴容
- Deployment 正在為其舊有的 ReplicaSet(s) 縮容
- 新的 Pod 已經(jīng)就緒或者可用(就緒至少持續(xù)了MinReadySeconds 秒)。
當上線過程進入“Progressing”狀態(tài)時,Deployment 控制器會向 Deployment 的 .status.conditions
中添加包含下面屬性的狀況條目:
type: Progressing
status: "True"
reason: NewReplicaSetCreated
|reason: FoundNewReplicaSet
|reason: ReplicaSetUpdated
可以使用 kubectl rollout status
監(jiān)視 Deployment 的進度。
完成的 Deployment
當 Deployment 具有以下特征時,Kubernetes 將其標記為完成(Complete);
- 與 Deployment 關(guān)聯(lián)的所有副本都已更新到指定的最新版本,這意味著之前請求的所有更新都已完成。
- 與 Deployment 關(guān)聯(lián)的所有副本都可用。
- 未運行 Deployment 的舊副本。
當上線過程進入“Complete”狀態(tài)時,Deployment 控制器會向 Deployment 的 .status.conditions
中添加包含下面屬性的狀況條目:
type: Progressing
status: "True"
reason: NewReplicaSetAvailable
這一 Progressing
狀況的狀態(tài)值會持續(xù)為 "True"
,直至新的上線動作被觸發(fā)。 即使副本的可用狀態(tài)發(fā)生變化(進而影響 Available
狀況),Progressing
狀況的值也不會變化。
可以使用 kubectl rollout status
檢查 Deployment 是否已完成。 如果上線成功完成,kubectl rollout status
返回退出代碼 0。
失敗的 Deployment
Deployment 可能會在嘗試部署其最新的 ReplicaSet 受挫,一直處于未完成狀態(tài)。 造成此情況一些可能因素如下:
- 配額(Quota)不足
- 就緒探測(Readiness Probe)失敗
- 鏡像拉取錯誤
- 權(quán)限不足
- 限制范圍(Limit Ranges)問題
- 應(yīng)用程序運行時的配置錯誤
檢測此狀況的一種方法是在 Deployment 規(guī)約中指定截止時間參數(shù): (.spec.progressDeadlineSeconds
)。 .spec.progressDeadlineSeconds
給出的是一個秒數(shù)值,Deployment 控制器在(通過 Deployment 狀態(tài)) 標示 Deployment 進展停滯之前,需要等待所給的時長。
以下 kubectl
命令設(shè)置規(guī)約中的 progressDeadlineSeconds
,從而告知控制器 在 10 分鐘后報告 Deployment 的上線沒有進展:
kubectl patch deployment/nginx-deployment -p '{"spec":{"progressDeadlineSeconds":600}}'
輸出類似于:
deployment.apps/nginx-deployment patched
超過截止時間后,Deployment 控制器將添加具有以下屬性的 Deployment 狀況到 Deployment 的 .status.conditions
中:
type: Progressing
status: "False"
reason: ProgressDeadlineExceeded
這一狀況也可能會比較早地失敗,因而其狀態(tài)值被設(shè)置為 "False"
, 其原因為 ReplicaSetCreateError
。 一旦 Deployment 上線完成,就不再考慮其期限。
清理策略
可以在 Deployment 中設(shè)置 .spec.revisionHistoryLimit
字段以指定保留此 Deployment 的多少個舊的ReplicaSet。其余的 ReplicaSet 將在后臺被垃圾回收。 默認情況下,此值為 10。
說明:
顯式將此字段設(shè)置為 0 將導(dǎo)致 Deployment 的所有歷史記錄被清空,因此 Deployment 將無法回滾。