本文已过时一年以上。较旧的文章可能包含过时的内容。请检查页面中的信息自发布以来是否已变得不正确。

将 Deployment 对象与 Kubernetes 1.2 一起使用

编者注:这是关于 Kubernetes 1.2 新功能的深入系列文章中的第七篇。

Kubernetes 使部署和管理应用程序变得非常简单,大多数操作只需一个 API 或命令行即可完成,包括推出新应用程序、金丝雀测试和升级。那么我们为什么还需要 Deployments?

Deployment 对象可以自动化部署和滚动更新应用程序。与 kubectl rolling-update 相比,Deployment API 更快、声明式、在服务器端实现,并具有更多功能(例如,即使在滚动更新完成后,您也可以回滚到任何以前的版本)。

在今天的博客文章中,我们将介绍如何使用 Deployments 来:

  1. 部署/推出应用程序
  2. 以声明式和渐进式方式更新应用程序,而不会导致服务中断
  3. 如果在部署/更新应用程序时出现问题,则回滚到以前的版本

事不宜迟,让我们开始玩转 Deployments!

开始入门

如果您想尝试此示例,基本上您需要 3 样东西

  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://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 对象的基本用法

  1. 使用 kubectl run 通过 Deployment 部署应用程序
  2. 通过使用 kubectl edit 更新 Deployment 来更新应用程序
  3. 使用 kubectl rollout undo 回滚到先前部署的应用程序,但 Deployment 中还有很多本文未涵盖的内容!要了解更多信息,请继续阅读Deployment 的介绍

注意: 在 Kubernetes 1.2 中,Deployment(测试版)现在功能完整,并且默认启用。对于那些在 Kubernetes 1.1 中尝试过 Deployment 的用户,请在尝试使用 1.2 中的 Deployments 之前删除所有 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。