Day 06 - DaemonSet、StatefulSet、Job、CronJob
📘 Day 06:DaemonSet、StatefulSet、Job、CronJob
🎯 今日目标
- 部署 DaemonSet 实现每节点一个采集 Pod
- 部署 StatefulSet 实现有状态应用
- 理解 StatefulSet Pod 的稳定网络标识
- 创建 Job 并行计算任务
- 创建 CronJob 定时任务
🧠 理论精讲(30 分钟)
四种工作负载对比
| 工作负载 | 副本特征 | Pod 标识 | 启动/停止顺序 | 典型场景 |
|---|---|---|---|---|
| Deployment | 可多可少,Pod 无差别 | 随机名(xxx-abcde-xyz) | 无顺序,并行 | 无状态 Web |
| DaemonSet | 每节点一个 | 节点名相关 | 无顺序 | 日志采集、监控 Agent |
| StatefulSet | 固定数量,每个唯一 | 有序序号(xxx-0, xxx-1) | 顺序启动,逆序停止 | 数据库、消息队列 |
| Job | 一次性,完成即止 | 随机名 | 无顺序 | 数据迁移、计算任务 |
| CronJob | 按定时规则创建 | 随机名 | 无顺序 | 定时备份、定时清理 |
StatefulSet 核心特性
1 | 1. 稳定的网络标识:<sts-name>-<序号>.<headless-svc>.<ns>.svc.cluster.local |
Job 关键参数
| 参数 | 含义 | 默认值 |
|---|---|---|
completions |
需要成功完成多少次 | 1 |
parallelism |
最大并行执行数 | 1 |
backoffLimit |
失败重试次数 | 6 |
activeDeadlineSeconds |
任务超时时间 | — |
🔧 动手实操(120 分钟)
练习 6.1:DaemonSet 日志采集器
1 | # 1. 创建一些测试 Pod 分散在不同节点 |
练习 6.2:StatefulSet 部署
1 | # 1. 先创建 Headless Service(必须!) |
练习 6.3:Job 并行计算
1 | # 1. 基础 Job |
练习 6.4:CronJob 定时任务
1 | # 1. 创建每分钟执行的 CronJob |
🐛 排错练习(30 分钟)
场景 1:StatefulSet Pod 一直 Pending
1 | # 原因 1:PVC 无法绑定 |
场景 2:CronJob 不触发
1 | # 排查步骤 |
🏆 赛题模拟(40 分钟)
⚠️ 严格限时 40 分钟
题目:工作负载综合部署
1 | 【操作要求】 |
📋 命令速查
| 命令 | 功能 | 注解 |
|---|---|---|
kubectl get ds |
列出 DaemonSet | 每个节点运行一个 Pod 副本 |
kubectl get ds -o wide |
DaemonSet + 选择器/镜像 | 确认每个节点是否都有 Pod |
kubectl describe ds <name> |
DaemonSet 详情 | 查看更新策略(RollingUpdate/OnDelete) |
kubectl get sts |
列出 StatefulSet | StatefulSet 常用 short name: sts |
kubectl describe sts <name> |
StatefulSet 详情 | 查看 podManagementPolicy、serviceName、volumeClaimTemplates |
kubectl get pods -l app=mysql |
按标签筛选 Pod | StatefulSet Pod 命名:<name>-0, <name>-1, ... |
kubectl scale sts <name> --replicas=5 |
扩缩 StatefulSet | 按序号递增/递减创建/删除 Pod |
kubectl get pvc |
列出 PVC | StatefulSet + volumeClaimTemplates 自动为每个 Pod 创建 PVC |
kubectl get job |
列出 Job | 一次性任务,完成后 Pod 状态为 Completed |
kubectl describe job <name> |
Job 详情 | 查看 completions、parallelism、backoffLimit |
kubectl logs job/<name> |
查看 Job 日志 | Job Pod 执行完不会自动删除,可事后查看日志 |
kubectl get cronjob |
列出 CronJob | short name: cj |
kubectl describe cronjob <name> |
CronJob 详情 | 查看 schedule、lastScheduleTime、suspend 状态 |
kubectl get jobs --watch |
实时监控 Job 创建 | 观察 CronJob 触发时自动创建的 Job |
kubectl create job test-job --image=busybox --dry-run=client -o yaml |
生成 Job YAML | 快速获取 Job 模板 |
kubectl create cronjob test-cj --image=busybox --schedule="*/5 * * * *" --dry-run=client -o yaml |
生成 CronJob YAML | 5 字段 cron 表达式(分/时/日/月/周) |
kubectl delete job <name> |
删除 Job | 级联删除其完成的 Pod |
kubectl delete cronjob <name> |
删除 CronJob | 不会删除正在运行的 Job 和 Pod |
kubectl patch cronjob <name> -p '{"spec":{"suspend":true}}' |
暂停 CronJob | 停止后续调度,保留历史 |
📚 参考来源
| 来源 | 链接 / 说明 |
|---|---|
| Kubernetes 官方:DaemonSet | https://kubernetes.io/docs/concepts/workloads/controllers/daemonset/ |
| Kubernetes 官方:StatefulSet | https://kubernetes.io/docs/concepts/workloads/controllers/statefulset/ |
| Kubernetes 官方:Job | https://kubernetes.io/docs/concepts/workloads/controllers/job/ |
| Kubernetes 官方:CronJob | https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/ |
| Kubernetes 官方:工作负载资源 | https://kubernetes.io/docs/concepts/workloads/controllers/ |
| Cron 表达式语法 | https://kubernetes.io/docs/concepts/workloads/controllers/cron-jobs/#cron-schedule-syntax |