本文已过时一年以上。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。
将 Deployment 对象与 Kubernetes 1.2 一起使用
编者注:这是关于 Kubernetes 1.2 新功能的深入系列文章中的第七篇。
Kubernetes 使部署和管理应用程序变得非常简单,大多数操作只需一个 API 或命令行即可完成,包括推出新应用程序、金丝雀测试和升级。那么我们为什么还需要 Deployments?
Deployment 对象可以自动化部署和滚动更新应用程序。与 kubectl rolling-update 相比,Deployment API 更快、声明式、在服务器端实现,并具有更多功能(例如,即使在滚动更新完成后,您也可以回滚到任何以前的版本)。
在今天的博客文章中,我们将介绍如何使用 Deployments 来:
- 部署/推出应用程序
- 以声明式和渐进式方式更新应用程序,而不会导致服务中断
- 如果在部署/更新应用程序时出现问题,则回滚到以前的版本
事不宜迟,让我们开始玩转 Deployments!
开始入门
如果您想尝试此示例,基本上您需要 3 样东西
- 一个正在运行的 Kubernetes 集群:如果您还没有,请查看入门指南,其中列出了各种平台上(从您的笔记本电脑到云提供商上的虚拟机,再到裸机服务器机架)的解决方案。
- Kubectl,Kubernetes CLI:如果您在运行 kubectl cluster-info 后看到 URL 响应,则可以开始使用了。否则,请按照说明安装和配置 kubectl;或者,如果您有 Google Container Engine 集群,请按照托管解决方案的说明进行操作。
- 本演示的配置文件。如果您选择不自己运行此示例,也没关系。只需观看此视频,即可了解每个步骤中发生的情况。
深入了解
配置文件包含一个静态网站。首先,我们想开始提供其静态内容。从 Kubernetes 存储库的根目录运行
$ kubectl proxy --www=docs/user-guide/update-demo/local/ &
开始在...上服务
这将在默认端口 8001 上运行代理。您现在可以访问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
这会部署 1 个具有映像“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”。Deployments 允许您逐步更新应用程序,而不会导致服务中断。
过了一段时间,您会发现更新似乎卡住了。发生了什么?
调试您的推出
如果您仔细观察,您会发现带有新“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 的用户,请在尝试使用 1.2 中的 Deployments 之前删除所有 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