(1)首先我們創建一個nginx的Deployment,采用官方的yaml:
kubectl create -f https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record
將kubectl的 --record 的 flag 設置為 true可以在 annotation 中記錄當前命令創建或者升級了該資源。這在未來會很有用,例如,查看在每個 Deployment revision 中執行了哪些命令。
創建完成后查看下狀態:
kubectl get deployments kubectl get rs kubectl get pods
OK,現在我們有了一個3各Pod的deployment。
我們使用以下命令進行擴容:
kubectl scale deployment nginx-deployment --replicas 10
假設您的集群中啟用了horizontal pod autoscaling,您可以給 Deployment 設置一個 autoscaler,基於當前 Pod的 CPU 利用率選擇最少和最多的 Pod 數。
kubectl autoscale deployment nginx-deployment --min=10 --max=15 --cpu-percent=80
如果使用了自動擴容,我們可以通過運行來檢查autoscaler的當前狀態:
kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
nginx-deployment Deployment/nginx-deployment <unknown>/20% 3 5 3 21m
通過Kubectl get pods查看最新狀態:
比例擴容
RollingUpdate Deployment 支持同時運行一個應用的多個版本。或者 autoscaler 擴 容 RollingUpdate Deployment 的時候,正在中途的 rollout(進行中或者已經暫停的),為了降低風險,Deployment controller 將會平衡已存在的活動中的 ReplicaSet(有 Pod 的 ReplicaSet)和新加入的 replica。這被稱為比例擴容。
例如,您正在運行中含有10個 replica 的 Deployment。maxSurge=3,maxUnavailable=2。
$ kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deployment 10 10 10 10 50s
您更新了一個鏡像,而在集群內部無法解析。
kubectl set image deploy/nginx-deployment nginx=nginx:sometag deployment "nginx-deployment" image updated
鏡像更新啟動了一個包含ReplicaSet nginx-deployment-1989198191的新的rollout,但是它被阻塞了,因為我們上面提到的maxUnavailable。
kubectl get rs NAME DESIRED CURRENT READY AGE nginx-deployment-1989198191 5 5 0 9s nginx-deployment-618515232 8 8 8 1m
然后發起了一個新的Deployment擴容請求。autoscaler將Deployment的repllica數目增加到了15個。Deployment controller需要判斷在哪里增加這5個新的replica。如果我們沒有誰用比例擴容,所有的5個replica都會加到一個新的ReplicaSet中。如果使用比例擴容,新添加的replica將傳播到所有的ReplicaSet中。大的部分加入replica數最多的ReplicaSet中,小的部分加入到replica數少的ReplciaSet中。0個replica的ReplicaSet不會被擴容。
在我們上面的例子中,3個replica將添加到舊的ReplicaSet中,2個replica將添加到新的ReplicaSet中。rollout進程最終會將所有的replica移動到新的ReplicaSet中,假設新的replica成為健康狀態。
kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deployment 15 18 7 8 7m kubectl get rs NAME DESIRED CURRENT READY AGE nginx-deployment-1989198191 7 7 0 7m nginx-deployment-618515232 11 11 11 7m
檢查 Deployment 升級的歷史記錄
因為我們創建 Deployment 的時候使用了--recored參數可以記錄命令,我們可以很方便的查看每次 revision 的變化。
首先,檢查下 Deployment 的 revision:
PS G:\k8s-for-docker\k8s-for-docker-desktop> kubectl rollout history deployment/nginx-deployment deployments "nginx-deployment" REVISION CHANGE-CAUSE 1 kubectl.exe create --filename=https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record=true 2 kubectl.exe scale deployment nginx-deployment --replicas=10 3 kubectl.exe set image deploy/nginx-deployment nginx=nginx:sometag
我們還可以查看版本的具體信息:
PS G:\k8s-for-docker\k8s-for-docker-desktop> kubectl rollout history deployment/nginx-deployment --revision=2 deployments "nginx-deployment" with revision #2 Pod Template: Labels: app=nginx pod-template-hash=703038527 Annotations: kubernetes.io/change-cause=kubectl.exe scale deployment nginx-deployment --replicas=10 Containers: nginx: Image: nginx:1.9.1 Port: 80/TCP Host Port: 0/TCP Environment: <none> Mounts: <none> Volumes: <none>
回退到歷史版本
我們可以看到包括創建在內一共有3各版本,我們可以指定回退到某個版本,比如回退到2版本:
kubectl rollout undo deployment/nginx-deployment --to-revision=2
查看回滾狀態:
kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deployment 10 10 10 10 3h
kubectl rollout history deployment/nginx-deployment deployments "nginx-deployment" REVISION CHANGE-CAUSE 1 kubectl.exe create --filename=https://kubernetes.io/docs/user-guide/nginx-deployment.yaml --record=true 3 kubectl.exe set image deploy/nginx-deployment nginx=nginx:sometag 4 kubectl.exe scale deployment nginx-deployment --replicas=10
可以看到版本歷史記錄里多了一個4版本,10個副本的歷史記錄。
暫停和恢復Deployment
您可以在發出一次或多次更新前暫停一個 Deployment,然后再恢復它。這樣您就能多次暫停和恢復 Deployment,在此期間進行一些修復工作,而不會發出不必要的 rollout。
例如使用剛剛創建 Deployment:
kubectl get deploy NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE nginx-deployment 10 10 10 10 3h
使用以下命令暫停 Deployment:
kubectl rollout pause deployment/nginx-deployment deployment.apps "nginx-deployment" paused
然后更新 Deplyment中的鏡像,最后,恢復這個 Deployment,觀察完成更新的 ReplicaSet 已經創建出來了:
kubectl rollout resume deploy nginx
Deployment 狀態
Deployment 在生命周期中有多種狀態。在創建一個新的 ReplicaSet 的時候它可以是 progressing 狀態, complete 狀態,或者 fail to progress 狀態。
進行中的 Deployment
Kubernetes 將執行過下列任務之一的 Deployment 標記為 progressing 狀態:
- Deployment 正在創建新的ReplicaSet過程中。
- Deployment 正在擴容一個已有的 ReplicaSet。
- Deployment 正在縮容一個已有的 ReplicaSet。
- 有新的可用的 pod 出現。
您可以使用kubectl rollout status命令監控 Deployment 的進度。
kubectl rollout status deployment/nginx-deployment deployment "nginx-deployment" successfully rolled out PS G:\k8s-for-docker\k8s-for-docker-desktop> echo $? True
完成的 Deployment
Kubernetes 將包括以下特性的 Deployment 標記為 complete 狀態:
Deployment 最小可用。最小可用意味着 Deployment 的可用 replica 個數等於或者超過 Deployment 策略中的期望個數。
所有與該 Deployment 相關的replica都被更新到了您指定版本,也就說更新完成。
該 Deployment 中沒有舊的 Pod 存在。
您可以用kubectl rollout status命令查看 Deployment 是否完成。如果 rollout 成功完成,kubectl rollout status將返回一個0值的 Exit Code。
失敗的 Deployment
您的 Deployment 在嘗試部署新的 ReplicaSet 的時候可能卡住,用於也不會完成。這可能是因為以下幾個因素引起的:
- (1)無效的引用
- (2)不可讀的 probe failure
- (3)鏡像拉取錯誤
- (4)權限不夠
- (5)范圍限制
- (6)程序運行時配置錯誤