本文已发表一年以上。较旧文章可能包含过时内容。请检查页面信息自发布以来是否发生变化。
在 Kubernetes 1.2 中使用 Deployment 对象
编者注:这是关于 Kubernetes 1.2 新特性的系列深度文章中的第七篇。
Kubernetes 使部署和管理应用变得非常简单,大多数操作都可以通过单个 API 或命令行完成,包括发布新应用、金丝雀测试和升级。那么我们为什么还需要 Deployments 呢?
Deployment 对象实现了应用部署和滚动更新的自动化。与 kubectl rolling-update 相比,Deployment API 速度更快,是声明式的,在服务器端实现,并且具有更多功能(例如,即使滚动更新完成后,您也可以回滚到任何以前的版本)。
在今天的博客文章中,我们将介绍如何使用 Deployments 来
- 部署/发布应用
- 声明式、渐进式地更新应用,不造成服务中断
- 如果在部署/更新应用时出现问题,可以回滚到先前的版本
事不宜迟,让我们开始体验 Deployments 吧!
入门
如果您想尝试这个示例,基本上需要三样东西
- 一个正在运行的 Kubernetes 集群:如果您还没有集群,请查看入门指南,其中列出了适用于各种平台的解决方案,从您的笔记本电脑到云提供商上的虚拟机再到裸金属服务器机架。
- Kubectl,Kubernetes CLI 工具:如果您运行 kubectl cluster-info 后看到 URL 响应,则说明您已准备就绪。否则,请按照说明安装和配置 kubectl;如果您有 Google Container Engine 集群,请按照托管解决方案的说明操作。
- 此演示的配置文件。如果您选择不亲自运行此示例,也没关系。只需观看此视频,了解每个步骤中发生的情况。
深入探讨
配置文件包含一个静态网站。首先,我们要开始提供其静态内容。从 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 对象的基本用法
- 使用 kubectl run 部署应用
- 使用 kubectl edit 更新 Deployment 来更新应用
- 使用 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 和配置感兴趣,您将想参与到以下活动中:
- 我们的 Configuration slack 频道
- 我们的 Kubernetes Configuration 特别兴趣小组邮件列表
- Configuration “特别兴趣小组”,该小组每周三太平洋时间上午 10 点(10:00)在SIG-Config hangout举行会议。当然,有关项目的更多信息,请访问 www.kubernetes.io。
←上一篇
- 下一篇→
- 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。