Workload 工作负载
工作负载(Workload)描述跑什么、跑几份、怎么更新。日常接触最多的是 Pod 与 Deployment;StatefulSet / DaemonSet / Job 先会「认脸」即可。
Pod:最小调度单位
Pod 是一组共享网络与存储卷的容器(多数情况 一 Pod 一业务容器)。K8s 调度的是 Pod,不是单独一个「裸容器」。
| 点 | 说明 |
|---|---|
| IP | Pod 有集群内 IP;重建后 IP 常变 → 所以要靠 Service |
| 生命周期 | 短命;不要假设某个 Pod 永远在 |
| 旁路容器 | sidecar(如代理、日志)可与主容器同 Pod |
裸 Pod 很少直接长期使用:挂了不会自动按「应用副本」策略重建(除非上面还有控制器)。
最小示意:
apiVersion: v1
kind: Pod
metadata:
name: web
labels:
app: web
spec:
containers:
- name: web
image: nginx:1.27
ports:
- containerPort: 80
Deployment + ReplicaSet
Deployment 管理无状态应用的期望副本与发布策略;它下面通过 ReplicaSet 实际维持 Pod 数量。
apiVersion: apps/v1
kind: Deployment
metadata:
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web
template: # Pod 模板
metadata:
labels:
app: web # 必须被 selector 选中
spec:
containers:
- name: web
image: my-api:1.2.0
ports:
- containerPort: 8080
读清单时盯住:replicas、image 标签、selector 与 template.labels 是否匹配。
kubectl get deploy,rs,pods -l app=web
kubectl rollout status deploy/web
kubectl set image deploy/web web=my-api:1.3.0 # 临时改镜像;正经应改 YAML 再 apply
kubectl rollout undo deploy/web
滚动更新直觉
默认 Deployment 会逐步用新 ReplicaSet 替换旧 Pod(可配 maxUnavailable / maxSurge)。失败常见原因:新镜像拉不下来、探针一直失败、配置错误导致 CrashLoop。
回滚:kubectl rollout undo deploy/<name>(历史来自 ReplicaSet 修订)。
探针(认名字)
| 探针 | 作用 |
|---|---|
| livenessProbe | 死了就重启容器 |
| readinessProbe | 未就绪则不进 Service 后端 |
| startupProbe | 慢启动应用先撑过启动期 |
YAML 里看到 httpGet / tcpSocket / exec 即探针配置。乱配 liveness 会导致反复自杀。
其他 Workload(认脸)
| Kind | 一句话 | 典型场景 |
|---|---|---|
| StatefulSet | 有稳定身份/存储序号 | 数据库、有状态中间件 |
| DaemonSet | 每节点(或选定节点)一个 Pod | 日志 Agent、节点插件 |
| Job | 跑完就结束 | 批处理、一次性迁移 |
| CronJob | 定时创建 Job | 定时任务 |
前端业务 API / 静态站点网关,绝大多数是 Deployment。
要点
- 调度单位是 Pod;长期无状态应用用 Deployment
selector与 Pod 模板 labels 必须对得上- 发布看
rollout status;出事先rollout undo,再查探针与镜像 - StatefulSet / DaemonSet / Job 先能从
kind判断用途
面试速记
- 为什么最小单位是 Pod 不是容器? 需要同生死、同网络命名空间的一组容器(含 sidecar)一起调度。
- Deployment 和 ReplicaSet? Deployment 管发布与声明式更新;ReplicaSet 负责维持副本数;一般直接用 Deployment。
- Deployment vs StatefulSet? 无状态副本可互换用 Deployment;需要稳定网络标识/持久盘序号用 StatefulSet。
- readiness 和 liveness 区别? readiness 控制是否接流量;liveness 控制是否重启。
- 滚动更新失败常见原因? 镜像/配置错误、探针过严、资源不足导致起不来。