1. 先从一个问题开始:为什么只有容器还不够?
学 Kubernetes,最容易卡住的地方,不是命令太多,而是没搞清楚它到底在解决什么问题。容器让应用打包、分发、运行变得更轻量,也更容易跨机器、跨环境迁移;但当容器数量从 1 个变成 10 个、100 个、1000 个时,新的复杂度就出现了:谁来决定容器跑在哪台机器上、挂了以后谁来拉起、扩缩容如何做、发布如何不中断、服务之间怎么互相访问。Kubernetes 正是为这些问题而生,它是一个可移植、可扩展、开源的平台,用来管理容器化工作负载与服务,同时强调声明式配置与自动化::cite[147].
换句话说,容器解决的是“应用怎么装”,而 Kubernetes 解决的是“装好以后如何稳定、大规模、长期地运行”。如果把容器比作积木块,那么 Kubernetes 更像是一个自动化搭建和维护积木城市的系统:你告诉它最后想要什么样子,它持续把现实状态拉回到目标状态::cite[147].
2. 从容器到容器编排
容器时代之前,大家常见的部署方式是物理机部署和虚拟机部署。物理机资源利用率低,应用隔离性差;虚拟机带来了更强的隔离,但镜像重、启动慢、运维成本高。容器进一步把应用和运行依赖一起打包,变得更轻、更快,也更方便在不同操作系统发行版和云环境之间迁移::cite[147].
但容器本身并不会自动解决以下问题:
- 一台宿主机资源不够了,容器该迁到哪里?
- 某个容器崩了,谁来自动重启?
- 同一个服务需要跑 3 个副本时,如何保证数量始终正确?
- 新版本上线时,如何逐步替换旧版本并尽量不中断服务?
- 多个容器之间,如何稳定发现彼此并通信?
这些问题合在一起,就叫容器编排(Container Orchestration)。所谓编排,不只是“启动容器”,而是围绕容器生命周期进行调度、伸缩、发布、恢复、暴露网络能力以及持续维护期望状态。Kubernetes 是这一领域最主流的标准平台之一::cite[147].
3. Kubernetes 主要解决了哪些问题
3.1 应用部署标准化
Kubernetes 使用统一的 API 对象描述应用和基础设施关系,例如 Pod、Deployment、Service、ConfigMap、Secret。这样一来,开发、测试、预发、生产环境都可以围绕同一套资源模型工作,避免“本地能跑、线上不行”的环境漂移问题::cite[147].
3.2 自动调度
你不需要手工指定“这个容器必须跑在第几台机器”。Kubernetes 会根据资源需求、约束条件、亲和性/反亲和性等信息,把工作负载调度到合适的节点上。对使用者来说,更关注的是“我要运行什么”,而不是“我要把它塞到哪台机器里”::cite[177].
3.3 自愈能力
如果进程退出、容器异常、节点不可用,Kubernetes 会尝试重新拉起、重新调度,尽量把系统恢复到你声明的目标状态。这种能力是云原生应用高可用的基础之一::cite[177].
3.4 水平扩缩容
流量上涨时扩容,流量回落时缩容,是现代应用的常见需求。Kubernetes 能让工作负载副本数成为一个可管理的目标值,并与自动扩缩容能力结合,降低人为干预成本::cite[177].
3.5 服务发现与负载均衡
容器 IP 往往不稳定,Pod 也可能被重建。Kubernetes 通过 Service 等机制为应用提供相对稳定的访问入口,让调用方不用关心后端实例的具体变化::cite[147].
3.6 可扩展的生态接入
Kubernetes 并不试图把所有能力都做成内建功能。它提供声明式 API 与扩展机制,允许生态围绕网络、存储、安全、监控、网关、CI/CD、Operator 等方向持续增强能力。这也是它能成为平台底座的重要原因::cite[296].
4. Kubernetes 的核心设计理念
4.1 声明式:描述“想要什么”,而不是“怎么做”
Kubernetes 最重要的思想之一,是声明式(Declarative)。你提交一个 YAML,不是在写脚本命令说“先创建容器 A,再启动容器 B,再检查网络”,而是在告诉系统:我希望这里有一个名叫 nginx-demo 的 Pod,它使用 nginx 镜像,对外暴露 80 端口。之后如何达成这个结果,由 Kubernetes 内部组件协同完成::cite[147].
这和传统命令式运维非常不同。命令式更像“手把手操作”;声明式更像“提交目标说明书”。好处是:
- 配置可版本化,适合纳入 Git 管理;
- 结果可重复,便于团队协作;
- 系统可以持续校正偏差,而不是只执行一次命令就结束。
4.2 控制循环:持续逼近期望状态
Kubernetes 官方文档特别强调,它并不是单纯执行 A→B→C 工作流的“编排器”,而是一组独立、可组合的控制过程(control processes)。这些控制过程会持续观察当前状态,并把系统往你提供的目标状态拉回去::cite[147].
这个思想也叫控制循环(Control Loop)。比如:
- 你声明 Deployment 需要 3 个副本;
- 当前系统实际只有 2 个;
- 控制器发现偏差;
- 它继续创建第 3 个 Pod;
- 如果其中一个又挂了,控制器会再次补齐。
所以,Kubernetes 的关键不是“一次执行成功”,而是“持续对齐”。这也是为什么它非常适合动态变化的生产环境。
4.3 可扩展性:平台不是大而全,而是可生长
Kubernetes 的另一个核心理念是可扩展性(Extensibility)。它提供统一 API,同时允许通过 Custom Resource、扩展 API、控制器、插件等方式把平台能力继续往上长。你可以把数据库运维流程、机器学习训练任务、业务中间件生命周期,封装成更高层的 Kubernetes 资源模型::cite[295].
对初学者来说,可以先把这件事理解成:Kubernetes 不只是一个产品,更像一个“平台内核”。你学会它的基本对象和工作方式之后,很多云原生工具都会变得更容易理解,因为它们往往都在围绕这套 API 与控制模型构建。
5. Kubernetes 在云原生体系中的位置
Kubernetes 不是云原生的全部,但它是云原生体系中的一个核心枢纽。官方文档指出,Kubernetes 本身聚焦于容器化工作负载管理,不强制规定日志、监控、告警、配置语言或所有 PaaS 能力的具体实现,而是通过标准接口与生态系统协作::cite[147].
可以把云原生体系粗略拆成几层:
| 层次 | 典型内容 | Kubernetes 的位置 |
|---|---|---|
| 基础设施层 | 计算、存储、网络、云主机 | Kubernetes 运行其上 |
| 容器运行层 | containerd、CRI、镜像仓库 | Kubernetes 依赖其提供运行能力 |
| 编排与调度层 | Pod、Deployment、Service、调度、自愈 | Kubernetes 核心所在 |
| 平台能力层 | Ingress、Service Mesh、监控、日志、CI/CD、GitOps | 大量围绕 Kubernetes 构建 |
| 应用交付层 | 微服务、数据服务、AI/批处理任务 | 作为业务负载运行在 Kubernetes 上 |
也正因为 Kubernetes 处在这个“中枢层”,它既向下承接基础设施,又向上支撑应用平台和研发交付体系。学会 Kubernetes,不等于学完云原生;但不理解 Kubernetes,通常很难真正进入云原生实践的核心地带::cite[147].
6. 先记住这几个关键词
如果这是你第一次接触 Kubernetes,本章先不要背太多命令,先把下面这几个词记牢:
- 容器编排:管理大量容器的部署、调度、扩缩容与恢复。
- 声明式:用配置描述目标状态。
- 控制循环:系统持续把现实状态拉回目标状态。
- 可扩展:Kubernetes 不是封闭系统,而是可被扩展的平台。
- 云原生中枢:它连接基础设施、平台能力和业务应用。
7. 本章小结
这一章最重要的收获,不是会写 YAML,而是建立一个正确的心智模型:Kubernetes 不是“运行容器的命令集合”,而是“持续维护应用目标状态的分布式系统平台”。当你后面学习 Pod、Deployment、Service、Ingress、Controller 时,都会不断回到今天这三个关键词:声明式、控制循环、可扩展性::cite[147].
📝 版权声明:本文为原创技术博客,转载请注明出处。
如文章中存在错误或不准确之处,欢迎在评论区指正,感谢您的阅读与支持!