声明式API与Kubernetes编程范式

在前面的文章中,我们为了使用 API 对象的能力,都需要编写一个对应的 YAML 文件交给 Kubernetes。这个 YAML 文件,正是 Kubernetes 声明式 API 所必须具备的一个要素。不过,只要用 YAML 文件代替命令行操作,就是声明式 API 了吗?

Read more

撬动离线业务:Job与CronJob

对于前几篇文章分享的 Deployment、StatefulSet 以及 DaemonSet,实际上主要编排的对象都是“在线业务”,即 Long Running Task。比如常用的 Nginx、Tomcat 和 MySQL 等等。这些应用一旦运行起来,除非出错或者停止,它的容器进程会一直保持在 Running 状态。
但是,有一类作业显然不满足这样的条件,那就是“离线业务”,或者叫做 Batch Job(计算业务)。这种业务在计算完成后就直接退出了,而此时如果你依然用 Deployment 来管理这种业务的话,就会发现 Pod 会在计算结束后退出,然后被 Deployment Controller 不断地重启。
所以,早在 Borg 项目中,Google 就已经对作业进行了分类处理,提出了 LRS(Long Running Service)和 Batch Job 两种作业形态,对它们进行“分别管理”和“混合调度”。
不过,直到 Kubernetes v1.4 版本之后,社区才逐步设计出了一个用来描述离线业务的 API 对象,它的名字就是:Job。

Read more

容器化守护进程的意义:DaemonSet

在上一篇文章中不难看出,StatefulSet 其实就是对现有典型运维业务的容器化抽象。也就是说,你一定有办法在不使用 Kubernetes、甚至不使用容器的情况下,自己 DIY 一个类似的方案出来。但是一旦涉及到升级、版本管理等更工程化的能力,Kubernetes 的好处,才会更加凸显。

Read more

深入理解StatefulSet(三):有状态应用实践

在今天这篇文章中,我将通过一个实际的例子,再次为你深入解读一下部署一个 StatefulSet 的完整流程。我选择的实例是部署一个 MySQL 集群,这也是 Kubernetes 官方文档里的一个经典案例。

Read more

深入理解StatefulSet(二):存储状态

在今天这篇文章中,我们来继续解读 StatefulSet 对存储状态的管理机制。这个机制,主要使用的是一个叫做 Persistent Volume Claim 的功能。
在前面介绍 Pod 的时候,曾经提到过,如果要在一个 Pod 里面声明 Volume,只要在 Pod 里面加 spec.volumes 字段即可。然后,你就可以在这个字段里定义一个具体类型的 Volume 了,比如:hostPath。
可是,你有没有想过这样的一个场景:如果你并不知道有哪些 Volume 类型是可选的,要怎么办?

Read more

深入理解StatefulSet(一):拓扑状态

实际上,Deployment 并不足以覆盖所有的应用编排问题。因为它认为,一个应用的所有 Pod,是完全一样的。所以它们之间没有顺序,也无所谓运行在哪台主机上。需要的时候,Deployment 就可以通过 Pod 模版创建新的 Pod;不需要的时候,Deployment 就可以“杀掉”任意一个 Pod。
但是,在实际应用场景中,很难满足这样的要求。尤其是分布式应用,它的多个实例之间往往存在依赖关系。还有数据存储类的应用,它的多个实例往往会在本地磁盘上保存一份数据,而这些实例一旦被杀掉,即使重建出来,实例与数据之间的对应关系也已经丢失,从而导致应用失败。

Read more

编排其实很简单:谈谈“控制器”模型

接下来,我们就一起来看看“编排”这个 Kubernetes 项目最核心的功能吧。
实际上,你可能已经有所感悟:Pod 这个看似复杂的 API 对象,实际上就是对容器的进一步抽象和封装而已。

Read more