【问题标题】:Kubernetes pod gets recreated when deleted删除时重新创建 Kubernetes pod
【发布时间】:2017-04-02 20:09:38
【问题描述】:

我已经用命令启动了 pod

$ kubectl run busybox \
--image=busybox \
--restart=Never \
--tty \
-i \
--generator=run-pod/v1

出了点问题,现在我无法删除此Pod

我尝试使用下面描述的方法,但 Pod 不断被重新创建。

$ kubectl delete pods  busybox-na3tm
pod "busybox-na3tm" deleted

$ kubectl get pods
NAME                                     READY     STATUS              RESTARTS   AGE
busybox-vlzh3                            0/1       ContainerCreating   0          14s

$ kubectl delete pod busybox-vlzh3 --grace-period=0

$ kubectl delete pods --all
pod "busybox-131cq" deleted
pod "busybox-136x9" deleted
pod "busybox-13f8a" deleted
pod "busybox-13svg" deleted
pod "busybox-1465m" deleted
pod "busybox-14uz1" deleted
pod "busybox-15raj" deleted
pod "busybox-160to" deleted
pod "busybox-16191" deleted

$ kubectl get pods --all-namespaces
NAMESPACE   NAME            READY     STATUS              RESTARTS   AGE
default     busybox-c9rnx   0/1       RunContainerError   0          23s

【问题讨论】:

  • 您是否设法通过传递错误的参数来创建复制控制器。 kubectl get all -o name 能得到什么?
  • 你能检查kubectl get events看看是什么创建了这些对象吗?
  • 尝试kubctl get rc 查看是否创建了 ReplicationController。如果是这样,请删除它,然后删除 pod。
  • 你运行的是什么版本的 kubernetes?取决于你的kubernetes版本吗?它的行为可能会有所不同。例如在 1.2 之前它总是创建部署。 kubectl get deployment
  • 如果有人到这里结束:- 删除部署为我解决了这个问题。 kubectl delete deployment <deployment_name>。要获取部署名称,请执行kubectl get deployments

标签: kubernetes kubectl


【解决方案1】:

您需要删除部署,这又会删除 pod 和副本集 https://github.com/kubernetes/kubernetes/issues/24137

列出所有部署:

kubectl get deployments --all-namespaces

然后删除部署:

kubectl delete -n NAMESPACE deployment DEPLOYMENT

其中 NAMESPACE 是它所在的命名空间,而 DEPLOYMENT 是部署的名称。如果 NAMESPACE 是 default,则完全放弃 -n 选项。

在某些情况下,它也可能由于作业或守护程序集而运行。 检查以下内容并运行相应的删除命令。

kubectl get jobs

kubectl get daemonsets.app --all-namespaces

kubectl get daemonsets.extensions --all-namespaces

【讨论】:

  • 之后如何恢复部署?
  • @Jamey 你用kubectl create 命令再次创建它。
  • 不需要是部署。可能是一份工作。所以一定要检查kubectl get jobs
  • 要删除多个对象类型,而不仅仅是部署,请尝试:kubectl delete replicasets,subscriptions,deployments,jobs,services,pods --all -n <namespace>
【解决方案2】:

在某些情况下,即使删除部署,Pod 仍然不会消失。在这种情况下,要强制删除它们,您可以运行以下命令。

kubectl delete pods podname --grace-period=0 --force

【讨论】:

  • 如果策略类型设置为Recreate,当部署、作业或任何其他类型的控制器创建的pod时,这将无法解决问题。
【解决方案3】:

即使在手动删除 pod 后仍自动重新创建 pod,则这些 pod 已使用部署创建。 创建部署时,它会自动创建 ReplicaSet 和 Pod。根据您在部署脚本中提到的 pod 副本的数量,它最初会创建这些数量的 pod。 当您尝试手动删除任何 pod 时,它会自动再次创建这些 pod。

是的,有时您需要强制删除 pod。但在这种情况下,强制命令不起作用。

【讨论】:

  • 我在尝试此操作时收到警告,表明 pod 可能作为僵尸进程继续存在,所以这不是我想要的......
【解决方案4】:

如果您的 pod 的名称类似于 name-xxx-yyy,它可以由名为 name-xxxreplicasets.apps 控制,您应该在删除 pod 之前先删除该 replicaset

kubectl delete replicasets.apps name-xxx

【讨论】:

  • 谢谢!就我而言,这是一项重新创建它的特定工作。所以:kubectl delete --all jobs -n <namespace>
  • 使用kubectl get replicasets.apps -n <namespace>(或--all-namespaces)查找副本集
【解决方案5】:

您可以尝试删除replicaSet,而不是删除NS

kubectl get rs --all-namespaces

然后删除replicaSet

kubectl delete rs your_app_name

