无法在 Kubernetes 中删除 pod
Posted
技术标签:
【中文标题】无法在 Kubernetes 中删除 pod【英文标题】:Can not delete pods in Kubernetes 【发布时间】: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 创建
【参考方案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)。它们是:
Pods 控制器(基本上是 Pod 控制器) ReplicationController ReplicaSet Deployment StatefulSet DaemonSet Job CronJob看,谁控制谁:
ReplicationController -> Pod ReplicaSet -> Pod 部署 -> ReplicaSet(s) -> Pod(s) StatefulSet -> Pod DaemonSet -> Pod 工作 -> 豆荚 CronJob -> 作业 -> Pod
a -> b
表示a
创建和控制b
和字段的值b
的清单中的.metadata.ownerReference
是a
的引用。为了 例如,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
的当前status
与a
的spec
。比如说,如果删除b
,那么b
将被删除。但a
还活着,a
的控制器看到有一个a
的当前status
和a
的spec
之间的区别。所以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 <podname>
并检查
apiVersion: apps/v1
kind: StatefulSet
metadata:
现在做kubectl get <pod-kind>
最后删除相同的,pod也将被删除。
【讨论】:
【参考方案6】:删除部署,而不是 pod。是部署正在制作另一个 pod。删除 pod 后可以看到不同的 pod 名称。
kubectl get all
kubectl delete deployment DEPLOYMENTNAME
【讨论】:
以上是关于无法在 Kubernetes 中删除 pod的主要内容,如果未能解决你的问题,请参考以下文章
Kubernetes 无法删除状态为Terminating的Pod解决方法
Kubernetes强制删除一直处于Terminating状态的pod。
RabbitMQ 无法在 Kubernetes 上启动持久性存储。权限被拒绝错误