Kubernetes 云原生生态系统
Kubernetes:从 Borg 到云原生生态系统的架构与运营分析
1.0 引言
1.1 容器编排的兴起
信息技术领域见证了一场从单体应用向微服务架构的根本性转变。这一转变催生了对轻量级、可移植的部署单元的需求,而 Linux 容器技术,尤其是在 2013 年 Docker 的普及之后,成为了满足这一需求的关键 1。容器化通过将应用程序及其依赖项打包到一个隔离的环境中,实现了开发、测试和生产环境之间的一致性。然而,Docker 本身主要设计用于在单个节点上运行,当应用程序由数十甚至数百个容器组成时,手动管理它们的部署、扩展、网络和生命周期变得异常复杂且容易出错 1。这一挑战明确了市场对一个能够自动化大规模容器管理的系统的需求,即容器编排器。
1.2 Kubernetes 作为事实标准
在众多容器编排解决方案中,Kubernetes 迅速脱颖而出,成为了该领域的事实标准 3。Kubernetes 源于 Google 内部,后由云原生计算基金会(Cloud Native Computing Foundation, CNCF)进行管理,它提供了一个强大而可扩展的平台,用于自动化部署、扩展和操作容器化应用程序 4。如今,绝大多数企业在生产环境中使用 Kubernetes 进行容器编排,这证明了其在解决复杂分布式系统管理问题上的成功 6。
1.3 报告结构与目标
本报告旨在对 Kubernetes 进行一次全面而深入的专业分析。报告将首先追溯其技术谱系,深入探讨其前身——Google 的 Borg 和 Omega 系统,以揭示其核心设计理念的演进。随后,报告将详细阐述 Kubernetes 的架构、关键设计原则及其作为一个开源项目的发展历程与治理结构。此外,报告还将分析 Kubernetes 的主要应用场景和其蓬勃发展的生态系统,最后基于可靠证据,探讨其未来的发展前景和新兴范式。本报告的目标是为技术专家、架构师和战略决策者提供一份关于 Kubernetes 的、基于可验证事实的权威参考。
2.0 技术前身:Google 十年的容器管理经验
Kubernetes 并非凭空产生,而是建立在 Google 超过十年大规模生产环境容器管理经验的坚实基础之上。其架构和设计理念深受其内部前身系统 Borg 和 Omega 的影响。理解这两个系统是理解 Kubernetes “为何如此设计”的关键。
2.1 Borg:基础性的集群管理器
Borg 是 Google 在 2003 至 2004 年间开发的第一个统一容器管理系统,旨在最大限度地提高其庞大数据中心资源的利用率 1。它运行着 Google 几乎所有的核心服务,包括 Gmail、Google 搜索和 Google Maps,管理着数十万个作业,跨越数万台机器的集群 1。
2.1.1 系统架构:Borgmaster、Borglet 与 Cell
Borg 的架构采用了主从模型(master-slave)9。其核心管理单元被称为“Cell”,一个 Cell 通常包含一个数据中心集群内的数千到数万台机器,作为一个统一的单元进行管理 9。
Borgmaster:作为 Cell 的逻辑中央控制器,Borgmaster 是整个系统的“大脑”。为了实现高可用性,它实际上由五个副本组成,使用 Paxos 一致性算法来选举一个主副本并维护状态的一致性 9。Borgmaster 负责处理来自客户端的 RPC 请求(如创建、更新作业),管理 Cell 中所有对象(机器、任务、分配等)的状态机,并与每个节点上的代理进行通信 9。
Borglet:是在 Cell 中每台机器上运行的代理进程。它的职责包括启动和停止任务(容器)、管理本地资源(如通过操作内核设置来隔离资源)、向 Borgmaster 报告机器状态,并在任务失败时尝试重启 9。
这种架构的核心优势在于,它向开发者隐藏了资源管理和故障处理的复杂细节,使他们能够专注于应用程序开发本身 10。
2.1.2 工作负载管理:Job、Task 与 Alloc
在 Borg 中,用户以“作业”(Job)的形式提交工作。一个作业由一个或多个运行相同程序二进制文件的“任务”(Task)组成 10。Borg 引入了一个重要的概念,称为“分配”(Alloc),它是在一台机器上预留的一组资源(CPU、内存、磁盘等)。任务可以在 Alloc 内部运行。这种资源预留是持久的,即使没有任务在其中运行,Alloc 也会一直存在。这对于为未来需求预留资源或在任务重启期间保留资源非常有用 9。
2.1.3 声明式规范与混合工作负载处理
Borg 是声明式配置模型的早期实践者。用户通过一种声明式作业规范语言来描述他们希望应用程序达到的最终状态,而不是发出一系列命令式指令 8。Borg 系统会负责实现并维护这一状态。
Borg 的一个关键设计目标是在同一组物理机上同时运行异构工作负载,以实现极致的资源利用率 12。这些工作负载主要分为两类:
生产性服务作业(prod jobs):这些是长时间运行、对延迟高度敏感的服务,理论上应该“永不宕机”,例如面向用户的 Web 服务。这类作业消耗了集群中绝大部分的资源(约 55% 至 80%)9。
批处理作业(batch jobs):这些是生命周期较短、对性能波动不那么敏感的计算任务,它们会运行直至完成。尽管它们消耗的资源总量较少,但从作业数量上看,它们构成了绝大多数(超过 80%)10。
为了管理这两种截然不同的工作负载,Borg 采用了一套复杂的优先级和配额系统。当资源紧张时,Borg 会抢占(preempt)低优先级的任务,为高优先级的任务腾出资源 9。
2.1.4 关键运营经验与架构局限性
Borg 在规模、鲁棒性和资源利用率方面取得了巨大成功,但其架构也暴露出一些问题。首先,其单体式(monolithic)的调度器虽然功能强大,但在软件工程上变得越来越难以维护和演进 12。随着时间的推移,用户开始依赖其内部调度逻辑的特定行为来优化他们的作业,这使得对调度器进行任何重大更改都变得非常困难 13。其次,Borg 的网络模型存在一个显著的痛点:同一台机器上的所有任务共享该主机的 IP 地址。这意味着系统必须负责为每个任务分配和管理唯一的端口号,这增加了系统的复杂性,并限制了应用程序的可移植性 12。
2.2 Omega:演进调度器架构
为了解决 Borg 在软件工程和可扩展性方面遇到的挑战,Google 开发了其第二代集群管理系统 Omega 12。Omega 的核心目标是重构 Borg 的调度器,使其更加模块化、可扩展和灵活。
2.2.1 解决单体调度器的瓶颈
Borg 的单体调度器面临两个主要问题。一是随着集群规模和工作负载复杂度的增长,单一的中央调度器有成为性能瓶颈的风险 13。二是它存在“队头阻塞”(head-of-line blocking)问题:一个调度决策复杂、耗时较长的大型作业(例如,需要数秒钟进行复杂放置计算的服务作业)会阻塞队列中在其之后的所有作业,即使后续作业的调度决策非常简单快速 13。
2.2.2 共享状态模型与乐观并发控制
Omega 引入了一种新颖的调度器架构,其设计灵感来源于数据库系统 13。
并行调度器:Omega 摒弃了单一调度器,允许多个并行的调度器同时运行。每个调度器可以针对特定类型的工作负载进行优化,例如,一个专门用于调度长时间运行的服务作业,另一个用于调度批处理作业 13。
共享状态:所有这些并行的调度器都访问一个共同的、持久化的中央数据存储,该存储保存了整个 Cell 的完整状态(例如,每台机器的可用资源)。这个存储基于 Paxos 协议,保证了数据的一致性 12。
乐观并发控制(Optimistic Concurrency Control):调度器之间的协调采用无锁的乐观并发控制机制。一个调度器首先读取共享状态的本地副本,然后根据该状态做出调度决策。决策完成后,它尝试将自己的变更作为一个原子事务提交到中央存储。只有当该调度器读取状态之后、提交变更之前,其所依赖的状态没有被其他调度器修改过,这次提交才会成功。如果发生冲突(即另一个调度器已经修改了相关状态),事务将被拒绝,该调度器必须重新同步最新状态,然后重试整个决策过程 13。
2.2.3 并行化与队头阻塞的解决
Omega 的共享状态架构通过引入并行化,直接解决了队头阻塞问题。耗时长的服务作业调度可以由其专用调度器在一个独立的线程中处理,而不会影响到批处理调度器对简单、快速的作业进行即时调度 13。这种设计不仅提高了系统的吞吐量和可扩展性,还极大地增强了系统的可扩展性和可维护性,因为可以独立开发和部署新的专用调度器,而无需修改核心系统 13。
从 Borg 的单体调度器到 Omega 的并行共享状态模型的演变,不仅仅是一次技术升级,它标志着一种从中央集权式“编排”(Orchestration)到分布式“协同”(Choreography)的哲学转变的开端。Borg 的设计体现了经典的中央控制思想,一个逻辑实体(Borgmaster)做出所有决策,这种模式虽然在当时是高效的,但最终在性能和软件开发速度上都遇到了瓶颈 9。Omega 的核心创新在于将决策逻辑分解到多个调度器中,虽然状态仍然是集中的,但决策过程变得分布式了 13。这种将作用于共享状态的控制逻辑进行解耦的实践,为 Kubernetes 的控制器模式奠定了思想基础。Kubernetes 将这一理念推向了极致,不仅是调度,几乎所有的集群操作都由一系列小型的、独立的控制循环(控制器)来管理,它们通过监视 API 服务器(即共享状态)来不断地将集群的当前状态调整为期望状态 12。这一演进路径表明,系统的设计目标不仅是为了扩展,更是为了构建一个更具弹性、可扩展性和可维护性的架构。
3.0 Kubernetes 的诞生:设计原则与架构
Kubernetes 的诞生是 Google 内部十年容器管理经验与外部开源容器运动交汇的产物。它旨在将 Borg 和 Omega 的核心思想提炼出来,并以一种更开放、更易于开发者使用的方式呈现给全世界。
3.1 创始团队与动机
Kubernetes 项目于 2013 年由 Google 工程师 Joe Beda、Brendan Burns 和 Craig McLuckie 构思并发起 1。许多早期核心开发者都曾参与过 Borg 和 Omega 的工作 1。创建 Kubernetes 的主要动机有二:一是将 Google 内部成熟的基础设施专业知识引入蓬勃发展的公共云市场,以期与当时占据主导地位的 Amazon Web Services (AWS) 竞争 1;二是在 Docker 容器运动兴起时,他们敏锐地意识到,容器技术本身虽然伟大,但真正释放其潜力的关键是一个强大的容器管理系统,而这正是 Google 内部已经验证过的经验 20。
3.2 核心设计哲学:源于 Borg 和 Omega 的经验教训
Kubernetes 的设计目标是吸收 Borg 和 Omega 的经验教训,同时创建一个更简单、对开发者更友好、并且完全开源的工具 1。项目的内部代号是“七号项目”(Project Seven of Nine),这是对《星际迷航》中一个前 Borg 无人机角色的致敬,这一历史也体现在 Kubernetes 标志的七个轮辐上 1。
3.2.1 API 中心方法 vs. 直接数据存储访问
Kubernetes 在架构上与 Omega 的一个关键区别在于其对状态的访问方式。
Omega 的方式:Omega 将其基于 Paxos 的数据存储直接暴露给受信任的控制平面组件。所有逻辑和语义都被推送到数据存储的客户端,这些客户端直接读写存储内容 12。
Kubernetes 的创新:Kubernetes 的所有状态访问都必须通过一个中央的 API 服务器(API Server)提供的领域特定 REST API 进行。API 服务器充当了整个集群的“守门人”,它强制执行数据验证、版本控制和访问策略 12。这是一个深思熟虑的设计决策,旨在支持一个更加多样化和不可信的客户端生态系统——这在开源和多租户环境中至关重要。
3.2.2 Pod 与“一 Pod 一 IP”网络模型
Kubernetes 的 Pod 概念及其网络模型是另一个直接源于 Borg 经验教训的重大创新。
Borg 的局限:Borg 中同一台机器上的所有容器共享主机的 IP 地址,迫使系统去管理端口分配,这带来了诸多不便 14。
Kubernetes 的创新:Kubernetes 引入了“Pod”作为其最小的可部署单元。一个 Pod 包含一个或多个紧密耦合、共同调度的容器。关键在于,同一个 Pod 内的所有容器共享同一个网络命名空间,因此它们共享一个唯一的 IP 地址和端口空间 12。这种“一 Pod 一 IP”的模型将网络身份与应用身份对齐,极大地简化了网络管理,使得应用程序可以使用标准的、众所周知的端口(如 HTTP 的 80 端口),并且能够无缝集成现有的网络工具 12。
3.2.3 聚焦开发者体验与可扩展性
与作为纯内部基础设施工具的 Borg 和 Omega 不同,Kubernetes 从一开始就将外部开发者的使用体验放在了核心位置 12。其主要设计目标是让开发者能够轻松地部署和管理复杂的分布式系统。这体现在更简洁的 API 和用户界面,以及从项目早期就对可扩展性的高度重视 20。
3.3 声明式 API 与调谐循环
Kubernetes 继承并完善了源自 Borg 的声明式模型 21。用户通过 API 对象(通常以 YAML 文件的形式)来声明系统的“期望状态”(desired state)。Kubernetes 的核心工作模式是“调谐循环”(reconciliation loop)或“控制循环”(controller loop)。控制器(Controller)会持续监控 API 服务器,比较资源的期望状态与集群中的“实际状态”(actual state),并采取行动来弥合两者之间的差异 12。这种被称为“水平触发”(level-triggered)而非“边缘触发”(edge-triggered)的机制,使得系统具有极强的自愈能力和对组件故障的鲁棒性。即使某个组件在状态变更时发生故障错过了事件,当它恢复后,只需查看当前的期望状态即可知道应该做什么 25。
3.4 核心架构组件
Kubernetes 的架构清晰地分为控制平面(Control Plane)和一系列节点组件(Node Components)。
3.4.1 控制平面
控制平面是集群的“大脑”,负责做出全局决策(例如调度)以及检测和响应集群事件。它可以运行在单个主节点上,但在生产环境中通常会部署在多个主节点上以实现高可用性 4。
API Server (kube-apiserver):是 Kubernetes 控制平面的前端和唯一入口。它暴露了 Kubernetes 的 REST API,负责处理所有内部和外部的请求,并对 API 对象进行验证、配置和持久化到后端存储 22。
etcd:是一个一致性、高可用的分布式键值存储系统,用作 Kubernetes 所有集群数据的后端存储。它可靠地存储着集群的配置和状态信息,是集群的唯一真实来源(single source of truth)4。
Scheduler (kube-scheduler):负责 Pod 的调度。它监视新创建的、尚未分配到节点的 Pod,并根据资源需求、亲和性/反亲和性规则、策略限制等因素,为它们选择一个合适的节点来运行 22。
Controller Manager (kube-controller-manager):运行着所有核心的控制器进程。每个控制器都是一个独立的调谐循环,例如节点控制器(Node Controller)、副本控制器(Replication Controller)、端点控制器(Endpoints Controller)等。这些控制器通过 API Server 监视集群状态,并努力将当前状态驱动到期望状态 22。
3.4.2 节点组件
节点组件在每个工作节点(Worker Node)上运行,负责维护运行中的 Pod 并提供 Kubernetes 的运行时环境。
Kubelet:是每个节点上的主要代理。它从 API Server 接收 Pod 的规范(PodSpec),并确保这些 Pod 中描述的容器正在运行且健康。Kubelet 不管理非 Kubernetes 创建的容器 22。
Container Runtime:是负责运行容器的软件,例如 containerd。Kubelet 通过容器运行时接口(Container Runtime Interface, CRI)与它交互 22。
Kube-Proxy:是每个节点上的网络代理,它实现了 Kubernetes 服务(Service)的概念。它通过维护节点上的网络规则(例如使用 iptables 或 IPVS)并执行连接转发,使得网络流量能够被路由到正确的 Pod 22。
为了清晰地展示从 Borg 到 Kubernetes 的架构演进,下表对这三个系统的关键特性进行了比较。
这张表格直观地总结了从 Borg 到 Kubernetes 的技术演进路径。它不仅显示了技术细节的差异,更重要的是揭示了设计哲学的转变。Borg 的单体架构在 Omega 中被解耦为并行的、共享状态的调度器,以解决软件工程和扩展性问题。而 Kubernetes 则在此基础上更进一步,引入了 API 服务器作为中央网关,并彻底改变了网络模型,其核心驱动力是为广大的外部开发者社区构建一个开放、易用且可扩展的平台。这一系列决策环环相扣,共同塑造了 Kubernetes 今天的形态。
4.0 开源生态系统中的项目演进与治理
Kubernetes 的成功不仅在于其卓越的技术架构,还在于其开放的治理模式和蓬勃发展的社区。它从一个 Google 的内部项目,演变为由 CNCF 管理的全球性行业标准,这一过程对其广泛采用起到了决定性作用。
4.1 从诞生到 1.0 版本
Kubernetes 的第一个代码提交于 2014 年 6 月 6 日被推送到 GitHub 5。不久之后,Google 正式向外界宣布了这个项目 2。来自 Red Hat 等公司的关键贡献者迅速加入,项目进入了快速发展期 4。2015 年 7 月 21 日,Kubernetes 1.0 版本正式发布,这标志着该项目已“为生产环境准备就绪” 24。
1.0 版本的发布公告强调了一系列对于生产工作负载至关重要的核心功能,包括:内置的 DNS 服务发现、负载均衡、自动扩展、应用级别的健康检查、服务账户(Service Accounts)以及通过持久卷(Persistent Volumes)对有状态应用的支持,例如与 Google Compute Engine 持久磁盘和 AWS Elastic Block Store 的集成 27。
4.2 云原生计算基金会(CNCF)
4.2.1 项目捐赠与中立治理的意义
在发布 1.0 版本的同时,Google 宣布与 Linux 基金会合作,共同成立云原生计算基金会(CNCF),并将 Kubernetes 作为其“种子技术”捐赠给该基金会 4。这是一个具有深远战略意义的举措。通过将项目置于一个中立的、非营利性基金会的管理之下,Google 有效地消除了其他公司(尤其是其竞争对手)对于项目未来发展方向可能被单一厂商控制的担忧 29。这一举动极大地促进了行业范围内的协作,并为 Kubernetes 成为一个真正的、被广泛接受的行业标准铺平了道路。
4.2.2 毕业之路:标准与意义
2018 年 3 月 6 日,Kubernetes 成为 CNCF 第一个“毕业”的项目 7。在 CNCF 的治理框架中,“毕业”是项目成熟度的最高标志,意味着该项目在技术、社区和治理方面都达到了行业领先水平 32。要达到毕业状态,项目必须满足一系列严格的标准,包括:
广泛的采用度:证明项目在生产环境中被多个组织广泛使用。
结构化的治理流程:拥有一个公开的、文档化的、结构清晰的治理模型。
对社区成功和包容性的坚定承诺:展示出一个健康、活跃、多元化和包容的贡献者社区 32。
4.3 社区治理结构
为了满足 CNCF 的毕业要求,Kubernetes 建立了一套正式且分层的社区治理结构。
4.3.1 指导委员会的角色
指导委员会(Steering Committee)是 Kubernetes 项目的最高治理机构,负责处理所有非技术性的事务 32。它由 7 名通过社区选举产生的成员组成,任期两年 34。其职责包括定义和维护项目的价值观与结构、处理财务规划、批准新的社区小组章程,并作为社区内部非技术性争议的最终裁决机构 34。
4.3.2 特别兴趣小组(SIG)与工作组(WG)
项目的绝大部分技术和社区工作都在特别兴趣小组(SIG)和工作组(WG)内进行 37。
SIGs:是长期存在的、负责项目特定领域的自治小组。每个 SIG 都拥有明确的职责范围,例如 SIG-Network 负责网络相关的 API 和组件,SIG-Storage 负责存储,SIG-Apps 负责应用程序的部署和管理 38。每个 SIG 都有自己的章程(Charter),详细定义了其范围、治理方式和决策流程 42。
WGs:是临时性的、为了解决跨多个 SIG 的特定问题而成立的小组。与 SIG 不同,工作组不拥有代码,并且在完成其既定目标后就会解散 38。
这种治理模式的建立,不仅仅是为了满足 CNCF 的官僚程序要求,它更是 Kubernetes 生态系统爆炸性增长的根本催化剂。一个由单一供应商主导的开源项目,无论其技术多么先进,都会让竞争对手和大型企业在投入资源时感到犹豫,因为他们担心项目的未来方向会受到竞争对手的单方面影响 1。将 Kubernetes 捐赠给 CNCF,为其提供了一个“中立的家园” 31,这明确表示 Google 放弃了最终控制权,从而真正地邀请全行业进行合作。正式的治理结构,如指导委员会和拥有章程的 SIG,为非 Google 实体提供了一条清晰、文档化的路径,使它们能够有意义地贡献代码、参与决策并影响项目的未来 36。这种可感知的公平性和中立性,为微软(AKS)、AWS(EKS)和 Red Hat(OpenShift)等主要云服务提供商和企业级供应商消除了采用风险,促使它们迅速围绕 Kubernetes 构建自己的商业产品,从而将 Kubernetes 从一个“Google 的项目”转变为一个普适的行业基础设施层 5。因此,Kubernetes 的成功,既是其技术架构的胜利,也是其社区和治理工程的胜利。
4.4 1.0 版本后的主要功能里程碑
自 1.0 版本发布以来,Kubernetes 经历了一系列重要的版本迭代,不断引入新功能并稳定核心 API。下表总结了其中一些关键的里程碑事件。
5.0 Kubernetes 上的主要应用架构
Kubernetes 的设计使其成为运行现代云原生应用的理想平台。其核心 API 对象为构建和管理从无状态微服务到复杂有状态应用等各种架构提供了坚实的基础。
5.1 编排微服务
Kubernetes 的核心功能天然地契合了微服务架构的需求,使其成为部署和管理微服务的首选平台 45。
5.1.1 服务发现、网络与配置管理
Kubernetes 提供了一套内置机制来解决微服务架构中的关键挑战:
服务发现:在动态的微服务环境中,服务的实例(Pod)是短暂的,其 IP 地址会随生灭而改变。Kubernetes 的 Service 对象为此提供了解决方案。一个 Service 为一组功能相同的 Pod 提供了一个稳定的虚拟 IP 地址和 DNS 名称。其他微服务只需通过这个稳定的服务名进行通信,Kubernetes 会自动将请求负载均衡到后端健康的 Pod 上,从而将服务的消费者与提供者的具体实例解耦 45。
配置管理:遵循十二要素应用(Twelve-Factor App)的最佳实践,应将配置与代码分离。Kubernetes 通过 ConfigMap 和 Secret 对象实现了这一点。ConfigMap 用于存储非敏感的配置数据(如键值对或配置文件),而 Secret 则用于存储敏感信息(如密码、API 密钥)。这些对象可以作为环境变量或文件卷挂载到 Pod 中,使得配置的更新无需重新构建容器镜像 21。
5.1.2 示例:部署一个多语言微服务应用
以下示例展示了如何使用 Kubernetes 的 Deployment 和 Service 对象来部署一个简单的多语言应用,其中包含一个 Python 前端和一个 Go 后端。
后端服务(Go)
首先,定义后端的 Deployment,它负责管理后端 Pod 的副本。
YAML
# backend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: backend-app
spec:
replicas: 2
selector:
matchLabels:
app: backend
template:
metadata:
labels:
app: backend
spec:
containers:
- name: backend-container
image: "hashicorp/http-echo:0.2.3" # 使用一个简单的 echo 服务器作为示例
args:
- "-text=Hello from backend!"
ports:
- containerPort: 5678
然后,为后端 Deployment 创建一个 Service,使其可以在集群内部被发现。
YAML
# backend-service.yaml
apiVersion: v1
kind: Service
metadata:
name: backend-service
spec:
selector:
app: backend
ports:
- protocol: TCP
port: 80
targetPort: 5678
前端服务(Python)
接下来,定义前端的 Deployment。这个前端应用会通过后端服务的 DNS 名称 backend-service 来访问它。
YAML
# frontend-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend-app
spec:
replicas: 2
selector:
matchLabels:
app: frontend
template:
metadata:
labels:
app: frontend
spec:
containers:
- name: frontend-container
image: python:3.9-slim
command: ["/bin/sh", "-c"]
args:
- >
pip install flask requests &&
export FLASK_APP=app.py &&
echo 'from flask import Flask, jsonify; import requests; app = Flask(__name__); @app.route("/") def hello(): try: r = requests.get("http://backend-service"); return f"Frontend says: {r.text}" except Exception as e: return f"Error contacting backend: {e}"' > app.py &&
flask run --host=0.0.0.0 --port=8080
ports:
- containerPort: 8080
最后,为前端创建一个 LoadBalancer 类型的 Service,以便从集群外部访问它。
YAML
# frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
name: frontend-service
spec:
type: LoadBalancer
selector:
app: frontend
ports:
- protocol: TCP
port: 80
targetPort: 8080
将这些 YAML 文件应用到集群后 (kubectl apply -f.),Kubernetes 会创建相应的 Pod 和服务。前端服务可以通过 Kubernetes 的内部 DNS http://backend-service 找到并调用后端服务,而外部用户可以通过负载均衡器的 IP 地址访问前端。
5.2 管理有状态应用
尽管 Kubernetes 最初以其对无状态应用的强大支持而闻名,但它已经发展出一套成熟的工具来可靠地运行有状态应用,如数据库、消息队列等 48。
5.2.1 核心原语:StatefulSet 与持久卷
持久卷(PersistentVolume, PV)与持久卷声明(PersistentVolumeClaim, PVC):这是 Kubernetes 的存储抽象。PV 是由管理员配置的集群中的一块存储,而 PVC 是用户对存储的请求。PVC 会与一个满足其要求的 PV 绑定。这种设计将存储的消费(由开发者通过 PVC 发起)与存储的提供(由管理员通过 PV 或动态供应器配置)解耦 50。
StatefulSet:是专门为管理有状态应用而设计的工作负载 API 对象。与 Deployment 不同,StatefulSet 为其管理的每个 Pod 提供了独一无二的、稳定的身份标识。这些标识包括:
稳定的网络标识符:每个 Pod 都有一个基于其序号的、可预测的 DNS 名称(例如 my-app-0, my-app-1)。
稳定的持久存储:每个 Pod 都会绑定到一个独立的、持久的存储卷,即使 Pod 被重新调度,它也会重新连接到同一个存储卷 5。
5.2.2 Operator 模式:实现应用专属的自动化
对于像数据库集群这样复杂的有状态应用,仅靠 StatefulSet 等基本原语可能不足以实现全自动化的运维。例如,数据库的备份、恢复、故障转移和升级等操作通常需要复杂的、特定于应用的领域知识。Operator 模式正是为了解决这个问题而生 51。
Operator 是一种将人类运维知识编码为软件的方法。它通过自定义资源定义(Custom Resource Definition, CRD)来扩展 Kubernetes API,允许用户像管理内置资源(如 Pod)一样管理复杂的应用。Operator 本质上是一个自定义的控制器,它会监视这些自定义资源,并根据其中定义的期望状态来执行复杂的操作,如协调集群成员、执行备份、处理故障等 51。
构建 Operator 的最佳实践包括:为每个应用开发一个专用的 Operator;使用声明式 API 而非命令式 API;将不同的功能(如备份、伸缩)划分到多个控制器中;以及使用异步的调谐循环以避免阻塞 52。
5.2.3 示例:一个带持久存储的 StatefulSet
以下 YAML 文件定义了一个简单的 StatefulSet,它使用 volumeClaimTemplates 为每个副本动态地创建并绑定一个独立的持久卷。
YAML
# statefulset.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes:
resources:
requests:
storage: 1Gi
---
# headless-service.yaml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None # 必须为 None 来创建 Headless Service
selector:
app: nginx
在这个例子中,StatefulSet 会创建三个 Pod,分别名为 web-0、web-1 和 web-2。每个 Pod 都会获得一个独立的、1GiB 的持久卷。headless-service 则为这些 Pod 提供了稳定的网络域名,例如 web-0.nginx、web-1.nginx 等。
5.3 Kubernetes 作为 CI/CD 的基础
Kubernetes 极大地简化和自动化了持续集成与持续部署(CI/CD)流程中的部署、扩展和管理环节,使其成为现代 DevOps 工作流的基石 53。
5.3.1 集成构建、测试和部署流水线
一个典型的基于 Kubernetes 的 CI/CD 流水线如下:
代码提交:开发者将代码变更推送到版本控制系统(如 Git)。
构建与测试:CI 服务器(如 Jenkins、GitHub Actions)自动拉取代码,运行单元测试和集成测试,然后构建一个新的容器镜像 53。
镜像推送:构建成功的镜像被推送到一个容器镜像仓库(如 Docker Hub, Google Container Registry)。
部署:CD 工具(或 CI 服务器的部署阶段)更新 Kubernetes Deployment 对象中的镜像标签,指向新构建的镜像版本。Kubernetes 会自动触发一个滚动更新(rolling update),逐步用新版本的 Pod 替换旧版本的 Pod,从而实现零停机部署 57。
5.3.2 最佳实践:GitOps、镜像扫描与回滚策略
GitOps:这是一种将 Git 作为声明式基础设施和应用唯一真实来源的实践范式。集群的状态通过 Git 仓库中的配置文件来定义。像 Argo CD 或 Flux 这样的 GitOps 工具会自动监视 Git 仓库的变更,并将其同步到 Kubernetes 集群中,实现完全自动化的、可审计的部署流程 54。
镜像扫描:在 CI 流水线中集成容器镜像漏洞扫描是一个至关重要的安全实践。在镜像被推送到仓库或部署到集群之前,扫描工具可以检测其中已知的安全漏洞,从而防止不安全的软件进入生产环境 54。
回滚策略:Kubernetes 的 Deployment 对象原生支持版本历史记录和一键回滚到之前的稳定版本。任何 CD 策略都应该将自动化回滚作为核心部分,以确保在部署失败时能够快速恢复服务,最大限度地减少对用户的影响 54。
6.0 扩展中的 Kubernetes 生态系统
Kubernetes 的成功不仅在于其核心功能,更在于它作为一个可扩展平台,催生了一个庞大而充满活力的生态系统。这些工具和项目建立在 Kubernetes 之上,解决了从服务间通信到监控、打包等一系列更高级别的挑战。
6.1 服务网格:可观察性、安全性与流量管理
随着微服务数量的增加,服务之间的通信网络变得异常复杂,难以管理和保护。服务网格(Service Mesh)作为一个专用的基础设施层,旨在以一种与应用程序代码解耦的方式来处理这些服务间的通信 58。它通常通过在每个服务实例旁边部署一个轻量级网络代理(即“边车”或 sidecar)来实现 60。
6.1.1 架构概览:Istio 与 Linkerd
Istio:由 Google、IBM 和 Lyft 联合开发,是功能最全面的服务网格之一。其架构分为数据平面和控制平面。数据平面由一系列 Envoy 代理组成,它们作为 sidecar 部署,拦截进出服务的所有网络流量。控制平面则负责配置和管理这些代理,它包含用于流量管理的 Pilot、负责安全(证书管理和 mTLS)的 Citadel 等组件。Istio 能够在不修改任何应用代码的情况下,提供复杂的流量路由(如 A/B 测试、金丝雀发布)、强大的安全策略(如强制 mTLS 加密)以及丰富的可观察性(指标、分布式追踪和日志)58。
Linkerd:作为 CNCF 的毕业项目,Linkerd 以其简单性、高性能和低资源消耗而闻名。它同样采用控制平面和数据平面的架构,但其数据平面使用的是用 Rust 编写的超轻量级“微代理”(micro-proxies)。Linkerd 的核心设计哲学是“默认安全”,它会自动为网格内的所有 TCP 通信启用并强制执行双向 TLS(mTLS)。在可观察性方面,Linkerd 专注于提供所谓的“黄金指标”:成功率、请求率和延迟,并通过其仪表板和 CLI 工具直观地展示出来 60。
6.2 使用 Prometheus 进行监控与告警
Prometheus 是另一个 CNCF 毕业项目,已成为云原生领域监控和告警的事实标准 65。
6.2.1 拉取模型与服务发现
Prometheus 的核心工作方式是基于“拉取模型”(pull model)。Prometheus 服务器会定期从应用程序暴露的 HTTP 端点上抓取(scrape)指标数据 65。这种模式与 Kubernetes 的动态环境完美契合。Prometheus 能够与 Kubernetes API 服务器原生集成,利用其服务发现机制,根据 Pod 和 Service 的标签(labels)和注解(annotations)自动发现需要监控的目标。这意味着当新的服务部署或旧的服务下线时,Prometheus 无需手动配置即可自动更新其监控目标列表 65。其架构主要包括 Prometheus 服务器本身、用于植入应用的客户端库、用于适配第三方系统的导出器(exporters),以及用于处理和发送告警的 Alertmanager 65。
6.3 使用 Helm 进行应用打包与管理
Helm 将自己定位为“Kubernetes 的包管理器”,极大地简化了在 Kubernetes 上查找、共享和使用软件的过程 68。
6.3.1 Chart、Release 与 Repository
Helm 的核心概念是“Chart”。一个 Chart 是一个预先配置的 Kubernetes 资源集合的打包格式,它将部署一个应用所需的所有 YAML 文件(如 Deployment、Service、ConfigMap 等)组织在一起 68。Chart 使用 Go 模板语言,允许用户通过一个名为 values.yaml 的文件来定制化部署配置,而无需修改模板本身 70。当一个 Chart 被安装到集群中时,Helm 会创建一个“Release”,这是一个带有特定配置的、被版本化的 Chart 实例。Chart 可以被存储和分享在“Repository”中,类似于 apt 或 yum 的软件仓库 72。
6.3.2 示例:一个基础的 Helm Chart 结构
通过 helm create my-app 命令可以生成一个标准的 Chart 目录结构,其中关键文件和目录包括:
Chart.yaml:包含 Chart 的元数据,如名称、版本和描述。
values.yaml:提供了 Chart 模板中所有可配置参数的默认值。
templates/ 目录:存放所有 Kubernetes 资源的模板化 YAML 文件。Helm 会在安装时渲染这些模板,并将 values.yaml 中的值注入其中 68。
6.4 将 Kubernetes 扩展至混合云与多云环境
Kubernetes 的平台无关性使其成为实现混合云和多云战略的关键技术 6。企业可以在不同的云提供商和本地数据中心部署 Kubernetes 集群,并寻求统一的管理平面。
6.4.1 使用 Azure Arc 进行统一管理
Azure Arc 是微软提供的一项服务,旨在将 Azure 的管理能力扩展到任何地方运行的 Kubernetes 集群,包括本地数据中心、AWS 或 GCP 74。其工作原理是在目标 Kubernetes 集群中部署一个 Arc 代理。该代理会建立一条到 Azure 的安全的、仅出站的连接,从而将该集群“投射”为 Azure 中的一个资源。一旦连接,管理员就可以通过 Azure 门户、CLI 或 API,使用 Azure Policy 来统一实施治理和合规策略,使用 Azure Monitor 来集中监控集群的健康状况和性能,而无需改变集群原有的控制平面或将工作负载迁移到 Azure 74。
Kubernetes 核心 API 的成功和稳定,使其从一个单纯的容器编排器演变为一个通用的、分布式的系统“内核”。这种稳定性反过来又催生了一个庞大且专业的生态系统,其中新的抽象层(如服务网格、Operator、GitOps 工具)被构建在 Kubernetes 之上,而不是试图取代其核心。Kubernetes 为分布式系统的基本原语——计算(Pod)、存储(PV/PVC)和网络(Service)——提供了一个稳定的、声明式的 API 75。这使得其他项目能够将 Kubernetes 视为一个基础平台或“API 基板”。像 Istio、Prometheus 和 Argo CD 这样的项目,无需从零开始构建一个分布式系统,而是利用 Kubernetes API 来满足自身的需求(例如,通过 CRD 进行服务发现、配置存储和组件调度)56。这就形成了一个良性循环:生态系统工具越强大,Kubernetes 作为底层平台的地位就越不可或缺。生态系统工具处理更高级别的专业问题(服务间流量、应用生命周期、监控),而 Kubernetes 则专注于资源编排这一普适性的底层任务。因此,未来基础设施创新的方向,更多地是在 Kubernetes 的通用 API 之上构建新的价值,而不是取代它。Kubernetes 成功地抽象了底层的云或本地基础设施,为新一代专业的云原生工具创造了一个单一、一致的平台。
7.0 未来前景与新兴范式
Kubernetes 已经从一个容器编排工具演变为一个通用的控制平面,其生态系统正在不断向新的领域扩展,包括人工智能/机器学习、边缘计算、无服务器架构,甚至探索超越传统容器的运行时。
7.1 通过 Kubeflow 赋能 AI/ML 工作负载
Kubeflow 是一个致力于在 Kubernetes 上简化、移植和扩展机器学习(ML)工作流的开源项目 76。它为整个机器学习生命周期提供了一个原生的 Kubernetes 工具包,包括用于构建和管理可重复的 ML 工作流的 Kubeflow Pipelines,用于模型服务的 KServe,以及用于超参数调优的 Katib 76。通过将复杂的、多阶段的 ML 任务(如数据预处理、模型训练、模型评估和部署)封装为容器化的、可复用的组件,Kubeflow 允许数据科学家和 ML 工程师以声明式的方式定义和执行端到端的 ML 流水线,充分利用 Kubernetes 的可扩展性和弹性 77。
7.2 通过 KubeEdge 扩展至边缘
随着物联网(IoT)和边缘计算的兴起,将云原生能力延伸到网络边缘的需求日益增长。KubeEdge 是一个 CNCF 的孵化级项目,旨在将 Kubernetes 的编排能力从云端扩展到边缘节点 80。其架构包含一个运行在云端的“云核心”(CloudCore)和一个部署在边缘节点上的“边核心”(EdgeCore)80。KubeEdge 能够在云和边缘之间同步元数据,允许用户使用标准的 Kubernetes API 来部署和管理边缘应用及设备。一个关键特性是,即使与云端的连接中断,边缘节点也能够自主运行(离线模式)。KubeEdge 的设计非常轻量化,其边缘组件的运行内存需求仅为约 30MB,使其适用于资源受限的边缘设备 80。
7.3 通过 Knative 实现无服务器架构
无服务器(Serverless)计算范式允许开发者专注于编写代码,而无需管理底层服务器。Knative 是一个构建在 Kubernetes 之上的开源平台,用于构建、部署和管理现代化的无服务器工作负载 84。它通过一组中间件组件扩展了 Kubernetes,提供了无服务器应用所需的关键功能,包括请求驱动的自动伸缩(可从零开始扩展)、基于事件的驱动架构(通过其 Eventing 组件),以及应用内构建等 85。Knative 使开发者能够在 Kubernetes 集群上获得类似 AWS Lambda 或 Google Cloud Functions 的体验,同时避免了供应商锁定。
7.4 WebAssembly (Wasm) 作为容器替代品的潜力
WebAssembly(Wasm)正在成为一种有潜力的容器替代技术。Wasm 最初为浏览器设计,是一种可移植、高效、安全的二进制指令格式。通过 WebAssembly 系统接口(WASI),Wasm 模块现在可以在浏览器之外的任何环境中运行。与传统容器相比,Wasm 模块的启动速度极快(通常在毫秒级),并且提供了更强的沙箱隔离性。业界正在积极探索直接在 Kubernetes 上运行 Wasm 应用,这有望为某些类型的工作负载(特别是短暂的、函数式的任务)提供比容器更轻量、更高效的运行时 87。
7.5 结论:Kubernetes 作为通用控制平面
综合本报告的分析,可以得出结论:Kubernetes 已经远远超越了其作为容器编排器的初始定位。凭借其健壮、声明式且高度可扩展的 API,它已经演变为一个通用的控制平面——一个用于构建其他平台的平台。无论是管理云端的微服务、编排复杂的机器学习流水线、运行无服务器函数,还是控制网络边缘的设备,Kubernetes 都提供了一套一致的架构模式,用于以声明式的方式管理任何应用或系统的生命周期。它的未来在于巩固其作为云原生时代无处不在的“分布式系统内核”的地位,继续为上层应用的创新提供坚实的基础。
Works cited
The History of Kubernetes | IBM, accessed October 16, 2025,
The Amazing Story of Kubernetes: How Google Changed the World of Cloud Computing, accessed October 16, 2025,
The past, present, and future of Google Kubernetes Engine - YouTube, accessed October 16, 2025,
Kubernetes - Wikipedia, accessed October 16, 2025,
The History of Kubernetes | Razorops, accessed October 16, 2025,
Who Made Kubernetes And Why Is It Popular? - OpsRamp, accessed October 16, 2025,
Kubernetes Project Journey Report | CNCF, accessed October 16, 2025,
Large-scale cluster management at Google with Borg, accessed October 16, 2025,
Borg: A Cluster management system | by Aditya Shete - Medium, accessed October 16, 2025,
Large-scale cluster management at Google with ... - Google Research, accessed October 16, 2025,
Large-scale cluster management at Google with Borg, accessed October 16, 2025,
Borg, Omega, and Kubernetes - Google Research, accessed October 16, 2025,
Omega: flexible, scalable schedulers for large ... - Google Research, accessed October 16, 2025,
Borg, Omega, and Kubernetes (2016), accessed October 16, 2025,
[PDF] Omega: flexible, scalable schedulers for large compute clusters - Semantic Scholar, accessed October 16, 2025,
Omega: Flexible, scalable schedulers for large compute clusters | Request PDF, accessed October 16, 2025,
Omega: flexible, scalable schedulers for large compute clusters - Google Research, accessed October 16, 2025,
Omega: flexible, scalable schedulers for large compute clusters - Semantic Scholar, accessed October 16, 2025,
Cloud Computing Large-scale Resource Management, accessed October 16, 2025,
How Kubernetes came to be: A co-founder shares the story | Google ..., accessed October 16, 2025,
A Brief History of Google's Kubernetes and Why It's Fantastic | by Alan Wang | FST Network, accessed October 16, 2025,
Can Linux Containers Clustering Solutions offer High Availability?, accessed October 16, 2025,
Top Mistakes to Avoid When Using Kubernetes in Google Cloud | Devoteam, accessed October 16, 2025,
10 Years of Kubernetes | Kubernetes, accessed October 16, 2025,
Kubernetes Design and Development Explained | Tigera, accessed October 16, 2025,
Communication Aware Scheduling of Microservices-based Applications on Kubernetes Clusters - SciTePress, accessed October 16, 2025,
Kubernetes V1 Released - Cloud ... - Google Cloud Platform Blog, accessed October 16, 2025,
The History of Kubernetes - Aqua Security, accessed October 16, 2025,
Cloud Native Computing Foundation to fully operate Kubernetes – with help of Google Cloud grant, accessed October 16, 2025,
Google Cloud grants $9M in credits for the operation of the Kubernetes project, accessed October 16, 2025,
Cloud Native Computing Foundation Receives $9 Million Cloud Credit Grant from Google Cloud to Fund Kubernetes Development, Empower Community, accessed October 16, 2025,
Cloud Native Computing Foundation announces Kubernetes® as ..., accessed October 16, 2025,
Graduation day: Kubernetes hits key milestone as CNCF lays out a cloud-native road map, accessed October 16, 2025,
kubernetes/steering: The Kubernetes Steering Committee - GitHub, accessed October 16, 2025,
Announcing the 2023 Steering Committee Election Results - Kubernetes, accessed October 16, 2025,
KubeCon EU 2023 - What does the Steering Committee Steer? - Sched, accessed October 16, 2025,
Inside Kubernetes: How the Community Keeps One of the World's Largest Open Source Projects Moving - theCUBE Research, accessed October 16, 2025,
Kubernetes Community Annual Report 2020 | CNCF, accessed October 16, 2025,
Community Groups | Kubernetes Contributors, accessed October 16, 2025,
Spotlight on SIG Apps - Kubernetes, accessed October 16, 2025,
Spotlight on SIG Network - Kubernetes Contributors, accessed October 16, 2025,
Governance | KubeEdge, accessed October 16, 2025,
SIG Multicluster: Introduction, accessed October 16, 2025,
The History of Kubernetes on a Timeline - RisingStack Engineering, accessed October 16, 2025,
Microservices in Kubernetes: A Practical Guide - Tigera, accessed October 16, 2025,
A Guide to Using Kubernetes for Microservices - vCluster, accessed October 16, 2025,
(PDF) Kubernetes for Microservices Deployment Across Cloud Platforms - ResearchGate, accessed October 16, 2025,
Latest News Related to Kubernetes Data Services - ionir, accessed October 16, 2025,
Managing Stateful Applications on Kubernetes: Challenges and Best Practices - Semaphore, accessed October 16, 2025,
Kubernetes CSI (Container Storage Interface): Complete Guide - Portworx, accessed October 16, 2025,
What is a Kubernetes Operator? Functions and Examples - Kong Inc., accessed October 16, 2025,
Best practices for building Kubernetes Operators and stateful apps ..., accessed October 16, 2025,
Kubernetes for CI/CD: A Complete Guide for 2025 - CloudOptimo, accessed October 16, 2025,
Kubernetes CI/CD Pipelines – 8 Best Practices and Tools - Spacelift, accessed October 16, 2025,
Continuous integration and application deployment with the Kubernetes technology - ČVUT DSpace, accessed October 16, 2025,
CI/CD Kubernetes: 5 Key Benefits, Tools and Best Practices - Codefresh, accessed October 16, 2025,
Kubernetes Security in Your CI/CD Pipeline - Cloud Native Now, accessed October 16, 2025,
Istio service mesh on Kubernetes - Revolgy, accessed October 16, 2025,
List of 7 Best Service Mesh Tools For Microservices 2025 - DevOpsCube, accessed October 16, 2025,
What is a service mesh? | Linkerd, accessed October 16, 2025,
Service Mesh on Kubernetes with Istio | PDF - Slideshare, accessed October 16, 2025,
Istio : Service Mesh | PDF - Slideshare, accessed October 16, 2025,
Overview | Linkerd, accessed October 16, 2025,
Introduction to the service mesh—the easy way - Linkerd, accessed October 16, 2025,
Overview | Prometheus, accessed October 16, 2025,
Prometheus - Monitoring system & time series database, accessed October 16, 2025,
Alertmanager | Prometheus, accessed October 16, 2025,
Helm: Kubernetes package manager – an overview, getting started - RTFM, accessed October 16, 2025,
Install Helm Kubernetes Package Manager on Oracle Linux 8 - Atlantic.Net, accessed October 16, 2025,
An Introduction to Helm: the Kubernetes Package Manager - Appsmith Community Portal, accessed October 16, 2025,
Installing Helm, Kubernetes Package Manager | Zachi Nachshon's Blog, accessed October 16, 2025,
Getting Started with Helm: Kubernetes Package Manager | by SYJ's ..., accessed October 16, 2025,
Understanding Kubernetes in Hybrid and Multi-Cloud Environments - Mirantis, accessed October 16, 2025,
Simplifying Kubernetes Management with Azure Arc - CloudOptimo, accessed October 16, 2025,
Kubernetes Documentation, accessed October 16, 2025,
Unleashing the Power of Kubeflow: A Guide to Training Machine Learning Pipelines (Part 1: Introduction) - Medium, accessed October 16, 2025,
Building Your First Kubeflow Pipeline: A Comprehensive Guide - Hugging Face, accessed October 16, 2025,
Kubeflow on GKE: Troubleshooting Setup Challenges and Running ML Pipelines, accessed October 16, 2025,
Machine Learning with Kubeflow on Amazon EKS with Amazon EFS | AWS Storage Blog, accessed October 16, 2025,
KubeEdge, a Kubernetes Native Edge Computing Framework ..., accessed October 16, 2025,
Kubernetes on the edge: getting started with KubeEdge and Kubernetes for edge computing | CNCF, accessed October 16, 2025,
KubeEdge Documentation - Read the Docs, accessed October 16, 2025,
Why KubeEdge | KubeEdge, accessed October 16, 2025,
Cloud Native Computing Foundation Announces Knative's Graduation | CNCF, accessed October 16, 2025,
Cloud Native Computing Foundation Announces Knative's Graduation - PR Newswire, accessed October 16, 2025,
PacktPublishing/Architecting-Cloud-Native-Serverless ... - GitHub, accessed October 16, 2025,
KubeCon + CloudNative North America 2023: Full Schedule, accessed October 16, 2025,
Installing kubeflow on Amazon EKS (December 2023) - DEV Community, accessed October 16, 2025,