在 Kubernetes 1.2 中使用部署(Deployment)对象

原文:Using Deployment objects with Kubernetes 1.2

Kubernetes 简化了应用的部署管理,大多数操作都可以用一个 API 或者命令行搞定,例如应用生成、金丝雀测试以及升级。我们为什么还需要部署对象?

部署对象把部署和滚动更新进行了自动化。跟 kubectlrolling-update 相比,部署 API 更加清晰快速,在服务端实现,有更多的功能(例如即使滚动更新已经完成,你还是可以回滚到之前的版本)。

在今天的文章中,我们会讲讲如何使用部署对象:

  1. 部署应用
  2. 在不中断服务的情况下,逐步更新应用
  3. 在部署/更新过程中,如果发现问题,回滚到前一版本。

rolling update

预备

要完成本文的内容,需要三个条件:

  1. 一个运行的 Kuberntes 集群::如果还没有,参考 Getting Started Guides,其中包含针对笔记本电脑、云提供商以及物理服务器的各种方案。
  2. Kubectl,Kubernetes 客户端:如果运行 kubectl cluster-info 之后看到一个 URL,那么就可以了。否则的话,需要安装和配置 kubectl;如果使用的 Google 容器云,需要参考 Instrctions for hosted solutions
  3. 配置文件

如果你懒得自己做,可以观看视频

运行

配置文件中包含一个静态网站,我们希望用它提供服务。从 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。

boot up

上面的卡片显示了 Kuberntes 的 Pod,包含 Pod 的名字(ID)、状态、镜像以及标签。

扩展

现在我们来把这个应用集群扩大一点。

$ kubectl scale deployment/update-demo --replicas=4
deployment "update-demo" scaled

scale

更新

更新一下应用:

$ kubectl edit deployment/update-demo

他会打开你的缺省编辑器,你可以立即更新这一部署。查找 .spec.template.spec.containers[0].image,把 “nautilus” 换成 “kitty”,保存文件,你会看到:deployment "update-demo" edited

现在你把应用的镜像从 “update-demo:nautilus” 换成了 “update-demo:kitty”。部署对象允许在不停机的情况下进行渐进式的更新。

update

等待一段时间,就会发现,更新好像卡住了。

排错

如果仔细看看,你会发现使用 “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

roll back

这样就一切恢复如初了。

rolling back a Deployment 一文,介绍了更多的回滚有关的内容。

再更新

过一会,我们知道我们应该使用的镜像是 “kitten”,现在把 .spec.template.spec.containers[0].image 标记从 “nautilus” 替换为 “kitten”。

$ kubectl edit deployment/update-demo
deployment "update-demo" edited

update2

现在看到,4 只小猫都在运行了,这意味着我们成功的更新了应用,幕后细节可以从下面的命令获知:

$ kubectl describe deployment/update-demo

describe deployment

这里可以看到,部署对象管理着另外一个名为 Replica Set 的资源,控制着 Pod 的实例数量。部署对象具有利用扩展和收缩来对 Replica Set 进行渐进升级的能力。

结语

现在我们讲了部署对象的一些基础:

  1. 利用部署对象和 kubectl run 来部署应用。
  2. kubectl edit 命令更新部署对象,从而更新应用。
  3. 使用 kubectl rollout undo 来回滚到之前的部署。

注意:Kubernetes 1.2 中,部署对象(Beta 版本)具有完整的功能,是缺省启用的。如果之前用过了 Kubernetes 1.1 中的部署对象,因为这一次升级是向后不兼容的,所以在使用 1.2 之前,请删除所有的 1.1 的部署资源(包括 Replication Controller 以及下属的 Pod)。

Avatar
崔秀龙

简单,是大师的责任;我们凡夫俗子,能做到清楚就很不容易了。

comments powered by Disqus
下一页
上一页

相关