【问题标题】:What will happen to evicted pods in kubernetes?Kubernetes 中被驱逐的 pod 会发生什么?
【发布时间】:2018-03-07 05:55:39
【问题描述】:

我刚刚看到我的一些 pod 被 kubernetes 驱逐了。他们会发生什么?就这样闲逛还是我必须手动删除它们?

【问题讨论】:

  • 看到同样的行为,我有一个 pod 已经处于 Evicted 状态 13 天了。看起来被驱逐的 pod 没有被移除(或者它可能只是一个错误)。
  • podgc 控制器将在达到可配置阈值时回收那些失败/成功的 pod。
  • 我的 Pod 被驱逐了,总共有 40 个。那么我是否也会为这些被驱逐的 Pod 每月收费?
  • 一堆容器被驱逐,但我仍然有 2 个容器按预期运行。失败的原因是资源不足(DiskPressure),可以使用kubectl describe pods my-pod-name --namespace prod

标签: kubernetes


【解决方案1】:

要回答最初的问题:被驱逐的 pod 将一直徘徊,直到它们的数量达到terminated-pod-gc-threshold 限制(这是kube-controller-manager 的一个选项,默认情况下等于 12500),这是 Kubernetes 的设计行为(同样的方法也用于和记录工作 - https://kubernetes.io/docs/concepts/workloads/controllers/job/#job-termination-and-cleanup)。将被驱逐的 pod 保留在周围,您可以查看这些 pod 的日志以检查错误、警告或其他诊断输出。

【讨论】:

    【解决方案2】:

    awk 的另一种方式。

    为了防止任何可能让我发疯的人为错误(删除所需的 pod),我在get pods 命令的结果之前检查:

    kubectl -n my-ns get pods --no-headers --field-selector=status.phase=Failed     
    

    如果看起来不错,我们开始:

    kubectl -n my-ns get pods --no-headers --field-selector=status.phase=Failed | \
    awk '{system("kubectl -n my-ns delete pods " $1)}'
    

    所有命名空间的 pod 都一样。

    检查:

    kubectl get -A pods --no-headers --field-selector=status.phase=Failed     
    

    删除:

    kubectl get -A pods --no-headers --field-selector status.phase=Failed | \
    awk '{system("kubectl -n " $1 " delete pod " $2 )}'
    

    【讨论】:

      【解决方案3】:

      下面的命令从所有命名空间中删除所有失败的 pod

      kubectl get pods -A | grep Evicted | awk '{print $2 " -n " $1}' | xargs -n 3 kubectl delete pod
      

      【讨论】:

      • 完美运行!
      【解决方案4】:

      要强制删除所有Evicted pod,可以试试这个单行命令:

      $ kubectl get pod -A | sed -nr '/Evicted/s/(^\S+)\s+(\S+).*/kubectl -n \1 delete pod \2 --force --grace-period=0/e'
      

      提示:使用ss 命令的p 修饰符而不是e 将只打印真正的命令来执行删除工作:

      $ kubectl get pod -A | sed -nr '/Evicted/s/(^\S+)\s+(\S+).*/kubectl -n \1 delete pod \2 --force --grace-period=0/p'
      

      【讨论】:

        【解决方案5】:

        下面的命令将从默认命名空间中获取所有被驱逐的 pod 并删除它们

        kubectl get pods | grep Evicted | awk '{print$1}' | xargs -I {} kubectl delete pods/{}

        【讨论】:

        • 不鼓励仅使用代码的答案,因为从长远来看,它不会像带有解释上下文的答案那样帮助社区。​​span>
        【解决方案6】:

        另外一个 bash 命令来删除被驱逐的 pods

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

        【讨论】:

          【解决方案7】:

          以防万一有人想自动删除所有命名空间的所有被驱逐的 pod:

          • Powershell
              Foreach( $x in (kubectl get po --all-namespaces --field-selector=status.phase=Failed --no-headers -o custom-columns=:metadata.name)) {kubectl delete po $x --all-namespaces }
          
          • 重击
          kubectl get po --all-namespaces --field-selector=status.phase=Failed --no-headers -o custom-columns=:metadata.name | xargs kubectl delete po --all-namespaces
          

          【讨论】:

          • 如果有帮助,您可以将其设置为按计划运行为 k8s cronjob,按照此处的简单文档进行操作:kubernetes.io/docs/tasks/job/automated-tasks-with-定时任务
          【解决方案8】:

          Kube-controller-manager 在 K8s 安装中默认存在。在 GC 启动之前,默认值似乎是最多 12500 个终止的 pod。

          直接来自 K8s 文档: https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/#kube-controller-manager

          --terminated-pod-gc-threshold int32     默认值:12500
          在终止的 pod 垃圾收集器开始删除终止的 pod 之前可以存在的终止 pod 的数量。如果

          【讨论】:

          • 我的主节点上有 kube-controller-manager pod。但是我应该如何修改这个标志?如果我想使用kubectl edit pod kube-controller-manager-<master_name> -n kube-system,它会在保存配置文件后给我pod is invalid 错误。
          • 对于我们来说,我们无法像在 AKS 上那样编辑 kube-controller-manager 的配置。所以我们设置了一个快速的 cronjob 进行清理:kubernetes.io/docs/tasks/job/automated-tasks-with-cron-jobs
          【解决方案9】:

          如果您想要保留状态为 Completed 的 pod:

          kubectl get pods --all-namespaces --field-selector 'status.phase==Failed' -o json | kubectl delete -f -
          

          【讨论】:

            【解决方案10】:

            我使用的一个快速解决方法是在事件发生后手动删除所有被驱逐的 pod。你可以使用这个命令:

            kubectl get pods --all-namespaces -o json | jq '.items[] | select(.status.reason!=null) | select(.status.reason | contains("Evicted")) | "kubectl delete pods \(.metadata.name) -n \(.metadata.namespace)"' | xargs -n 1 bash -c
            

            【讨论】:

            【解决方案11】:

            删除命名空间default中处于失败状态的pods

            kubectl -n default delete pods --field-selector=status.phase=Failed
            

            【讨论】:

            • 奇怪的是,status.phase=Evicted 时没有显示任何内容。我设法通过kubectl -n default delete pods --field-selector=status.phase!=Running 做到了这一点。但要小心,这会删除所有内容
            • 我猜一开始运行kubectl -n default get pods --field-selector=status.phase=Failed 会很有用。
            • 它确实为我摆脱了 Evicted 豆荚。
            • 在 EKS v1.16 上为我的 Evicted pod 工作就像一个魅力。谢谢。
            • 在最新的 GCP k8s 中为我工作
            【解决方案12】:

            应手动删除被驱逐的 pod。您可以使用以下命令删除所有处于Error 状态的 pod。

            kubectl get pods --all-namespaces --field-selector 'status.phase==Failed' -o json | kubectl delete -f -
            

            【讨论】:

              【解决方案13】:

              这里是关于如何硬编码阈值的“官方”指南(如果您不想看到太多被驱逐的 pod):kube-controll-manager

              但是一个已知的问题是如何安装 kube-controll-manager...

              【讨论】:

              • 如果麻烦,请告知如何实现上述安装。
              • 我也不知道答案,这就是我提到它的原因。并且 OP 没有提到他使用的系统,我不知道他是否会遇到同样的问题。顺便说一句,downvote 是 SUPER NICE。
              • 我认为您最好将您的想法添加为评论,因为它没有完全回答问题(这就是我投反对票的原因 - 抱歉,但它发生在我们所有人身上,包括我刚才)。
              • 检查上面的所有其他答案,OP 询问发生了什么,有多少人回答了这个问题,有多少人提供了删除驱逐 pod 的方法?
              【解决方案14】:

              OpenShift 等效于 Kalvin 删除所有“驱逐”的 pod 的命令:

              eval "$(oc get pods --all-namespaces -o json | jq -r '.items[] | select(.status.phase == "Failed" and .status.reason == "Evicted") | "oc delete pod --namespace " + .metadata.namespace + " " + .metadata.name')"
              

              【讨论】:

                【解决方案15】:

                根据是否满足软或硬eviction threshold,Pod 中的容器将在有或没有宽限期的情况下终止,PodPhase 将标记为Failed 并删除 Pod。如果您的应用程序作为例如的一部分运行一个部署,将有另一个由 Kubernetes 创建和调度的 Pod - 可能在另一个不超过其驱逐阈值的节点上。

                请注意,驱逐不一定是由阈值引起的,也可以通过kubectl drainempty a node 或通过Kubernetes API 手动调用。

                【讨论】:

                • 是的,我的 pod 来自一个部署,我确实看到另一个 pod 在另一个节点上运行,但是那些之前被驱逐的 pod 也在那里
                • 你如何确定他们“也在那里”?哪个命令准确地向您显示了这一点?
                • 只是kubectl get pods -n mynamespace
                • 在哪个州? kubectl describe pod <pod> 说什么?
                • 不是 OP,但我有这个问题。 kubectl describe says “状态:失败原因:驱逐消息:Pod 节点资源不足:[MemoryPressure]。”
                猜你喜欢
                • 2022-11-11
                • 2021-10-04
                • 1970-01-01
                • 2020-07-03
                • 2019-09-21
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多