Kubernetes 就是个数据库?

2020-04-26 08:51:19 +08:00
 resouer

https://twitter.com/resouer/status/1253927443443806208

如果你也有同感,想必你对 Infrastructure as Data 、GitOps 、声明式 API/数据模型、以及它们与 Kubernetes controller/Operator 的关系也有所见地?不要犹豫,来这里看看: https://www.v2ex.com/t/666137

5739 次点击
所在节点    Kubernetes
11 条回复
widewing
2020-04-26 09:28:40 +08:00
我记得有篇文章说这个现象,对于一个东西说 X 就是个 Y 嘛,其实是用自己原有经验简化新问题,只见同不见异,类似于打标签的做法。我觉得挺有道理的。
zy445566
2020-04-26 09:37:34 +08:00
如果你要说是键值数据库的话 ,那这个数据库那还集成了半个 nginx 和容器管理
lhx2008
2020-04-26 09:38:03 +08:00
要这么说,一切有状态的集群都是个数据库了。。
rockyou12
2020-04-26 09:55:31 +08:00
人家当然不是数据库,人家的存储是 etcd (甚至有的用 sqlite )。这种断章取义抖机灵没什么意思
whileFalse
2020-04-26 09:57:04 +08:00
还特意去搜了下 Infra as Data 。
这玩意儿和 Infra as Code 啥区别?
MisakaTang
2020-04-26 10:12:52 +08:00
数据库就是一个日志管理器 所以 k8s 也就是个管理日志文件的
est
2020-04-26 10:37:18 +08:00
k8s 的数据库是 etcd 吧。
resouer
2020-04-26 12:54:34 +08:00
Kubernetes 为什么是一个“数据库”?难道 etcd 不是 Kubernetes 的数据库吗?

这里统一回复一下 :-)

大家可能都听说过,Kubernetes 的核心特征是“声明式 API”。在 Kubernetes 社区中,我们一般把这个特征称作“声明式应用管理体系”。

而实际上,这个体系背后的理论基础,正是一种叫做 Infrastructure as Data ( IaD )的思想。这种思想认为,基础设施的管理不应该耦合于某种编程语言或者配置方式,而应该是纯粹的、格式化的、系统可读的数据,并且这些数据能够完整的表征使用者所期望的系统状态。

而这样做的好处就在于,任何时候我想对基础设施做操作,最终都等价于对这些数据的“增、删、改、查”。而更重要的是,我对这些数据进行“增、删、改、查”的方式,与这个基础设施本身是没有任何关系的。所以说,我跟一个基础设施交互的过程,不会被绑定在某种编程语言、某种远程调用协议、或者某种 SDK 上。只要我能够生成对应格式的“数据”,我就能够天马行空的使用任何我喜欢的方式来完成对基础设施的操作。

这种好处具体体现在 Kubernetes 上,就是如果我想在 Kubernetes 上做任何操作,我只需要提交一个 YAML 文件,然后对这个 YAML 文件进行增删改查即可。而不是必须使用 Kubernetes 项目的 Restful API 或者 SDK 。这个 YAML 文件,其实就是 Kubernetes 这个 IaD 系统对应的 Data (数据)。

所以说,Kubernetes 从出生起就把它的所有功能都定义成了所谓的 “API 对象”,其实就是一份一份的 Data 。这样,使用者就可以通过对这些 Data 进行增删改查来达成自己想要的目标,而不是被绑定在某种具体的语言或者 SDK 上。这不仅让 Kubernetes 的使用者获得了极高的自由度,更重要的是,这让使用者基于 Kubernetes 构建上层系统或者跟其他系统集成变得非常容易:不管这个系统是什么语言编写的,它只需要通过它自己的方式生成和操作一个个 Kubernetes API 对象,就可以跟 Kubernetes 进行交互。

而正是因为使用者能够以非常低的代价基于 Kubernetes 构建或者集成其他系统,才使得 Kubernetes 能够成功的把自己"塞进"基础设施与传统 PaaS 之间,向下集成各种云和基础设施的能力,对上支持使用者构建各种应用管理系统。所以说,IaD 正是 Kubernetes 能够达成 “The Platform for Platform” 这个目标的核心战斗力所在。

说到这里,大家估计也就明白了:这种 IaD 设计中的 Data 具体表现出来,其实就是声明式的 Kubernetes API 对象;而 Kubernetes 中的控制循环,则是确保系统本身能够始终跟这些 Data 所描述的状态永远保持一致。

所以说,我们在使用 Kubernetes 的时候之所以要写那么多 YAML 文件,只是因为我们需要通过一种方式把 Data 提交给 Kubernetes 而已。在这个过程中,YAML 只是一种为了让人类格式化的编写 Data 的一种载体。如果做一个类比,YAML 只是我们小时候作业本里的“田字格”,“田字格”里写的那些文字,才是真正 Kubernetes 需要处理的 Data 。

一句话:Kubernetes 的 IaD 的本质,决定了它的工作方式其实更类似一个“数据库”,而不像传统认知上的分布式系统。Kubernetes 拥有完善的数据模型( API types/CRD )、视图层( Open Application Model )、索引层( Informer )和驱动层( Controller ),它的整套体系都紧密围绕着“数据”这个一等公民设计和运转,由“数据”来驱动整个系统向用户声明的终态逐渐逼近。而至于 etcd ?它其实是这个系统所依赖的 CMDB 。是的,你大可以用自己喜欢的 CMDB 来替代,它不会影响 Kubernetes 自己的工作方式。但这可能并不是抖机灵 :-)

而如果你对 IaD 以及整个 Kubernetes 背后数据模型、视图层、驱动层等核心机制感兴趣;或者,你可能已经发现这个“数据库”系统好像还缺点什么。

没错,这些正是我们团队的重点工作内容,欢迎你投递简历或者进一步交流: https://www.v2ex.com/t/666137
firefox12
2020-04-26 12:57:34 +08:00
这个说法没有大问题, 其实 k8s 就是定义一个数据库 然后把容器的状态朝目标数据库不断调整。完成以后就达到要求了。
resouer
2020-04-26 12:59:12 +08:00
@firefox12 嗯,理解的差不多 哈哈。见我上面的回复。另外,您考虑新机会吗?把 Kubernetes 这个“数据库”折腾的更好的那种。
Sunmxt
2020-05-06 03:33:24 +08:00
这样仔细一想,CRD 定义 model,apiserver 提供 restful 的存储接口,确实和数据库很相似。Operator 和 Controller 某种意义上就是在上面构建的应用。确实很有意思。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/666139

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX