[英]Dynamic Command for Kubernetes Jobs
所以希望這對 k8s 社區的非 Djangoers 有意義。 我會盡力解釋設置/推理。
使用 Django,我們有很多所謂的管理命令,我們可以在 scope 和我們的 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
您可能需要為此構建自己的工具。
您可以在yq周圍使用 shell 腳本,例如:
#!/bin/sh
yq eval \
".spec.template.spec.containers.[0].command.[2]=\"$1\"' \
template-web-job.yaml \
| kubectl apply -f-
您可以通過這種方式填寫 Job 的更多部分:從$USER-$1-$(date +%s)
計算.metadata.name
,將labels:
附加到 Pod 以便稍后找到它,等等。
如果這不是一次性的工作,我可能會推薦一個更原生的 Kubernetes 工具,比如 Helm 或 Kustomize。 這兩個工具都需要一些涉及的文件系統布局,然后您需要以某種形式傳遞變量(腳本命令、提交者); 這實際上並不比使用yq
重寫 YAML 更容易。 Helm 更傾向於大多數穩定的安裝(它知道主應用程序部署以及如何就地更新它)。
如果你已經有 Helm,你可以圍繞helm template
構建一個類似的腳本。 或者,如果您有jq
但沒有yq
,您可以在 JSON {"apiVersion": "batch/v1", "kind": "Job", ...}
中重寫作業,但除此之外使用相同的腳本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.