【问题标题】:Can not delete pods in Kubernetes无法在 Kubernetes 中删除 pod
【发布时间】:2019-04-23 15:31:23
【问题描述】:

我尝试使用 Kubernetes 安装 dgraph(单服务器)。
我使用以下方法创建了 pod:

kubectl create -f https://raw.githubusercontent.com/dgraph-io/dgraph/master/contrib/config/kubernetes/dgraph-single.yaml

现在我需要做的就是删除创建的 pod。
我尝试使用以下方法删除 pod:

kubectl delete pod pod-name

结果显示pod deleted,但 pod 不断地重新创建自己。
我需要从我的 Kubernetes 中删除这些 pod。我现在该怎么办?

【问题讨论】:

  • 对于dgraph,您的集群中是否有任何部署或状态集或复制集或复制控制器或作业或cronjob 或守护程序集?
  • 你是如何部署 dgraph 的?
  • 做一个kubectl get all。我很确定你会在那里看到一个拥有 Pod 的部署,这就是你需要删除的那个。
  • 你部署你dgraph使用像这个命令$ kubectl create -f https://raw.githubusercontent.com/dgraph-io/dgraph/master/contrib/config/kubernetes/dgraph-single.yaml
  • 是的,我使用 kubectl create -f raw.githubusercontent.com/dgraph-io/dgraph/master/contrib/… @shudipta 创建

标签: kubernetes kubectl kubernetes-pod kubernetes-deployment


【解决方案1】:

您可以使用以下命令执行优雅的 pod 删除:

kubectl delete pods <pod>

如果要使用 kubectl version >= 1.5 强制删除 Pod,请执行以下操作:

kubectl delete pods <pod> --grace-period=0 --force

如果您使用任何版本的 kubectl

kubectl delete pods <pod> --grace-period=0

如果即使在执行这些命令后 pod 仍处于 Unknown 状态,请使用以下命令将 pod 从集群中移除:

kubectl patch pod <pod> -p '{"metadata":{"finalizers":null}}'

【讨论】:

  • 我尝试了所有这些,它完成了删除 pod 的工作。但我的问题是豆荚在删除(复制)后一次又一次地创建。
  • @AATHITHRAJENDRAN 可能有一个部署正在执行此操作。检查 kubectl get all。
【解决方案2】:

运营商提供的链接可能不可用。请参阅 update 部分

正如您指定的那样,您使用这个https://raw.githubusercontent.com/dgraph-io/dgraph/master/contrib/config/kubernetes/dgraph-single.yaml 创建了您的dgraph 服务器,所以只需使用这个来删除您创建的资源:

$ kubectl delete -f https://raw.githubusercontent.com/dgraph-io/dgraph/master/contrib/config/kubernetes/dgraph-single.yaml

更新

基本上,这是对原因的解释。

Kubernetes 有一些工作负载(它们的清单中包含 PodTemplate)。它们是:

看,谁控制谁:

  • ReplicationController -> Pod
  • ReplicaSet -> Pod
  • 部署 -> ReplicaSet(s) -> Pod(s)
  • StatefulSet -> Pod
  • DaemonSet -> Pod
  • 工作 -> 豆荚
  • CronJob -> 作业 -> Pod

a -&gt; b 表示a 创建和控制b 和字段的值 b 的清单中的.metadata.ownerReferencea 的引用。为了 例如,

apiVersion: v1
kind: Pod
metadata:
  ...
  ownerReferences:
  - apiVersion: apps/v1
    controller: true
    blockOwnerDeletion: true
    kind: ReplicaSet
    name: my-repset
    uid: d9607e19-f88f-11e6-a518-42010a800195
  ...

这样,删除父对象也会通过garbase collection删除子对象。

所以,a 的控制器确保a 的当前statusaspec。比如说,如果删除b,那么b 将被删除。但 a 还活着,a 的控制器看到有一个 a 的当前 statusaspec 之间的区别。所以a的 控制器重新创建一个新的b obj 以匹配a 的规范。

操作创建了一个部署,该部署创建了 ReplicaSet,该 ReplicaSet 进一步创建了 Pod。所以这里的解决方案是删除作为部署的根 obj。

$ kubectl get deploy -n {namespace}

$ kubectl delete deploy {deployment name} -n {namespace}

笔记本

删除过程中可能出现的另一个问题如下: 如果.metadata.finalizers[] 部分中有终结器,则只有在完成关联控制器执行的任务后,才会执行删除。如果一个人想要删除对象而不执行终结器的操作,那么他/她必须首先删除那些终结器。例如,

$ kubectl patch -n {namespace} deploy {deployment name} --patch '{"metadata":{"finalizers":[]}}'
$ kubectl delete -n {namespace} deploy {deployment name}

【讨论】:

    【解决方案3】:

    @Shudipta Sharma 的回答显然是关于如何删除 pod 的正确方法。我只是想确保作者能够理解为什么会发生这种情况。 原因是 Kubernetes 的“思维模式”,其中 Pod 被认为是短暂的、一次性的实体。随着 Pod 的来来去去,StatefulSet 是确保给定数量的具有唯一身份的 pod 将在任何给定时间运行的一种方式。访问您用于部署的 yaml 文件:

    # This StatefulSet runs 1 pod with one Zero, one Alpha & one Ratel containers.
    apiVersion: apps/v1
    kind: StatefulSet
    metadata:
      name: dgraph
    spec:
      serviceName: "dgraph"
      replicas: 1
    

    通过部署它,您基本上是在说您希望 Kubernetes 始终运行该 Pod 的 1 个副本,在任何时候。当您删除 Pod 时,该条件不再成立,因此在删除后,会生成另一个 Pod 以确保上述条件有效。 @Shudipta Sharma 提供的方式只是删除 StatefulSet,这样您就不再需要关注正在运行的 Pod 数量的所需状态。

    您可以在以下 Kubernetes 文档中找到更多相关信息:

    StatefulSets

    Cluster's desired state

    More about Kubernetes objects and difference between each of them

    【讨论】:

      【解决方案4】:

      我确实遇到了同样的问题。运行命令:

      kubectl get deployment
      

      您将获得相应的部署到您的 pod。复制它然后运行命令:

      kubectl delete deployment xyz
      

      然后检查。不会创建新的 pod。

      【讨论】:

        【解决方案5】:

        kubernetes 中的 Pod 也取决于其类型。 喜欢

        • 复制控制器
        • 副本集
        • 状态集
        • 部署
        • 守护程序集
        • 吊舱

        kubectl describe pod &lt;podname&gt; 并检查

        apiVersion: apps/v1
        kind: StatefulSet
        metadata:
        

        现在做kubectl get &lt;pod-kind&gt;
        最后删除相同的,pod也将被删除。

        【讨论】:

          【解决方案6】:

          删除部署,而不是 pod。是部署正在制作另一个 pod。删除 pod 后可以看到不同的 pod 名称。

          kubectl get all
          
          kubectl delete deployment DEPLOYMENTNAME
          

          【讨论】:

            猜你喜欢
            • 2019-11-14
            • 1970-01-01
            • 1970-01-01
            • 2019-12-27
            • 2019-03-16
            • 2018-05-14
            • 1970-01-01
            • 1970-01-01
            • 2021-08-01
            相关资源
            最近更新 更多