You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Kubernetes Job在EKS集群所有Pod自动执行Django迁移

使用Kubernetes Job实现Django自动迁移(EKS集群)

一、Job方式实现的实操步骤

1. 编写Job资源配置

创建一个django-migrate-job.yaml,核心是复用应用的镜像和环境配置,仅替换执行命令为迁移指令:

apiVersion: batch/v1
kind: Job
metadata:
  name: django-migrate-{{ git-short-hash }}  # CI/CD中动态替换为提交哈希,保证每次部署生成新Job
  labels:
    app: your-django-app
spec:
  template:
    spec:
      containers:
      - name: migrate
        image: your-django-image:{{ git-short-hash }}  # 和应用部署用同一个镜像标签
        command: ["python", "manage.py", "migrate"]
        env:
        # 复用应用容器的数据库配置、环境变量
        - name: DATABASE_URL
          valueFrom:
            secretKeyRef:
              name: django-db-secrets
              key: url
        - name: DJANGO_SETTINGS_MODULE
          value: "your_project.settings.production"
      restartPolicy: OnFailure  # 迁移失败自动重试
  backoffLimit: 3  # 最多重试3次
  activeDeadlineSeconds: 300  # 超时时间,避免卡住

2. 绑定CI/CD部署流程

要实现部署新代码时自动跑迁移,必须把Job的创建和应用部署联动:

  • 在CI/CD流水线中,先执行迁移Job,再更新应用Deployment:
    1. 构建新镜像,用Git提交短哈希作为标签(比如v1.0-abc123)
    2. 动态生成Job配置(替换上述YAML中的{{ git-short-hash }}占位符)
    3. 执行kubectl apply -f django-migrate-job.yaml创建新Job
    4. 等待Job执行完成:kubectl wait --for=condition=complete job/django-migrate-abc123 --timeout=5m
    5. 确认迁移成功后,再部署应用的Deployment(同样使用新镜像标签)
  • 注意:不能重复使用同一个Job名称,否则K8s不会重新执行迁移,必须每次生成唯一的Job名(用提交哈希、时间戳都可以)

3. 避免并发迁移的坑

Django迁移不支持并发执行,要确保同一时间只有一个迁移Job在跑:

  • 最稳妥的方式是在CI/CD流程里严格控制:只有上一个迁移Job完成,才继续后续部署
  • 也可以在迁移命令前加分布式锁,比如基于数据库的锁表逻辑,强制保证单进程执行迁移

二、关于镜像的问题

每次部署新代码必须指定新的镜像标签,原因如下:

  • 迁移依赖代码中的模型定义和迁移文件,新代码的迁移逻辑和旧镜像里的完全不同,用旧镜像执行迁移会导致逻辑缺失或出错
  • 绝对不要用latest标签,K8s节点可能缓存旧镜像,导致拉取到的不是最新代码版本
  • 推荐用唯一标识作为标签,比如Git提交短哈希、语义化版本号,确保Job和应用Deployment用的是完全相同的镜像版本

内容的提问来源于stack exchange,提问作者unknown

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:40:40