本文发表于一年多前。旧文章可能包含过时内容。请检查页面中的信息自发布以来是否已变得不正确。
在 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