Skip to main content

Workload 工作负载

工作负载(Workload)描述跑什么、跑几份、怎么更新。日常接触最多的是 PodDeployment;StatefulSet / DaemonSet / Job 先会「认脸」即可。

Pod:最小调度单位

Pod 是一组共享网络与存储卷的容器(多数情况 一 Pod 一业务容器)。K8s 调度的是 Pod,不是单独一个「裸容器」。

说明
IPPod 有集群内 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

读清单时盯住:replicasimage 标签、selectortemplate.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

要点

  1. 调度单位是 Pod;长期无状态应用用 Deployment
  2. selector 与 Pod 模板 labels 必须对得上
  3. 发布看 rollout status;出事先 rollout undo,再查探针与镜像
  4. StatefulSet / DaemonSet / Job 先能从 kind 判断用途

面试速记

  1. 为什么最小单位是 Pod 不是容器? 需要同生死、同网络命名空间的一组容器(含 sidecar)一起调度。
  2. Deployment 和 ReplicaSet? Deployment 管发布与声明式更新;ReplicaSet 负责维持副本数;一般直接用 Deployment。
  3. Deployment vs StatefulSet? 无状态副本可互换用 Deployment;需要稳定网络标识/持久盘序号用 StatefulSet。
  4. readiness 和 liveness 区别? readiness 控制是否接流量;liveness 控制是否重启。
  5. 滚动更新失败常见原因? 镜像/配置错误、探针过严、资源不足导致起不来。