我正在寻找一种从命令行快速运行/重新启动 Job/Pod 并覆盖要在创建的容器中执行的命令的方法。
对于上下文,我有一个 Kubernetes 作业,它作为我们部署过程的一部分被执行。有时该作业会崩溃,我需要在作业创建的容器内运行某些命令来调试和修复问题(随后的作业会成功)。
到目前为止,我这样做的方式是:
- 复制 Job 的 YAML,保存到文件中
- 清理 YAML(删除 Kubernetes 管理的字段)
command:
将字段更改为tail -f /dev/null
(以便容器保持活动状态)kubectl apply -f job.yaml && kubectl get all && kubectl exec -ti pod/foobar bash
- 在容器内运行命令
kubectl delete job/foobar
当我完成时
这是非常乏味的。我正在寻找一种方法来执行以下操作
kubectl restart job/foobar --command "tail -f /dev/null"
# or even better
kubectl run job/foobar --exec --interactive bash
我无法使用该run
命令创建 Pod:
kubectl run --image xxx -ti
因为我尝试重新启动的作业具有volumeMounts
我需要重用的某些和其他配置。所以我需要类似的东西kubectl run --from-config job/foobar
。
有没有办法实现这一点,还是我坚持使用 YAML 定义文件?
编辑:Job YAML 看起来大约。像这样:
apiVersion: batch/v1
kind: Job
metadata:
name: database-migrations
labels:
app: myapp
service: myapp-database-migrations
spec:
backoffLimit: 0
template:
metadata:
labels:
app: myapp
service: myapp-database-migrations
spec:
restartPolicy: Never
containers:
- name: migrations
image: registry.example.com/myapp:977b44c9
command:
- "bash"
- "-c"
- |
set -e -E
echo "Running database migrations..."
do-migration-stuff-here
echo "Migrations finished at $(date)"
imagePullPolicy: Always
volumeMounts:
- mountPath: /home/example/myapp/app/config/conf.yml
name: myapp-config-volume
subPath: conf.yml
- mountPath: /home/example/myapp/.env
name: myapp-config-volume
subPath: .env
volumes:
- name: myapp-config-volume
configMap:
name: myapp
imagePullSecrets:
- name: k8s-pull-project