0

所以希望这对 k8s 社区的非 Djangoers 有意义。我会尽力解释设置/推理。

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

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

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

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

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

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

该作业本质上是python manage.py migrate在应用程序范围/环境中运行命令。它就像一个魅力:

$ kubectl apply -f asencis-web-migrate-job.yaml

当我们所有的测试都运行时,它在应用程序的部署中非常有用,然后我们可以构建一个镜像,“推出重启”集群,然后应用任何迁移。这是令人难以置信的无缝。(我不向 k8s 核心团队致敬,因为他们制作了如此有用的产品!)

无论如何。

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

一个例子是:

$ kubectl apply -f asencis-web-job.yaml --command python manage.py migrate
4

1 回答 1

1

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

您可以在yq周围使用 shell 脚本,例如:

#!/bin/sh
yq eval \
    ".spec.template.spec.containers.[0].command.[2]=\"$1\"' \
    template-web-job.yaml \
| kubectl apply -f-

您可以通过这种方式填写 Job 的更多部分:计算.metadata.namefrom $USER-$1-$(date +%s),附加labels:到 Pod 以便稍后找到它,等等。

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

如果你已经有 Helm,你可以围绕helm template. 或者,如果您有jq但没有yq,您可以用 JSON 重写作业,{"apiVersion": "batch/v1", "kind": "Job", ...}但使用相同的脚本。

于 2021-03-19T12:13:09.933 回答