首页 注册 登录
V2EX = way to explore V2EX 是一个关于分享和探索的地方
现在注册 已注册用户请 登录
V2EX Kubernetes

django 应用里面的脚本怎么在 k8s 平台启动更合适?

linxuan716 · 2025 年 8 月 2 日 · 2563 次点击
这是一个创建于 161 天前的主题,其中的信息可能已经有所发展或是发生改变。

这些脚本依赖于 django 环境,大概有 3 类 1 、偶尔需要执行一次的脚本 2 、定时执行的脚本 3 、监听 redis 指定键的脚本 这三类脚本加在一块大概有 100 多个,如果每个脚本都打成一个镜像,觉得太重,只是镜像文件就要占用很多的存储空间,有没有更加合适的方式?大家给提供下

9 条回复 2025年08月02日 20:45:26 +08:00
coderth
1
coderth 2025 年 8 月 2 日
全部打到一个镜像里面去不就行了,不同 pod 用不同的启动命令运行不同的脚本
FarmerChillax
2
FarmerChillax 2025 年 8 月 2 日
看下来,按我的理解第三个应该是要常驻运行的。那么可以将第一、第二个的脚本封装成一个 API 接口,按需执行。
linxuan716
3
linxuan716
OP
2025 年 8 月 2 日
@FarmerChillax 你意思是封装成一个 API 接口,再建一个常驻运行的脚本定时调用吗?
encro
4
encro 2025 年 8 月 2 日
问 ai 都会给出 4 中答案啊,明显都可以
akaHenry
5
akaHenry 2025 年 8 月 2 日
100 多个脚本, 梳理一下, 做一些技术改造.

1. 偶尔执行的. 改成 django admin 后台配置页面触发. 任务流, 改成 消息队列(生产者-消费者模型).

基于 队列(kafka, rabbitmq, nats 都可以) 解耦: 动作触发(生产者) 和 动作执行(消费者).

推荐 nats, 运维简单.

工作流改造成:

a. admin 侧, 触发动作, send task(参数包) 到消息队列, admin 结束.

b. 消息队列的 监听者 worker, 收到 task, 解析参数, 执行具体任务, 结束.

2. 定时任务, 可以试试 huey 和 django-huey, 支持 redis 监听不同的 queue 来分别监听 + 执行.

比 celery 简单. 注意如果启用了 django 时区, huey 配置也要启用时区, 否则是 UTC 时间.(小坑) 其他使用挺完美.

https://github.com/coleifer/huey

https://github.com/gaiacoop/django-huey

经过上述改造. 如果不考虑高可用, 单副本下, 你大概只需要部署 2-3 个容器实例, 就够了.

需要注意, 如果是 k8s 多副本实例, 需要 MQ 消息 幂等唯一消费, 可以引入一个分布式锁判定, 可以简单用 redis 锁.

上面的方案, 算是比较标准的做法.

不要滥用 django scripts 的一些方便用法. (后期维护一堆烂脚本, 显然是不明智的)
FarmerChillax
6
FarmerChillax 2025 年 8 月 2 日
@linxuan716 脚本定时调用就没必要常驻了吧😂
momocraft
7
momocraft 2025 年 8 月 2 日
打包一个镜像 分别用于 job cronjob daemonset (或者别的)
seers
8
seers 2025 年 8 月 2 日 via Android
其实单独打包镜像不会很多,镜像的 layer 很多都是共用的
bingfengfeifei
9
bingfengfeifei 2025 年 8 月 2 日
1. 打成两个镜像,一个是基础运行环境镜像,另一个是代码包镜像,busybox 装就行,最小化。
2. 使用 InitContainer 组合代码和运行环境变成一个 POD 。这样可以升级的时候,只升级代码包
3. 执行不同脚本,你可以用不同的 POD
关于 · 帮助文档 · 自助推广系统 · 博客 · API · FAQ · Solana · 2811 人在线 最高记录 6679 · Select Language 创意工作者们的社区 World is powered by solitude VERSION: 3.9.8.5 · 28ms · UTC 14:23 · PVG 22:23 · LAX 06:23 · JFK 09:23
♥ Do have faith in what you're doing.

AltStyle によって変換されたページ (->オリジナル) /