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

在 Kubernetes 1.2 中使用 Deployment 对象

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

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

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

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

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

废话不多说,让我们开始玩转 Deployments 吧!

开始使用

如果你想尝试这个例子,基本上你需要三样东西

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

  1. 使用 kubectl run 部署一个应用程序,通过 Deployment
  2. 通过 kubectl edit 更新 Deployment 中的应用程序
  3. 使用 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 和配置感兴趣,您将希望参与

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)。