本文已发表一年以上。较旧文章可能包含过时内容。请检查页面信息自发布以来是否发生变化。

在 Kubernetes 1.2 中使用 Deployment 对象

编者注:这是关于 Kubernetes 1.2 新特性的系列深度文章中的第七篇。

Kubernetes 使部署和管理应用变得非常简单,大多数操作都可以通过单个 API 或命令行完成,包括发布新应用、金丝雀测试和升级。那么我们为什么还需要 Deployments 呢?

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

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

  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 上运行一个代理。您现在可以访问http://localhost: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”的应用,副本数为 1。您可以在http://localhost: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”。Deployments 允许您渐进式地更新应用,而不会造成服务中断。

过了一会儿,您会发现更新似乎卡住了。发生什么了?

调试您的发布过程

仔细查看,您会发现带有新“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  

从 events 部分,您会发现 Deployment 正在管理另一个名为Replica Set的资源,每个 Replica Set 控制不同 Pod 模板的副本数量。Deployment 通过扩展和缩减新旧 Pod 模板的 Replica Sets 来实现渐进式发布。

结论

现在,您已经学会了 Deployment 对象的基本用法

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

注意:在 Kubernetes 1.2 中,Deployment(beta 版本)现已功能完备并默认启用。对于在 Kubernetes 1.1 中尝试过 Deployment 的用户,在尝试 1.2 中的 Deployments 之前,请删除所有 Deployment 1.1 资源(包括它们管理的 Replication Controllers 和 Pods)。这样做是必要的,因为我们对 API 进行了一些不向后兼容的更改。

如果您对 Kubernetes 和配置感兴趣,您将想参与到以下活动中:

上一篇