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