Kubernetes 的工作原理——从期望状态到运行中的工作负载

Kubernetes 的工作原理,在一张交互式画布上讲清楚:清单文件、控制平面、调度,以及让工作负载持续运行的调谐循环。

Kubernetes 靠不断调谐来运行容器化应用:你声明期望状态,控制平面和工作节点就一直干活,让集群与之相符。

Kubernetes 的工作原理——从期望状态到运行中的工作负载

The interactive FlowJam canvas for this explanation — every lane, row and arrow above is a real QueryChart diagram you can open and edit.

How to read this visual

  • 四列从左往右读:声明、调度、运行、维持。
  • 上方控制平面的各行负责决策,下方工作节点的各行负责执行。自上而下的箭头是命令;从“Pod 健康吗?”绕回上方的那条线就是调谐周期。
  • 清单文件里的期望状态是唯一可信来源——其他每个方框存在的意义,都是把现实推向它。

声明期望状态

“kubectl apply 一份期望状态清单文件”是一切的起点:开发者描述目标——“API 的 3 个副本,镜像 v2.1,端口 8080”——然后提交上去。“API 服务器把期望状态存入 etcd”是落定的一刻:控制平面的 API 服务器是入口,etcd 是集群的唯一可信来源。之后发生的一切,都是这一次写入的结果。

调度

“调度器监听并为 Pod 挑选节点”和“调度器把每个 Pod 分配到一个健康的节点”,是控制平面在决定工作跑在哪里。调度器会权衡每个节点的资源和约束,把 Pod 放到最合适的候选节点上——开发者不挑机器,只声明期望状态。

在工作节点上运行

“节点上的 kubelet 拉取镜像并启动容器”是这套安排里工作节点的那一半:kubelet 是控制平面派驻在每个节点上的代理,它与容器运行时通信,启动分配过来的 Pod,并把健康状况汇报回去。“一个 Service 把流量路由到运行中的 Pod”补上了稳定的网络入口——Pod 来来去去,Service 的名字却不变。

维持状态

“控制器进行调谐——重启故障、伸缩副本”是反馈回路,“Pod 健康吗?”是它的探针——存活与就绪检查决定一个 Pod 是被替换(“否”分支绕回调谐)还是被保留。“Deployment 保持在期望状态”是终态:不是一份干完的活,而是一个与自己的清单文件相符的、运行中的系统。

Key relationships and takeaways

  • Kubernetes 是声明式的:你陈述目标,而不是步骤,剩下的交给系统。
  • 控制平面决策,kubelet 执行——期望状态不进 etcd,就什么都跑不起来。
  • 调谐就是那个循环:比较、补上差异、重复,永不停止。
  • 探针决定健康,健康决定是否替换——出故障的 Pod 无需人工介入就会被重启。
  • Kubernetes 编排的正是 Docker 打包出来的容器,这也是两张图解彼此相连的原因。

When to use this visual

  • 向刚接触 Kubernetes 的团队解释控制平面与工作节点的分工。
  • 在有人写下第一份 Deployment 和 Service 清单文件之前,先讲清楚声明式模型。
  • 为一场关于自愈的讨论打底——Kubernetes 会自动修好什么,什么仍然需要运维介入。

运作方式

  1. 标注你真正在跑的清单文件

    在 apply 这一步上,补充你真实的 Deployment 与 Service 信息——副本数、镜像、端口——让这张图与你的集群对得上。

  2. 补上网络层

    在 Service 与用户之间插入一个 Ingress 方框,写明你的集群如何对外暴露流量,因为这一块是多数团队最先定制的。

  3. 画出你的伸缩规则

    在调谐这一步上扩展出一条 Horizontal Pod Autoscaler 分支,按 CPU 或自定义指标伸缩副本,并以它自己的状态收尾。

  4. 补上故障与存储路径

    把有状态工作负载用的持久卷、以及你使用的反亲和性规则都画进来,每一项都加一条注释说明为什么。

常见问题

用大白话说,Kubernetes 是什么?

Kubernetes 是一套在一组机器组成的集群上运行容器化应用、并让它们一直跑下去的系统。你告诉它你想要什么——每个应用要几份、用哪个镜像、开哪些端口——它就把工作调度到机器上,重启故障,上下伸缩,并路由流量。这张图把这件事拆成声明、调度、运行和维持。

Kubernetes 的控制平面是什么?

控制平面是一组为集群做决策的组件:接收你清单文件的 API 服务器、存放期望状态的 etcd、放置 Pod 的调度器,以及把现实向期望状态调谐的控制器。它是大脑。工作节点是肌肉——每个节点上都跑着一个 kubelet,负责启动并监控分配给它的 Pod。

Kubernetes 里的“声明式”是什么意思?

意思是你描述目标状态,而不是下达达到目标的命令。你 apply 一份写着“运行三个副本”的清单文件;步骤由 Kubernetes 自己算出来,而且只要现实发生漂移,它就会一直执行下去。某个 Pod 挂了,控制器就创建一个替代品,回到三个——不需要人去重跑命令。清单文件是唯一可信来源,调谐则是机制。

Kubernetes 怎么让应用保持健康?

靠探针和调谐循环。存活探针告诉 Kubernetes 一个容器是否还活着——存活探针失败就重启它。就绪探针告诉它一个 Pod 能否承接流量——就绪探针失败就把它从 Service 上摘掉。控制器持续比较运行状态与期望状态并补上差异,这个循环就是图中“Pod 健康吗?”这个决策所代表的东西。

在 QueryChart(FlowJam)中编辑这张图解

把上面这张 Kubernetes 画布原样打开成你自己的图表,把组件名改成你自己集群里的名字,再给你的工作负载加上注释。

在 QueryChart(FlowJam)中编辑这张图解

可视化图解中的更多内容