【AI 总结】Kubernetes 工作负载
Kubernetes 工作负载 | AI 总结
工作负载核心概念
- 基本定义:工作负载指在 Kubernetes 上运行的应用程序,最小计算对象是 Pod,Pod 代表集群上处于运行状态的一组容器集合,且遵循预定义的生命周期(如节点故障会导致 Pod 状态变为失败,需重新创建恢复应用)。
- 负载资源作用:无需用户直接管理单个 Pod,通过负载资源搭配控制器,确保运行状态的 Pod 类型、数量与用户指定状态一致,减轻运维负担。
为了让你更直观地理解 Kubernetes(K8s)中的 “工作负载(Workloads)”,我们可以把 Kubernetes 集群想象成一家大型自动化工厂。
这里的 “工作负载” 其实就是工厂里的各类 “工单” 或 “用工模式”。
1. Pod:最基层的 “打工人”
Pod 是 K8s 里最小的活。你可以把它看作是一个工位(或者一小组紧密协作的员工)。
- 特点:员工(容器)可能会生病、离职(崩溃、重启)。在 K8s 里,Pod 是 “不持久” 的,一旦工位撤了,里面的东西就没了。
2. 工作负载资源:各种 “部门经理”
如果让你亲手去管理成千上万个 “打工人(Pod)”,你肯定会累死。所以 K8s 提供了几种 “经理”(负载资源)来帮你管理:
① Deployment(无状态应用经理)—— “流水线工人管理部”
这是最常用的经理。
- 通俗解释:你需要 10 个搬运工,你只要告诉 Deployment:“给我维持 10 个搬运工”。如果其中一个晕倒了,Deployment 会立刻招个新的补上。
- 关键点:所有的搬运工都是一模一样的,谁替代谁都行(这就是 “无状态”)。
② StatefulSet(有状态应用经理)—— “专家组管理部”
- 通俗解释:这组员工每个人的任务都不同。比如 1 号是财务,2 号是技术,3 号是前台。
- 关键点:如果 1 号财务离职了,新招的人必须继承 1 号的账本和工位,不能乱套(这就是 “有状态”,适合数据库等应用)。
③ DaemonSet(守护进程经理)—— “保洁 / 安保部”
- 通俗解释:这类工作比较特殊,要求每一层楼(每一个节点)都必须配一个。
- 关键点:只要工厂扩建了一层楼,DaemonSet 就会自动在那层楼派驻一名保洁。
④ Job / CronJob(临时工经理)—— “项目承包商”
- Job:干完就走。比如 “把这堆废纸粉碎了”,干完这活,这个 Pod 就结束使命了。
- CronJob:定时来干。比如 “每周五下午大扫除”。
总结一下 line 13 的核心逻辑:
- 你是老板:你不需要直接找 “打工人”(Pod),你只需要下达 “用工需求”(定义工作负载资源)。
- K8s 是全能管家:它负责盯着这些 “经理”。
- 结果:无论工厂发生什么意外(比如某台服务器坏了),K8s 都会按照你的 “工单” 要求,自动重新安排打工人,保证你的业务(工厂)永远在正常运转。
用一句话说:工作负载就是你告诉 K8s “我想让什么样的程序、运行几个、怎么运行” 的说明书。
“工作负载”(Workload)本身确实是一个逻辑上的概念,而不是一个单一的、具体的 “东西”。
为了让你理解得更透彻,可以从以下两个维度来看:
1. 概念层面:它是 “应用的运行状态”
在 Kubernetes 的语境下,工作负载是指 “你正在集群上运行的应用程序”。
- 它描述的是一种意图:你想让什么程序运行、跑几个副本、遇到故障怎么处理。
- 就像文中的比喻,它更像是一份 “工单” 或 “说明书”。
2. 实体层面:它由 “资源对象” 来承载
虽然 “工作负载” 是概念,但它是通过具体的 API 实体(实体对象) 来实现的。在 K8s 中,这些实体被称为工作负载资源(Workload Resources)。
当你实际操作时,你会接触到这些看得见、摸得着的实体:
- Pod:这是最基础的实体(真正的 “打工人” 容器)。
- Deployment:这是一个高级实体(经理),它负责管理 Pod。
- StatefulSet、Job、DaemonSet:这些也都是不同类型的实体,用来满足不同的运行需求。
总结
- 工作负载(Workload) = “我想让应用怎么运行” 的概念 / 分类。
- 工作负载资源(Resources) = 你在终端里通过
kubectl get deployment查看到的具体实体。
所以,当你提到 “我的工作负载出问题了” 时,本质上是指你通过 Deployment 或 StatefulSet 定义的那个应用运行状态不符合预期了。
我们抛开那些虚无缥缈的比喻,从 “它在计算机里到底对应什么” 这个极其具体的角度再看一次:
1. 在你的代码编辑器里:它是一个 YAML 文件
当你准备在 K8s 上运行一个程序时,你第一步是写一个文件(比如 app.yaml)。
- 这个文件就是工作负载的 “定义”。
- 里面写着:
kind: Deployment(类型),replicas: 3(跑几个),image: nginx(用什么镜像)。
2. 在 K8s 的数据库(etcd)里:它是一条数据记录
当你执行 kubectl apply -f app.yaml 后:
- K8s 的数据库里就多了一条 JSON 格式的数据。
- 这条 “数据记录” 就是工作负载在 K8s 内部的实体。
- 它就像你在数据库里插入的一行
INSERT INTO workloads ...。只要这行数据在,K8s 的后台程序就会永远盯着它。
3. 在服务器的进程里:它表现为一组容器
K8s 看到数据库里有了这条记录,就会去对应的服务器(Node)上指挥 Docker 或 Containerd:“喂,帮我启动 3 个进程!”
- 这些正在运行的进程(容器)就是工作负载的 “表现形式”。
用一个最土的例子对比:
传统方式: 你登录服务器,敲命令
nohup ./my-app &。- 它是啥? 它就是一个孤立的进程。你关了终端,它可能还在跑;它要是崩了,就没人管了。
K8s 方式: 你提交一个
Deployment(工作负载资源)。- 它是啥? 它是一个 “自动化的运行方案”。
- 如果你把跑出来的进程(Pod)杀了,K8s 看到数据库里的 “运行方案” 说要 3 个,它会立刻再启动一个新的。
最终结论
如果非要给它下一个定义:
工作负载 = “你提交给 K8s 的那份运行方案” + “K8s 根据方案帮你维持的一组进程”。
它不是一个单一的二进制文件,也不是一个硬件,它是 “一份持久化的心愿单” 加上 “为了实现这个心愿而跑起来的一堆容器”。
如果你能看到 K8s 的后台,你会发现它其实就是:
- 存了一行配置信息。
- 跑了一个死循环(不断检查:配置说要 3 个,现在有几个?少了就补,多了就删)。
你现在能感受到它在 “数据” 和 “进程” 之间的关系了吗?
内置工作负载资源类型
| 资源类型 | 适用场景 | 核心特点 |
|---|---|---|
| Deployment 与 ReplicaSet(替代 ReplicationController) | 管理无状态应用 | 所有 Pod 等价,可按需替换 |
| StatefulSet | 运行需跟踪状态的应用(如数据持久存储场景) | 每个 Pod 可与 PersistentVolume 对应,Pod 内代码可实现数据复制以提升可靠性 |
| DaemonSet | 定义节点本地支撑设施 Pod(如网络辅助工具、网络插件) | 新节点符合规约时,控制平面自动调度 Pod 到该节点运行 |
| Job | 执行一次性任务 | 任务运行结束后停止,完成即视为任务结束 |
| CronJob | 按排期表多次运行任务 | 基于时间规则重复执行同一 Job |
第三方工作负载扩展
借助定制资源定义(CRD),可添加第三方工作负载资源,实现 Kubernetes 核心功能未覆盖的需求,例如运行需所有 Pod 可用才执行操作的高吞吐量分布式任务。