【讨论】:

    【解决方案6】:

    也要注意有状态的集合

    kubectl get sts --all-namespaces
    

    删除命名空间中的所有状态集

    kubectl --namespace <yournamespace> delete sts --all
    

    一一删除

    kubectl --namespace ag1 delete sts mssql1 
    kubectl --namespace ag1 delete sts mssql2
    kubectl --namespace ag1 delete sts mssql3
    

    【讨论】:

      【解决方案7】:

      在接受interactive tutorial 之后,我最终得到了一堆 pod、服务、部署:

      me@pooh ~ > kubectl get pods,services
      NAME                                       READY   STATUS    RESTARTS   AGE
      pod/kubernetes-bootcamp-5c69669756-lzft5   1/1     Running   0          43s
      pod/kubernetes-bootcamp-5c69669756-n947m   1/1     Running   0          43s
      pod/kubernetes-bootcamp-5c69669756-s2jhl   1/1     Running   0          43s
      pod/kubernetes-bootcamp-5c69669756-v8vd4   1/1     Running   0          43s
      
      NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
      service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   37s
      me@pooh ~ > kubectl get deployments --all-namespaces
      NAMESPACE     NAME                  DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
      default       kubernetes-bootcamp   4         4         4            4           1h
      docker        compose               1         1         1            1           1d
      docker        compose-api           1         1         1            1           1d
      kube-system   kube-dns              1         1         1            1           1d
      

      为了清理一切,delete --all 工作正常:

      me@pooh ~ > kubectl delete pods,services,deployments --all
      pod "kubernetes-bootcamp-5c69669756-lzft5" deleted
      pod "kubernetes-bootcamp-5c69669756-n947m" deleted
      pod "kubernetes-bootcamp-5c69669756-s2jhl" deleted
      pod "kubernetes-bootcamp-5c69669756-v8vd4" deleted
      service "kubernetes" deleted
      deployment.extensions "kubernetes-bootcamp" deleted
      

      这给我留下了(我认为是)一个空的 Kubernetes 集群:

      me@pooh ~ > kubectl get pods,services,deployments
      NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
      service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   8m
      

      【讨论】:

        【解决方案8】:

        如果您有继续运行的作业,则需要搜索该作业并将其删除:

        kubectl get job --all-namespaces | grep &lt;name&gt;

        kubectl delete job &lt;job-name&gt;

        【讨论】:

          【解决方案9】:

          而不是试图弄清楚它是部署、deamonset、statefulset...还是什么(在我的例子中,它是一个不断跨越新 pod 的复制控制器:) 为了确定是什么不断跨越图像,我使用以下命令获取了所有资源:

          kubectl get all
          

          当然你也可以从所有命名空间中获取所有资源:

          kubectl get all --all-namespaces
          

          或定义您要检查的命名空间:

          kubectl get all -n NAMESPACE_NAME
          

          一旦我看到复制控制器是造成我的麻烦的原因,我就删除了它:

          kubectl delete replicationcontroller/CONTROLLER_NAME
          

          【讨论】:

            【解决方案10】:

            这将提供有关所有 pod、部署、服务和作业的信息 在命名空间中。

            kubectl get pods,services,deployments,jobs
            

            pod 可以通过 deploymentsjobs

            创建
            kubectl delete job [job_name]
            kubectl delete deployment [deployment_name]
            

            如果您删除部署或作业,则可以停止重新启动 pod。

            【讨论】:

              【解决方案11】:

              您可以通过 kubectl get replicasets 根据年龄或时间检查旧部署

              如果要删除应用程序当前正在运行的同一 pod,请根据时间删除旧部署

              kubectl delete replicasets <Name of replicaset>
              

              【讨论】:

                【解决方案12】:

                我也遇到了这个问题,我用下面的命令删除了部署。

                kubectl delete deployments DEPLOYMENT_NAME
                

                但 Pod 仍在重新创建,所以我使用以下命令交叉检查了 Replica Set

                kubectl get rs
                

                然后将副本集编辑为 1 到 0

                kubectl edit rs REPICASET_NAME
                

                【讨论】:

                  【解决方案13】:

                  问题的根本原因是部署/作业/replicasets 规范属性strategy-&gt;type,它定义了 pod 被销毁时应该发生的情况(隐式或显式)。就我而言,它是Recreate

                  根据@nomad 的answer,删除部署/作业/副本是一种简单的解决方法,可以避免在作为新手用户弄乱集群之前尝试致命的组合。

                  在开始调试之前,请尝试以下命令以了解幕后操作:

                  kubectl get all -A -o name
                  kubectl get events -A | grep <pod-name>
                  

                  【讨论】:

                    【解决方案14】:

                    在我的情况下,我通过像 kubectl apply -f deployment.yaml 这样的 YAML 文件进行部署,解决方案似乎是通过 kubectl delete -f deployment.yaml 删除

                    【讨论】:

                      【解决方案15】:

                      这里的许多答案告诉删除特定的 k8s 对象,但您可以一次删除多个对象,而不是一个一个地删除:

                      kubectl delete deployments,jobs,services,pods --all -n &lt;namespace&gt;

                      就我而言,我正在使用 OLM - Operator Lifecycle Manager 运行 OpenShift 集群。 OLM 是控制部署的人,所以当我删除部署时,阻止 Pod 重新启动是不够的。

                      只有当我删除 OLM 及其 subscription 时,部署、服务和 Pod 才消失。

                      首先列出你命名空间中的所有 k8s 对象:

                      $ kubectl get all -n openshift-submariner
                      
                      NAME                                       READY   STATUS    RESTARTS   AGE
                      pod/submariner-operator-847f545595-jwv27   1/1     Running   0          8d  
                      NAME                                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
                      service/submariner-operator-metrics   ClusterIP   101.34.190.249   <none>        8383/TCP   8d
                      NAME                                  READY   UP-TO-DATE   AVAILABLE   AGE
                      deployment.apps/submariner-operator   1/1     1            1           8d
                      NAME                                             DESIRED   CURRENT   READY   AGE
                      replicaset.apps/submariner-operator-847f545595   1         1         1       8d
                      

                      OLM 没有与get all 一起列出,所以我专门搜索一下:

                      $ kubectl get olm -n openshift-submariner
                      
                      NAME                                                      AGE
                      operatorgroup.operators.coreos.com/openshift-submariner   8d
                      NAME                                                             DISPLAY      VERSION
                      clusterserviceversion.operators.coreos.com/submariner-operator   Submariner   0.0.1 
                      

                      现在删除所有对象,包括 OLM、订阅、部署、副本集等:

                      $ kubectl delete olm,svc,rs,rc,subs,deploy,jobs,pods --all -n openshift-submariner
                      
                      operatorgroup.operators.coreos.com "openshift-submariner" deleted
                      clusterserviceversion.operators.coreos.com "submariner-operator" deleted
                      deployment.extensions "submariner-operator" deleted
                      subscription.operators.coreos.com "submariner" deleted
                      service "submariner-operator-metrics" deleted
                      replicaset.extensions "submariner-operator-847f545595" deleted
                      pod "submariner-operator-847f545595-jwv27" deleted
                      

                      再次列出对象 - 全部消失:

                      $ kubectl get all -n openshift-submariner
                      No resources found.
                      
                      $ kubectl get olm -n openshift-submariner
                      No resources found.
                      

                      【讨论】:

                        【解决方案16】:

                        我遇到了类似的问题:删除部署 (kubectl delete deploy &lt;name&gt;) 后,pod 保持“运行”状态,并且在删除后自动重新创建 (kubectl delete po &lt;name&gt;)。

                        原来关联的副本集由于某种原因没有自动删除,删除后(kubectl delete rs &lt;name&gt;),可以删除pod。

                        【讨论】:

                          【解决方案17】:

                          对于具有状态集(或服务、作业等)的部署,您可以使用以下命令:

                          此命令终止在指定&lt;NAMESPACE&gt; 中运行的任何内容

                          kubectl -n <NAMESPACE> delete replicasets,deployments,jobs,service,pods,statefulsets --all
                          

                          而且有力

                          kubectl -n <NAMESPACE> delete replicasets,deployments,jobs,service,pods,statefulsets --all --cascade=true --grace-period=0 --force
                          

                          【讨论】:

                            【解决方案18】:

                            显然有些东西正在重生豆荚。虽然许多其他答案让您查看所有内容(副本集、作业、部署、有状态集......)以找到可能重新生成 pod 的内容,但您可以改为查看 pod 以查看生成它的内容。例如:

                            $ kubectl describe pod $mypod | grep 'Controlled By:'
                            Controlled By:  ReplicaSet/foobar
                            

                            这会准确地告诉您创建 pod 的原因。然后你可以去删除它。

                            【讨论】:

                              【解决方案19】:

                              这发生在我的一些损坏的“helm”安装中。您的部署可能有点混乱。如果之前的建议都不起作用,请查找守护程序集并将其删除。

                              例如 kubectl get daemonset --namespace

                              然后删除守护进程

                              kubectl delete daemonset --namespace <NAMESPACE> --all --force
                              

                              然后尝试删除 pod。

                              kubectl delete pod --namespace  <NAMESPACE> --all --force
                              

                              检查 pod 是否消失。

                              kubectl get pods --all-namespaces
                              

                              【讨论】:

                                【解决方案20】:

                                删除PODS基本上有两种方法

                                1. kubectl scale --replicas=0 部署 name_of_deployment。 这会将副本数设置为 0,因此不会再次重新启动 pod。
                                2. 使用 helm 卸载您在管道中实现的图表。 不要直接删除部署,而是使用 helm 卸载图表,这将删除它创建的所有对象。

                                【讨论】:

                                  【解决方案21】:

                                  对我来说最快的解决方案是安装 Lens IDE 并删除 de DEPLOYMENTS 选项卡下的服务。只需从此选项卡中删除,副本也会被删除。

                                  最好的问候

                                  【讨论】:

                                    猜你喜欢
                                    • 2017-07-30
                                    • 2020-10-23
                                    • 2021-08-27
                                    • 1970-01-01
                                    • 2018-08-17
                                    • 2018-08-02
                                    • 1970-01-01
                                    • 2019-11-14
                                    • 2022-07-27
                                    相关资源
                                    最近更新 更多