Missing Semester Lecture 6 - Version Control (Git)
MIT The Missing semester Lecture of Your CS Education Lecture 6 - Version Control (Git)
Missing Semester Lecture 6 - Version Control (Git)
MIT The Missing semester Lecture of Your CS Education Lecture 6 - Version Control (Git)
在这篇文章中,我们来学习一下 Kubernetes 声明式 API 的工作原理,以及如何利用这套 API 机制,在 Kubernetes 里添加自定义的 API 对象。
在前面的文章中,我们为了使用 API 对象的能力,都需要编写一个对应的 YAML 文件交给 Kubernetes。这个 YAML 文件,正是 Kubernetes 声明式 API 所必须具备的一个要素。不过,只要用 YAML 文件代替命令行操作,就是声明式 API 了吗?
对于前几篇文章分享的 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。
在上一篇文章中不难看出,StatefulSet 其实就是对现有典型运维业务的容器化抽象。也就是说,你一定有办法在不使用 Kubernetes、甚至不使用容器的情况下,自己 DIY 一个类似的方案出来。但是一旦涉及到升级、版本管理等更工程化的能力,Kubernetes 的好处,才会更加凸显。
在今天这篇文章中,我将通过一个实际的例子,再次为你深入解读一下部署一个 StatefulSet 的完整流程。我选择的实例是部署一个 MySQL 集群,这也是 Kubernetes 官方文档里的一个经典案例。
在今天这篇文章中,我们来继续解读 StatefulSet 对存储状态的管理机制。这个机制,主要使用的是一个叫做 Persistent Volume Claim 的功能。
在前面介绍 Pod 的时候,曾经提到过,如果要在一个 Pod 里面声明 Volume,只要在 Pod 里面加 spec.volumes 字段即可。然后,你就可以在这个字段里定义一个具体类型的 Volume 了,比如:hostPath。
可是,你有没有想过这样的一个场景:如果你并不知道有哪些 Volume 类型是可选的,要怎么办?
实际上,Deployment 并不足以覆盖所有的应用编排问题。因为它认为,一个应用的所有 Pod,是完全一样的。所以它们之间没有顺序,也无所谓运行在哪台主机上。需要的时候,Deployment 就可以通过 Pod 模版创建新的 Pod;不需要的时候,Deployment 就可以“杀掉”任意一个 Pod。
但是,在实际应用场景中,很难满足这样的要求。尤其是分布式应用,它的多个实例之间往往存在依赖关系。还有数据存储类的应用,它的多个实例往往会在本地磁盘上保存一份数据,而这些实例一旦被杀掉,即使重建出来,实例与数据之间的对应关系也已经丢失,从而导致应用失败。
在今天这篇文章中,详细讲解一下,Kubernetes 中第一个控制器模式的完整实现:Deployment。
本文基于 go version go1.23.3 darwin/arm64 来对Golang中的 HTTP 标准库实现原理进行深入解读。