Kubernetes 系列(二):Deployment 擴容


(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)程序運行時配置錯誤

 


免責聲明!

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



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