【发布时间】:2021-12-18 14:00:30
【问题描述】:
我正在寻找一种从命令行快速运行/重新启动 Job/Pod 并覆盖要在创建的容器中执行的命令的方法。
就上下文而言,我有一个 Kubernetes 作业,它作为我们部署过程的一部分被执行。有时 Job 崩溃,我需要在 Job 创建的容器内运行某些命令 来调试和修复问题(随后的 Jobs 会成功)。
到目前为止,我这样做的方式是:
- 复制作业的 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
【问题讨论】:
-
您能否提供一个示例 YAML 并说明您究竟想在其中更改什么(清理 YAML(删除 Kubernetes 管理的字段))?什么是 Kubernetes 管理的字段?您是否考虑过为此使用 bash 脚本?
-
您好,感谢您的评论。我添加了我想要(重新)创建的作业的 YAML。 Kubernetes 管理的字段是例如
metadata.managedFields、metadata.generateName、status等等。基本上,我在上面发布的 YAML 与您使用kubectl get <resource> -o yaml得到的结果之间的差异。我可以通过 bash 脚本来做到这一点,但是我需要将该脚本分发给其他开发人员,所以我想看看是否有更快的“本地”方式来做到这一点。 -
这对我来说不是很清楚:您正在尝试执行作业创建的已完成 pod,以便调试问题并手动运行脚本? pod 完成后,您将无法执行到此 pod。
标签: kubernetes kubectl kubernetes-jobs