Django Kubernetes作业的动态命令

Django Kubernetes作业的动态命令,django,kubernetes,kubernetes-jobs,Django,Kubernetes,Kubernetes Jobs,所以希望这对k8s社区的非Djangores人来说是有意义的。我将尽力解释设置/推理 使用Django,我们可以在Django应用程序的范围和环境中运行许多所谓的管理命令,这些命令可以真正帮助开发和部署。我相信大多数其他框架都有类似的(如果不是完全相同的话)概念 一个例子是“python manage.py migrate”命令,该命令确保我们的代码库(迁移脚本)应用于相关数据库并反映在相关数据库中 我们可以运行大约30-50个核心命令,我们也可以创建自己的命令,以及从任何已安装的第三方应用程序

所以希望这对k8s社区的非Djangores人来说是有意义的。我将尽力解释设置/推理

使用Django,我们可以在Django应用程序的范围和环境中运行许多所谓的管理命令,这些命令可以真正帮助开发和部署。我相信大多数其他框架都有类似的(如果不是完全相同的话)概念

一个例子是“
python manage.py migrate
”命令,该命令确保我们的代码库(迁移脚本)应用于相关数据库并反映在相关数据库中

我们可以运行大约30-50个核心命令,我们也可以创建自己的命令,以及从任何已安装的第三方应用程序中应用这些命令

无论如何。最重要的一点是,我们可以运行很多命令

现在,我有以下k8s作业来运行“migrate”命令:

此作业实际上是在应用程序范围/环境中运行
python manage.py migrate
命令。它就像一个符咒:

$kubectl apply-f asencis-web-migrate-job.yaml
它在应用程序的部署中非常有用。当我们所有的测试都运行后,我们可以构建一个映像,“重新启动”集群,然后应用任何迁移。这是难以置信的无缝。(对于k8s核心团队制造出如此有用的产品,我可不敬!)

无论如何

我的问题本质上是这样的,我们可以对上面的
kubectl apply
命令在作业上应用一个参数来运行我们喜欢的任何命令吗

例如:

$kubectl apply-f asencis-web-job.yaml——命令python manage.py migrate

您可能需要为此构建自己的工具

您可以使用shell脚本,例如:

#/垃圾箱/垃圾箱
yq评估\
“.spec.template.spec.containers[0]。命令。[2]=\”$1\”\
template-web-job.yaml\
|kubectl应用-f-
您可以通过以下方式填写作业的更多部分:计算
.metadata.name
from
$USER-$1-$(日期+%s)
,将
标签:
附加到Pod以便稍后查找,依此类推

如果这不是一次性的工作,我可能会推荐一个更适合Kubernetes的本地工具,如Helm或Kustomize。这两个工具都需要一些涉及的文件系统布局,然后需要传递变量(脚本命令、提交者)在某种形式上,这实际上并不比使用
yq
重写YAML容易。Helm更倾向于大多数稳定的安装(它知道主应用程序部署以及如何就地更新)

如果您已经有了Helm,您可以围绕
Helm模板
构建一个类似的脚本。或者如果您有
jq
但没有
yq
,您可以用JSON
{“apiVersion”:“batch/v1”,“kind”:“Job”,…}
重写作业,但在其他方面使用相同的脚本

apiVersion: batch/v1
kind: Job
metadata:
  name: asencis-web-migrate-job
spec:
  template:
    spec:
      containers:
        - name: asencis-web-migrate-job
          image: asencis/asencis-base:latest
          imagePullPolicy: Always
          command: ['python', 'manage.py', 'migrate']
          envFrom:
          - configMapRef:
              name: asencis-config
          - secretRef:
              name: asencis-secret
      restartPolicy: Never
  backoffLimit: 5