在 Kubernetes 1.2 中使用部署(Deployment)对象
原文:Using Deployment objects with Kubernetes 1.2
Kubernetes 简化了应用的部署管理,大多数操作都可以用一个 API 或者命令行搞定,例如应用生成、金丝雀测试以及升级。我们为什么还需要部署对象?
部署对象把部署和滚动更新进行了自动化。跟 kubectl
的 rolling-update
相比,部署 API 更加清晰快速,在服务端实现,有更多的功能(例如即使滚动更新已经完成,你还是可以回滚到之前的版本)。
在今天的文章中,我们会讲讲如何使用部署对象:
- 部署应用
- 在不中断服务的情况下,逐步更新应用
- 在部署/更新过程中,如果发现问题,回滚到前一版本。
预备
要完成本文的内容,需要三个条件:
- 一个运行的 Kuberntes 集群::如果还没有,参考 Getting Started Guides,其中包含针对笔记本电脑、云提供商以及物理服务器的各种方案。
- Kubectl,Kubernetes 客户端:如果运行
kubectl cluster-info
之后看到一个 URL,那么就可以了。否则的话,需要安装和配置 kubectl;如果使用的 Google 容器云,需要参考 Instrctions for hosted solutions - 配置文件
如果你懒得自己做,可以观看视频。
运行
配置文件中包含一个静态网站,我们希望用它提供服务。从 Kubernetes 仓库的根,执行
$ kubectl proxy --www=docs/user-guide/update-demo/local/ &
Starting to serve on …
这会在端口 8001 运行一个代理服务器。现在可以由 http://localhost:8001 来访问示例网站(目前还是个空白页面),接下来我们想要运行一个 App,并在网站上显示:
$ 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”,你可以在 http://localhost:8001/static/ 看到结果:
kubectl run
会输出被创建资源的类型和名字。在 1.2 中变成了创建一个部署资源。后续操作中可以利用这一部署资源,例如kubectl get deployment
或者kubectl explose deployment
。如果你希望编写一个向前兼容的自动化脚本,可以使用-o name
来运行kubectl run
命令,这样就会生成一个简短的输出 “deployment/“,可以用于后续命令。--generator
标记也能用于kubernetes run
命令来生成其他类型的资源,例如设置为 “run/v1”,可以生成一个 Replication Controller,这是 1.1 和 1.0 的缺省行为,如果设置为 “run-pod/v1”,会创建一个 Pod,例如--restart=Never
的 Pod。
上面的卡片显示了 Kuberntes 的 Pod,包含 Pod 的名字(ID)、状态、镜像以及标签。
扩展
现在我们来把这个应用集群扩大一点。
$ kubectl scale deployment/update-demo --replicas=4
deployment "update-demo" scaled
更新
更新一下应用:
$ kubectl edit deployment/update-demo
他会打开你的缺省编辑器,你可以立即更新这一部署。查找 .spec.template.spec.containers[0].image
,把 “nautilus” 换成 “kitty”,保存文件,你会看到:deployment "update-demo" edited
现在你把应用的镜像从 “update-demo:nautilus” 换成了 “update-demo:kitty”。部署对象允许在不停机的情况下进行渐进式的更新。
等待一段时间,就会发现,更新好像卡住了。
排错
如果仔细看看,你会发现使用 “kitty” 镜像的 Pod 在持续的 Pending 状态。因为这种失败,部署过程自动停止。我们可以观察一下新的 Pod,看看发生了什么问题:
$ kubectl describe pod/update-demo-1326485872-a4key
查看 Pod 的事件,会看到 Kubernetes 无法获取这个不存在的镜像。
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
这样就一切恢复如初了。
rolling back a Deployment 一文,介绍了更多的回滚有关的内容。
再更新
过一会,我们知道我们应该使用的镜像是 “kitten”,现在把 .spec.template.spec.containers[0].image
标记从 “nautilus” 替换为 “kitten”。
$ kubectl edit deployment/update-demo
deployment "update-demo" edited
现在看到,4 只小猫都在运行了,这意味着我们成功的更新了应用,幕后细节可以从下面的命令获知:
$ kubectl describe deployment/update-demo
这里可以看到,部署对象管理着另外一个名为 Replica Set 的资源,控制着 Pod 的实例数量。部署对象具有利用扩展和收缩来对 Replica Set 进行渐进升级的能力。
结语
现在我们讲了部署对象的一些基础:
- 利用部署对象和
kubectl run
来部署应用。 kubectl edit
命令更新部署对象,从而更新应用。- 使用
kubectl rollout undo
来回滚到之前的部署。
注意:Kubernetes 1.2 中,部署对象(Beta 版本)具有完整的功能,是缺省启用的。如果之前用过了 Kubernetes 1.1 中的部署对象,因为这一次升级是向后不兼容的,所以在使用 1.2 之前,请删除所有的 1.1 的部署资源(包括 Replication Controller 以及下属的 Pod)。