06 - Job、CronJob 与 DaemonSet
Job:一次性任务
Deployment 管理的是长期运行的服务。Job 管理的是运行完就退出的任务。
yaml
apiVersion: batch/v1
kind: Job
metadata:
name: data-migration
spec:
completions: 1 # 需要成功完成的 Pod 数
parallelism: 1 # 并行运行的 Pod 数
backoffLimit: 3 # 失败重试次数
activeDeadlineSeconds: 600 # 最长运行时间(秒)
template:
spec:
restartPolicy: Never # Job 必须是 Never 或 OnFailure
containers:
- name: migrate
image: myapp:latest
command: ["python", "migrate.py"]并行 Job
yaml
# 并行处理 10 个任务
spec:
completions: 10 # 总共需要完成 10 个
parallelism: 3 # 同时运行 3 个常用操作
bash
kubectl get jobs
kubectl describe job data-migration
kubectl logs job/data-migration
# 删除 Job(会删除关联的 Pod)
kubectl delete job data-migrationCronJob:定时任务
CronJob 按照 Cron 表达式定时创建 Job。
yaml
apiVersion: batch/v1
kind: CronJob
metadata:
name: db-backup
spec:
schedule: "0 2 * * *" # 每天凌晨 2 点
concurrencyPolicy: Forbid # 不允许并发执行
successfulJobsHistoryLimit: 3 # 保留最近 3 个成功 Job
failedJobsHistoryLimit: 1 # 保留最近 1 个失败 Job
startingDeadlineSeconds: 200 # 超过截止时间则跳过
jobTemplate:
spec:
template:
spec:
restartPolicy: OnFailure
containers:
- name: backup
image: postgres:16-alpine
command:
- /bin/sh
- -c
- pg_dump -h $DB_HOST -U $DB_USER mydb > /backup/db-$(date +%Y%m%d).sql
envFrom:
- secretRef:
name: db-credentials
volumeMounts:
- name: backup
mountPath: /backup
volumes:
- name: backup
persistentVolumeClaim:
claimName: backup-pvcCron 表达式
┌───────────── 分钟 (0 - 59)
│ ┌───────────── 小时 (0 - 23)
│ │ ┌───────────── 日 (1 - 31)
│ │ │ ┌───────────── 月 (1 - 12)
│ │ │ │ ┌───────────── 星期 (0 - 6, 0=周日)
│ │ │ │ │
* * * * *
# 示例
"*/5 * * * *" # 每 5 分钟
"0 * * * *" # 每小时
"0 2 * * *" # 每天凌晨 2 点
"0 0 * * 0" # 每周日午夜
"0 0 1 * *" # 每月 1 号concurrencyPolicy
| 策略 | 说明 |
|---|---|
Allow | 允许并发(默认) |
Forbid | 如果上一个还在运行,跳过本次 |
Replace | 替换正在运行的 Job |
DaemonSet:每个节点运行一个 Pod
DaemonSet 确保每个(或指定的)节点上运行一个 Pod 副本。
Node 1 Node 2 Node 3
┌─────────┐ ┌─────────┐ ┌─────────┐
│ DaemonSet│ │ DaemonSet│ │ DaemonSet│
│ Pod │ │ Pod │ │ Pod │
└─────────┘ └─────────┘ └─────────┘典型场景
| 场景 | 说明 |
|---|---|
| 日志收集 | Fluentd/Fluent Bit 在每个节点收集日志 |
| 节点监控 | Node Exporter 在每个节点采集指标 |
| 网络插件 | kube-proxy、Calico 等 CNI 组件 |
| 存储插件 | CSI 节点组件 |
示例:节点日志收集
yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: log-collector
namespace: logging
spec:
selector:
matchLabels:
app: log-collector
template:
metadata:
labels:
app: log-collector
spec:
tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
containers:
- name: fluent-bit
image: fluent/fluent-bit:latest
volumeMounts:
- name: varlog
mountPath: /var/log
readOnly: true
- name: containers
mountPath: /var/lib/docker/containers
readOnly: true
resources:
requests:
memory: "64Mi"
cpu: "50m"
limits:
memory: "128Mi"
cpu: "100m"
volumes:
- name: varlog
hostPath:
path: /var/log
- name: containers
hostPath:
path: /var/lib/docker/containersDaemonSet vs Deployment
| 特性 | Deployment | DaemonSet |
|---|---|---|
| Pod 分布 | 由调度器决定 | 每个节点一个 |
| 副本数 | 手动指定 | 等于节点数 |
| 扩缩容 | 手动/HPA | 自动随节点增减 |
| 用途 | 应用服务 | 节点级别基础设施 |
小结
| 资源 | 用途 | 生命周期 |
|---|---|---|
| Deployment | 无状态长期服务 | 持续运行 |
| StatefulSet | 有状态长期服务 | 持续运行 |
| Job | 一次性任务 | 运行完退出 |
| CronJob | 定时任务 | 定期执行 |
| DaemonSet | 节点级服务 | 每个节点一个 |
