当前位置:首页 > 问答 > 正文

其实说到底,Kubernetes 最重要的不是容器,而是它背后的那个 API 框架才是真正核心

(引用来源:Bilgin Ibryam,Apache 软件基金会成员,《Kubernetes Patterns》作者,在多个公开演讲和技术访谈中反复强调的核心观点)

其实说到底,Kubernetes 最重要的不是容器,而是它背后的那个 API 框架才是真正核心,这个观点初听起来可能有点反直觉,因为我们大多数人最开始接触 Kubernetes,就是因为它能高效地管理和编排容器,我们会写一个 YAML 文件,里面描述说“我要运行一个应用,它需要两个副本,使用这个镜像,开放 80 端口”,Kubernetes 就能帮我们搞定一切,容器在这里,就像是乐高积木的单个颗粒,是构建应用的基本单元,非常具体和实在。

但如果我们把目光仅仅停留在容器上,那就好比只看到了汽车的一个个轮子,而没有看到整个汽车的传动系统、控制系统和设计蓝图,Kubernetes 真正的革命性之处,在于它提供了一套强大、统一、可扩展的“声明式 API”框架,这套框架是一个巨大的“插座”或者说是“标准插槽”,它定义了一种通用的语言,让你可以用这种语言来向系统“声明”你期望的应用状态是什么样的。

其实说到底,Kubernetes 最重要的不是容器,而是它背后的那个 API 框架才是真正核心

比如说,你不再需要手动去服务器上输入一条条命令来启动容器、配置网络、挂载存储,你只需要用 Kubernetes 能理解的 API 对象(Pod、Deployment、Service)写一份“愿望清单”,然后提交给这个 API 框架,Kubernetes 的“大脑”(控制平面)会时刻不停地观察系统的实际状态,并努力地让实际状态向你声明的期望状态靠拢,如果某个容器意外崩溃了,系统会自动发现这个状态不符合你的“声明”,于是它会立刻启动一个新的容器来弥补,这个过程是自动的、持续的,其驱动力就是你提交的那份“声明”。

更重要的是,这个 API 框架是高度可扩展的,Kubernetes 本身自带了一些像 Deployment、Service 这样的“内置API对象”,这些已经能解决很多常见问题了,但现实世界是复杂的,你可能会有一些非常特殊的需求,这时候,你不需要去修改 Kubernetes 庞大而复杂的核心代码,你可以利用它提供的强大扩展机制(Custom Resource Definition,CRD),来定义属于自己的 API 对象。

其实说到底,Kubernetes 最重要的不是容器,而是它背后的那个 API 框架才是真正核心

举个例子,假如你公司要部署一个带有复杂拓扑关系的分布式数据库,Cassandra,用原生的 Kubernetes API 来描述它的每个节点配置、集群关系、备份流程会非常繁琐和容易出错,但你可以基于 Kubernetes 的 API 框架,自定义一个叫做“CassandraCluster”的 API 资源,然后你只需要写一个 YAML 文件,里面声明“我想要一个三节点的 Cassandra 集群,配置如下……”,然后提交给它,背后会有一个你编写或由社区提供的“控制器”来负责解读你的声明,并调用 Kubernetes 的基础 API 去创建和管理对应的 Pod、服务、存储卷等,最终把这个复杂的集群给你搭建和运维起来。

这样一来,Kubernetes 就从一个单纯的“容器编排器”,升华为了一个通用的“云原生控制平台”,它的 API 框架成为了一个事实上的云操作系统内核,容器,在这个视角下,只是这个操作系统用来运行应用的一种“运行时”实现而已,甚至未来可以有其他非容器的运行时替代它,但无论底层运行时如何变化,只要上层这套声明式 API 框架是稳定和统一的,用户管理应用的方式、自动化运维的能力就不会受到根本性的动摇。

容器技术(如 Docker)的贡献在于它标准化了应用的打包和分发方式,解决了“依赖地狱”和环境一致性的问题,这是非常重要的基础,但 Kubernetes 通过其 API 框架,解决的是一个更高层次的问题:如何在大规模、动态变化的分布式环境中,对应用的生命周期进行标准化、声明式和自动化的管理,它把运维领域的知识和最佳实践,通过 API 和控制器的方式,固化成了可重复使用、可共享的软件组件,这才是 Kubernetes 生态能够如此繁荣,催生出如此多强大工具和项目(如 Istio、Knative、ArgoCD 等)的根本原因——因为它们都构建在这个统一且强大的 API 框架之上,认识到 API 框架的核心地位,是理解 Kubernetes 真正价值和未来潜力的关键。