【问题标题】:How to delete completed kubernetes pod?如何删除已完成的 Kubernetes pod?
【发布时间】:2022-04-14 16:13:39
【问题描述】:

我在 kubernetes 中有一堆已完成(成功或不成功)的 pod,我想清理 kubectl get pods 的输出。这是我在运行kubectl get pods 时看到的:

NAME                                           READY   STATUS             RESTARTS   AGE
intent-insights-aws-org-73-ingest-391c9384     0/1     ImagePullBackOff   0          8d
intent-postgres-f6dfcddcc-5qwl7                1/1     Running            0          23h
redis-scheduler-dev-master-0                   1/1     Running            0          10h
redis-scheduler-dev-metrics-85b45bbcc7-ch24g   1/1     Running            0          6d
redis-scheduler-dev-slave-74c7cbb557-dmvfg     1/1     Running            0          10h
redis-scheduler-dev-slave-74c7cbb557-jhqwx     1/1     Running            0          5d
scheduler-5f48b845b6-d5p4s                     2/2     Running            0          36m
snapshot-169-5af87b54                          0/1     Completed          0          20m
snapshot-169-8705f77c                          0/1     Completed          0          1h
snapshot-169-be6f4774                          0/1     Completed          0          1h
snapshot-169-ce9a8946                          0/1     Completed          0          1h
snapshot-169-d3099b06                          0/1     ImagePullBackOff   0          24m
snapshot-204-50714c88                          0/1     Completed          0          21m
snapshot-204-7c86df5a                          0/1     Completed          0          1h
snapshot-204-87f35e36                          0/1     ImagePullBackOff   0          26m
snapshot-204-b3a4c292                          0/1     Completed          0          1h
snapshot-204-c3d90db6                          0/1     Completed          0          1h
snapshot-245-3c9a7226                          0/1     ImagePullBackOff   0          28m
snapshot-245-45a907a0                          0/1     Completed          0          21m
snapshot-245-71911b06                          0/1     Completed          0          1h
snapshot-245-a8f5dd5e                          0/1     Completed          0          1h
snapshot-245-b9132236                          0/1     Completed          0          1h
snapshot-76-1e515338                           0/1     Completed          0          22m
snapshot-76-4a7d9a30                           0/1     Completed          0          1h
snapshot-76-9e168c9e                           0/1     Completed          0          1h
snapshot-76-ae510372                           0/1     Completed          0          1h
snapshot-76-f166eb18                           0/1     ImagePullBackOff   0          30m
train-169-65f88cec                             0/1     Error              0          20m
train-169-9c92f72a                             0/1     Error              0          1h
train-169-c935fc84                             0/1     Error              0          1h
train-169-d9593f80                             0/1     Error              0          1h
train-204-70729e42                             0/1     Error              0          20m
train-204-9203be3e                             0/1     Error              0          1h
train-204-d3f2337c                             0/1     Error              0          1h
train-204-e41a3e88                             0/1     Error              0          1h
train-245-7b65d1f2                             0/1     Error              0          19m
train-245-a7510d5a                             0/1     Error              0          1h
train-245-debf763e                             0/1     Error              0          1h
train-245-eec1908e                             0/1     Error              0          1h
train-76-86381784                              0/1     Completed          0          19m
train-76-b1fdc202                              0/1     Error              0          1h
train-76-e972af06                              0/1     Error              0          1h
train-76-f993c8d8                              0/1     Completed          0          1h
webserver-7fc9c69f4d-mnrjj                     2/2     Running            0          36m
worker-6997bf76bd-kvjx4                        2/2     Running            0          25m
worker-6997bf76bd-prxbg                        2/2     Running            0          36m

我想摆脱像train-204-d3f2337c 这样的豆荚。我该怎么做?

【问题讨论】:

  • 我有类似的任务,但我的重复 pod 是由 kubernetes 作业创建的。在这种情况下,您只需要删除作业并自动删除 pod。

标签: bash kubernetes


【解决方案1】:

现在,您可以轻松一点。

您可以通过以下方式列出所有已完成的 pod:

kubectl get pod --field-selector=status.phase==Succeeded

通过以下方式删除所有已完成的 pod:

kubectl delete pod --field-selector=status.phase==Succeeded

并通过以下方式删除所有错误的 pod:

kubectl delete pod --field-selector=status.phase==Failed

【讨论】:

  • 是否有使用 Kubernetes Python API 的等效项?
  • 如果您手动执行此操作,但如果您想自动化,您将如何执行@pjincz?
【解决方案2】:

如果这个 pods 是由 CronJob 创建的,你可以使用 spec.failedJobsHistoryLimit 和 spec.successfulJobsHistoryLimit

示例:

apiVersion: batch/v1beta1
kind: CronJob
metadata:
  name: my-cron-job
spec:
  schedule: "*/10 * * * *"
  failedJobsHistoryLimit: 1
  successfulJobsHistoryLimit: 3
  jobTemplate:
    spec:
      template:
         ...

