从 Kubernetes 内部使用 "kubectl delete pods X"
Using "kubectl delete pods X" from inside Kubernetes
我们在 gcloud 上使用 >1.8 版本的 k8s。不幸的是,EventStore 在重新启动之前停止推送数据。因此,我们希望每 6 小时 运行 kubectl --namespace=$NAMESPACE delete pod eventstore-0
。因此我们有一个像这样的 cron 作业:
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的命令?
我建议使用标签选择器来过滤 kubectl get
的结果,并使用 jsonpath 输出来获取 pod 的名称。
假设您的 pod 带有 app=eventstore
标签,并且您想删除带有此标签的每个 pod,您可以使用以下命令:
k get po --namespace=$NAMESPACE --selector app=eventstore -o jsonpath="{.items[*].metadata.name}" | xargs -n 1 -I {} kubectl --namespace=$NAMESPACE delete po {}
如果您只想删除第一个 pod,请使用 jsonpath="{.items[0].metadata.name}"
我会这样做:
kubectl delete po $(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}' | grep eventstore) -n $NAMESPACE
或(您的方式)
kubectl get pods -n $NAMESPACE -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}' | grep eventstore | xargs -n 1 -I {} kubectl delete po {}
现在,如果您知道要删除 pod "eventstore-0",为什么不直接执行 kubectl delete pod eventstore-0
?
@suren 回答很好,但是当你想删除多个 specific pods 时,它在所有情况下都不起作用。例如,如果您有:pod1、pod2、pod3、pod4,而您只想删除 pod2 和 pod4,则不能使用 grep 执行此操作(grep pod
将捕获所有这些)。
在这种情况下,您可以这样删除它们:
kubectl delete pods -n $NAMESPACE $(echo -e 'pod2\npod4')
我们在 gcloud 上使用 >1.8 版本的 k8s。不幸的是,EventStore 在重新启动之前停止推送数据。因此,我们希望每 6 小时 运行 kubectl --namespace=$NAMESPACE delete pod eventstore-0
。因此我们有一个像这样的 cron 作业:
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的命令?
我建议使用标签选择器来过滤 kubectl get
的结果,并使用 jsonpath 输出来获取 pod 的名称。
假设您的 pod 带有 app=eventstore
标签,并且您想删除带有此标签的每个 pod,您可以使用以下命令:
k get po --namespace=$NAMESPACE --selector app=eventstore -o jsonpath="{.items[*].metadata.name}" | xargs -n 1 -I {} kubectl --namespace=$NAMESPACE delete po {}
如果您只想删除第一个 pod,请使用 jsonpath="{.items[0].metadata.name}"
我会这样做:
kubectl delete po $(kubectl get pods -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}' | grep eventstore) -n $NAMESPACE
或(您的方式)
kubectl get pods -n $NAMESPACE -o go-template --template '{{range .items}}{{.metadata.name}}{{"\n"}}{{end}}' | grep eventstore | xargs -n 1 -I {} kubectl delete po {}
现在,如果您知道要删除 pod "eventstore-0",为什么不直接执行 kubectl delete pod eventstore-0
?
@suren 回答很好,但是当你想删除多个 specific pods 时,它在所有情况下都不起作用。例如,如果您有:pod1、pod2、pod3、pod4,而您只想删除 pod2 和 pod4,则不能使用 grep 执行此操作(grep pod
将捕获所有这些)。
在这种情况下,您可以这样删除它们:
kubectl delete pods -n $NAMESPACE $(echo -e 'pod2\npod4')