Skip to content

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-migration

CronJob:定时任务

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-pvc

Cron 表达式

┌───────────── 分钟 (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/containers

DaemonSet vs Deployment

特性DeploymentDaemonSet
Pod 分布由调度器决定每个节点一个
副本数手动指定等于节点数
扩缩容手动/HPA自动随节点增减
用途应用服务节点级别基础设施

小结

资源用途生命周期
Deployment无状态长期服务持续运行
StatefulSet有状态长期服务持续运行
Job一次性任务运行完退出
CronJob定时任务定期执行
DaemonSet节点级服务每个节点一个

下一步

Phase 05 - K8s 网络模型