本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
在 Kubernetes 1.2 中使用 Deployment 物件
編者按:這是關於Kubernetes 1.2新功能的系列深度文章中的第七篇
Kubernetes 使應用程式的部署和管理變得非常簡單,大多數操作只需一次 API 呼叫或命令列即可完成,包括推出新應用程式、金絲雀測試和升級。那麼,我們為什麼還需要 Deployment 呢?
Deployment 物件可自動部署和滾動更新應用程式。與 kubectl rolling-update 相比,Deployment API 速度更快、宣告式、在伺服器端實現,並且具有更多功能(例如,即使滾動更新完成後,您也可以回滾到任何先前的版本)。
在今天的部落格文章中,我們將介紹如何使用 Deployment 來
- 部署/推出應用程式
- 以宣告式和漸進式方式更新應用程式,而不會造成服務中斷
- 如果在部署/更新應用程式時出現問題,回滾到以前的版本
廢話不多說,讓我們開始玩轉 Deployments 吧!
開始使用
如果你想嘗試這個例子,基本上你需要三樣東西
- 一個正在執行的 Kubernetes 叢集:如果你還沒有,請檢視入門指南,瞭解從你的筆記型電腦到雲提供商上的虛擬機器,再到裸機伺服器機架等各種平臺上的解決方案列表。
- Kubectl,Kubernetes CLI:如果你執行 kubectl cluster-info 後看到 URL 響應,則表示你已準備就緒。否則,請按照說明安裝和配置 kubectl;如果你有 Google Container Engine 叢集,請按照託管解決方案的說明進行操作。
- 此演示的配置檔案。如果您選擇不親自執行此示例,也沒關係。只需觀看此影片即可瞭解每個步驟中發生了什麼。
深入探討
配置檔案包含一個靜態網站。首先,我們要開始提供其靜態內容。從 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 物件的基本用法
- 使用 kubectl run 部署一個應用程式,透過 Deployment
- 透過 kubectl edit 更新 Deployment 中的應用程式
- 使用 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 和配置感興趣,您將希望參與
- 我們的配置Slack 頻道
- 我們的 Kubernetes 配置特別興趣小組電子郵件列表
- 配置“特別興趣小組”每週三太平洋時間上午 10 點 (SIG-Config 視訊會議) 舉行會議。當然,有關該專案的更多資訊,請訪問 www.kubernetes.io。
1 "kubectl run" 會輸出它所建立的資源的型別和名稱。在 1.2 版本中,它現在會建立 Deployment 資源。你可以在後續命令中使用它,例如 "kubectl get deployment