【讨论】:

  • 他说的是 pod 列表而不是作业。
  • 每个工作都在创建 pod - 我猜他在谈论这个(与我的案例相关,谢谢)
【解决方案3】:

您可以通过两种方式做到这一点。

$ kubectl delete pod $(kubectl get pods | grep Completed | awk '{print $1}')

或

$ kubectl get pods | grep Completed | awk '{print $1}' | xargs kubectl delete pod

两种解决方案都能胜任。

【讨论】:

    【解决方案4】:

    如果您想删除未运行的 pod,只需一个命令即可完成

    kubectl get pods --field-selector=status.phase!=Running
    

    更新了删除 pod 的命令

    kubectl delete pods --field-selector=status.phase!=Running
    
    

    【讨论】:

    • 获取 pod,删除它们:kubectl delete pods --field-selector=status.phase!=Running
    【解决方案5】:

    这是一个单行,它将删除所有未处于 Running 或 Pending 状态的 pod(请注意,如果 pod 名称中包含 Running 或 Pending,它不会被删除曾经使用过这一个班轮):

    kubectl get pods --no-headers=true |grep -v "Running" | grep -v "Pending" | sed -E 's/([a-z0-9-]+).*/\1/g' | xargs kubectl delete pod

    这里有一个解释:

    1. 获取所有不带任何标题的 pod
    2. 过滤掉Running的豆荚
    3. 过滤掉Pending的豆荚
    4. 使用 sed 正则表达式提取 pod 的名称
    5. 使用 xargs 按名称删除每个 pod

    请注意,这并不代表所有 pod 状态。例如,如果一个 pod 的状态为 ContainerCreating,那么这个 liner 也会删除该 pod。

    【讨论】:

      【解决方案6】:

      如前面的答案所述,您可以使用以下命令:

      kubectl delete pod --field-selector=status.phase=={{phase}}
      

      要删除某个“阶段”中的 pod,仍然缺少对 phases 存在的内容的快速总结,因此“pod 阶段”的有效值为:

      待定、运行、成功、失败、未知

      在这种特定情况下,删除“错误”pod:

      kubectl delete pod --field-selector=status.phase==Failed
      

      【讨论】:

        【解决方案7】:

        给你:

        kubectl get pods --all-namespaces |grep -i completed|awk '{print "kubectl delete pod "$2" -n "$1}'|bash
        

        您可以将完成替换为 CrashLoopBackOff 或任何其他状态...

        【讨论】:

        • 这个问题有 8 个现有答案,其中包括一个获得最高票数、获得超过 80 票 的答案。为什么您认为您的方法改进了已通过社区验证的现有提案?在 Stack Overflow 上,提供解释总是很有用,但在问题已得到解决且让 OP 和社区都满意的情况下,它尤其很重要。通过解释您的答案有何不同以及何时可能更受欢迎,帮助读者了解答案。
        • 欢迎来到 SO。感谢您的贡献。不鼓励仅使用代码的答案。考虑添加有关此代码如何/为何解决 OP 问题的解释。如果合适,还包括它适用的用例或可能不起作用的任何警告。或者对比一下为什么在某些情况下这可能是一个更好的解决方案。在适用的情况下,也鼓励链接到文档或其他来源以获取后续信息。好的、详细的答案更有可能获得支持。考虑使用其他信息编辑您的答案。万事如意。
        • @JeremyCaney 如果您想删除所有命名空间中的所有“已完成”pod,此答案效果很好。其他答案只删除默认命名空间中的 pod
        【解决方案8】:

        您可以通过以下方式列出所有已完成的 pod:

        kubectl get pod --field-selector=status.phase==Succeeded

        并通过以下方式删除所有已完成的 pod:

        kubectl 删除 pod --field-selector=status.phase==Succeeded

        【讨论】:

          【解决方案9】:

          我认为pjincz 很好地解决了您关于手动删除已完成的 pod 的问题。

          但是,我在这里突然介绍了 Kubernetes 的一个新功能,它可以代表您自动删除完成的 pod。您应该只定义一个自动clean up finished Jobs 的生存时间,如下所示:

          apiVersion: batch/v1
          kind: Job
          metadata:
            name: remove-after-ttl
          spec:
            ttlSecondsAfterFinished: 86400
            template:
              ...
          

          【讨论】:

          • 这是自动删除整个作业(所有 pod),而不是在作业仍在某些 pod 上运行时精确删除已完成的 pod。
          • 为什么要在与 Job 相关的 pod 全部完成之前删除它们?您有具体案例吗?
          猜你喜欢
          • 1970-01-01
          • 2018-07-23
          • 2020-03-11
          • 1970-01-01
          • 2021-09-21
          • 2022-12-11
          • 2016-07-08
          • 1970-01-01
          • 2019-08-06
          相关资源
          最近更新 更多