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

在 Kubernetes 1.2 中使用 Deployment 物件

編者按:這是關於Kubernetes 1.2新功能的系列深度文章中的第七篇

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

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

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

  1. 部署/推出應用程式
  2. 以宣告式和漸進式方式更新應用程式,而不會造成服務中斷
  3. 如果在部署/更新應用程式時出現問題,回滾到以前的版本

廢話不多說,讓我們開始玩轉 Deployments 吧!

開始使用

如果你想嘗試這個例子,基本上你需要三樣東西

  1. 一個正在執行的 Kubernetes 叢集:如果你還沒有,請檢視入門指南,瞭解從你的筆記型電腦到雲提供商上的虛擬機器,再到裸機伺服器機架等各種平臺上的解決方案列表。
  2. Kubectl,Kubernetes CLI:如果你執行 kubectl cluster-info 後看到 URL 響應,則表示你已準備就緒。否則,請按照說明安裝和配置 kubectl;如果你有 Google Container Engine 叢集,請按照託管解決方案的說明進行操作。
  3. 此演示的配置檔案。如果您選擇不親自執行此示例,也沒關係。只需觀看此影片即可瞭解每個步驟中發生了什麼。

深入探討

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

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

開始提供服務於……

這會在預設埠 8001 上執行一個代理。您現在可以訪問演示網站 https://: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://:8001/static/ 上直觀地看到它。1

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

變大

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

更新你的應用程式

那更新應用程式呢?

 $ 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”。部署允許您逐步更新應用程式,而不會造成服務中斷。

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

除錯您的釋出

如果您仔細觀察,會發現帶有新“kitty”標籤映象的 Pod 保持掛起狀態。如果釋出失敗,Deployment 會自動停止釋出。讓我們看看其中一個新 Pod,瞭解發生了什麼

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

檢視此 Pod 的事件,您會注意到 Kubernetes 未能拉取映象,因為找不到“kitty”標籤

未能拉取映象 "gcr.io/google_containers/update-demo:kitty":在倉庫 gcr.io/google_containers/update-demo 中未找到標籤 kitty

回滾

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

$ 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(測試版)現在功能齊全並預設啟用。對於那些在 Kubernetes 1.1 中嘗試過 Deployment 的使用者,請在 Kubernetes 1.2 中嘗試 Deployment 之前,刪除所有 Deployment 1.1 資源(包括它們管理的 Replication Controller 和 Pod)。這是必要的,因為我們對 API 進行了一些不向後相容的更改。

如果您對 Kubernetes 和配置感興趣,您將希望參與

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