我们在gcloud上使用的是>1.8版本的k8s。不幸的是,EventStore停止推送数据,直到重新启动。因此,我们希望每6小时运行一次kubectl --namespace=$NAMESPACE delete pod eventstore-0
。因此,我们有一个cron job,如下所示:
apiVersion: batch/v1beta1
kind: CronJob
metadata:
name: eventstore-restart
spec:
# Run every full hour, 15 past, 30 past, 45 past every other time-unit.
schedule: "0,15,30,45 * * * *"
concurrencyPolicy: Forbid
successfulJobsHistoryLimit: 1
failedJobsHistoryLimit: 5
jobTemplate:
spec:
template:
spec:
containers:
- name: eventstore-restart
image: eu.gcr.io/$PROJECT_ID/kubectl:latest
imagePullPolicy: Always
command: [ "/bin/sh", "-c" ]
args:
- 'set -x; kubectl --namespace=$NAMESPACE get pods
| grep -ho "eventstore-\d+"
| xargs -n 1 -I {} kubectl --namespace=$NAMESPACE delete pod {}'
env:
- name: NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
restartPolicy: OnFailure
serviceAccount: restart-eventstore
但是,这似乎扩展到了kubectl get pods ...
,并通过| { ... }
进行了管道传输,这导致"/bin/sh: syntax error: unexpected end of file (expecting "}")
无法执行脚本。
如何编写删除计划中Pod的命令?
4条答案
按热度按时间bprjcwpo1#
我找到了一种方法,就像这样:
您可以在grep命令中将单词
eventstore
替换为其他搜索条件以满足您的需要。您还可以修改kubectl get
过滤器。0kjbasz62#
我会这样做:
或(你的方式)
现在,如果你知道你想删除pod“eventstore-0”,为什么不直接做
kubectl delete pod eventstore-0
呢?b4qexyjb3#
我建议使用标签选择器来过滤
kubectl get
的结果,jsonpath输出只得到pod的名称。假设您的pod标签为
app=eventstore
,并且您希望删除带有此标签的每个pod,您可以使用以下命令:如果只想删除第一个pod,请使用
jsonpath="{.items[0].metadata.name}"
pftdvrlh4#
@suren的回答很好,但当你想删除多个特定pod时,它并不适用于所有情况。例如,如果您有:pod 1,pod 2,pod 3,pod 4,如果你只想删除pod 2和pod 4,你不能用grep来做(
grep pod
会捕获所有的pod 2和pod 4)。在这种情况下,您可以像这样删除它们: