本文已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

將 Deployment 物件與 Kubernetes 1.2 一起使用

編者註:這是 Kubernetes 1.2 新功能系列深入文章中的第七篇貼文

Kubernetes 讓部署和管理應用程式變得非常簡單,大多數操作只需一個 API 或命令列即可完成,包括推出新應用程式、Canary 測試和升級。那麼我們為什麼需要 Deployment 呢?

Deployment 物件自動化部署和滾動更新應用程式。與 kubectl rolling-update 相比,Deployment API 速度更快、宣告式、伺服器端實作且具有更多功能(例如,即使在滾動更新完成後,您也可以回滾到任何先前的修訂版本)。

在今天的部落格文章中,我們將介紹如何使用 Deployment 來

  1. 部署/推出應用程式
  2. 宣告式且漸進式地更新應用程式,而不會發生服務中斷
  3. 如果在部署/更新應用程式時出現問題,則回滾到先前的修訂版本

事不宜遲,讓我們開始玩 Deployment 吧!

開始使用

如果您想嘗試這個範例,基本上您需要 3 樣東西

  1. 執行中的 Kubernetes 叢集:如果您還沒有叢集,請查看入門指南,以取得從您的筆記型電腦到雲端供應商的 VM,再到裸機伺服器機架等各種平台上的解決方案列表。
  2. Kubectl,Kubernetes CLI:如果您在執行 kubectl cluster-info 後看到 URL 回應,則表示您已準備就緒。否則,請按照指示安裝和設定 kubectl;如果您有 Google Container Engine 叢集,請按照託管解決方案的指示進行操作。
  3. 此示範的組態檔。如果您選擇不自己執行此範例,也沒關係。只需觀看此影片,即可了解每個步驟中發生的情況。

深入探討

組態檔包含一個靜態網站。首先,我們要開始提供其靜態內容。從 Kubernetes 儲存庫的根目錄執行

$ kubectl proxy --www=docs/user-guide/update-demo/local/ &  

開始在 ... 上提供服務

這會在預設埠 8001 上執行 Proxy。您現在可以造訪 https://127.0.0.1:8001/static/ 示範網站(目前應該是空白頁面)。現在我們要執行一個應用程式並將其顯示在網站上。

$ kubectl run update-demo   
--image=gcr.io/google\_containers/update-demo:nautilus --port=80 -l name=update-demo  

deployment “update-demo” created  

這會部署一個具有映像檔「update-demo:nautilus」的應用程式副本,您可以在 https://127.0.0.1:8001/static/ 上視覺化地看到它。1

網站上顯示的卡片代表 Kubernetes Pod,其中包含 Pod 的名稱 (ID)、狀態、映像檔和標籤。

規模擴大

現在我們想要更多此應用程式的副本!
$ kubectl scale deployment/update-demo --replicas=4
deployment "update-demo" 已擴展

更新您的應用程式

如何更新應用程式?

 $ kubectl edit deployment/update-demo  

 This opens up your default editor, and you can update the deployment on the fly. Find .spec.template.spec.containers[0].image and change nautilus to kitty. Save the file, and you’ll see:  

 deployment "update-demo" edited   

您現在正在將此應用程式的映像檔從「update-demo:nautilus」更新為「update-demo:kitty」。Deployment 允許您漸進式地更新應用程式,而不會發生服務中斷。

過一會兒,您會發現更新似乎卡住了。發生什麼事了?

偵錯您的推出

如果您仔細觀察,您會發現帶有新「kitty」標籤映像檔的 Pod 保持 Pending 狀態。如果 Deployment 失敗,它會自動停止推出。讓我們查看其中一個新的 Pod 以了解發生了什麼事

$ kubectl describe pod/update-demo-1326485872-a4key  

查看此 Pod 的事件,您會注意到 Kubernetes 無法提取映像檔,因為找不到「kitty」標籤

Failed to pull image "gcr.io/google_containers/update-demo:kitty": Tag kitty not found in repository gcr.io/google_containers/update-demo

回滾

好的,現在我們要撤銷變更,然後花時間弄清楚我們應該使用哪個映像檔標籤。

$ kubectl rollout undo deployment/update-demo   
deployment "update-demo" rolled back  

一切恢復正常,呼!

若要深入了解回滾,請造訪回滾 Deployment

更新您的應用程式(真正地)

過一會兒,我們終於弄清楚正確的映像檔標籤是「kitten」,而不是「kitty」。現在將 .spec.template.spec.containers[0].image 標籤從「nautilus」變更為「kitten」。

$ kubectl edit deployment/update-demo  
deployment "update-demo" edited  

現在您會在示範網站上看到 4 隻可愛的小貓,這表示我們已成功更新應用程式!如果您想知道這背後的奧妙,請仔細查看 Deployment

$ kubectl describe deployment/update-demo  

從事件區段中,您會發現 Deployment 正在管理另一個稱為 Replica Set 的資源,每個資源控制不同 Pod 範本的副本數。Deployment 透過擴展和縮減新舊 Pod 範本的 Replica Set 來實現漸進式推出。

結論

現在,您已學會 Deployment 物件的基本用法

  1. 使用 kubectl run 和 Deployment 部署應用程式
  2. 透過使用 kubectl edit 更新 Deployment 來更新應用程式
  3. 使用 kubectl rollout undo 回滾到先前部署的應用程式。但 Deployment 中還有更多本文未涵蓋的內容!若要探索更多,請繼續閱讀Deployment 的簡介

注意:在 Kubernetes 1.2 中,Deployment(Beta 版本)現在功能完整且預設啟用。對於那些在 Kubernetes 1.1 中嘗試過 Deployment 的人,請在嘗試 1.2 中的 Deployment 之前,刪除所有 Deployment 1.1 資源(包括它們管理的 Replication Controller 和 Pod)。這是必要的,因為我們對 API 進行了一些不向後相容的變更。

如果您對 Kubernetes 和組態感興趣,您會想參與

1 「kubectl run」輸出它建立的資源類型和名稱。在 1.2 中,它現在建立 Deployment 資源。您可以在後續命令中使用它,例如「kubectl get deployment 」或「kubectl expose deployment 」。如果您想編寫腳本來自動執行此操作,並以向前相容的方式進行,請將「-o name」標誌與「kubectl run」一起使用,它將產生簡短的輸出「deployments/」,也可以在後續命令列中使用。 「--generator」標誌可以與「kubectl run」一起使用以產生其他類型的資源,例如,將其設定為「run/v1」以建立 Replication Controller,這是 1.1 和 1.0 中的預設值,以及設定為「run-pod/v1」以建立 Pod,例如用於 --restart=Never Pod。