在Kubernetes内部使用“kubectl delete pods X”

3duebb1j  于 2023-10-17  发布在  Kubernetes
关注(0)|答案(4)|浏览(122)

我们在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的命令

bprjcwpo

bprjcwpo1#

我找到了一种方法,就像这样:

kubectl get pods -n your-namespace | grep eventstore | awk '{print $1,$2}' | xargs kubectl delete pod $2 -n $1

您可以在grep命令中将单词eventstore替换为其他搜索条件以满足您的需要。您还可以修改kubectl get过滤器。

0kjbasz6

0kjbasz62#

我会这样做:

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呢?

b4qexyjb

b4qexyjb3#

我建议使用标签选择器来过滤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}"

pftdvrlh

pftdvrlh4#

@suren的回答很好,但当你想删除多个特定pod时,它并不适用于所有情况。例如,如果您有:pod 1,pod 2,pod 3,pod 4,如果你只想删除pod 2和pod 4,你不能用grep来做(grep pod会捕获所有的pod 2和pod 4)。
在这种情况下,您可以像这样删除它们:

kubectl delete pods -n $NAMESPACE $(echo -e 'pod2\npod4')

相关问题