无法在 Kubernetes 中删除 pods

Can not delete pods in Kubernetes

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

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

现在我需要做的就是删除创建的pods。
我尝试使用以下方法删除广告连播:

kubectl delete pod pod-name

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

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

kubectl delete pods <pod>

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

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

如果您使用任何版本的 kubectl <= 1.4,您应该省略 --force 选项并使用:

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

如果即使在这些命令之后 pod 仍停留在未知状态,请使用以下命令从集群中删除 pod:

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

The link provided by the op may be unavailable. See the update section

正如您指定的那样,您使用这个 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
  • 副本集 -> Pod
  • 部署 -> ReplicaSet(s) -> Pod(s)
  • StatefulSet -> Pod
  • DaemonSet -> Pod
  • 作业 -> Pod
  • CronJob -> 作业 -> Pod

a -> b means a creates and controls b and the value of field .metadata.ownerReference in b's manifest is the reference of a. For example,

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

This way, deletion of the parent object will also delete the child object via garbase collection.

So, a's controller ensures that a's current status matches with a's spec. Say, if one deletes b, then b will be deleted. But a is still alive and a's controller sees that there is a difference between a's current status and a's spec. So a's controller recreates a new b obj to match with the a's spec.

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

$ kubectl get deploy -n {namespace}

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

笔记本

Another problem may arise during deletion is as follows: If there is any finalizer in the .metadata.finalizers[] section, then only after completing the task(s) performed by the associated controller, the deletion will be performed. If one wants to delete the object without performing the finalizer(s)' action(s), then he/she has to delete those finalizer(s) first. For example,

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

@Shudipta Sharma 的回答显然是关于如何删除 pods 的正确方法。我只想确保作者能理解为什么会这样。 原因是 Kubernetes 的 "mindset",其中 Pods 被认为是短暂的、一次性的实体。随着 Pods 来来去去,StatefulSets 是确保给定数量的具有唯一身份的 pods 在任何给定时间 运行ning 的一种方法。到达您用于部署的 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,这样你就不再有一个需要的状态来关注 运行ning Pods 的数量。

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

StatefulSets

Cluster's desired state

More about Kubernetes objects and difference between each of them

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

kubectl get deployment

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

kubectl delete deployment xyz

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

Pods 在 kubernetes 中也取决于它的类型。 喜欢

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

执行 kubectl describe pod <podname> 并检查

apiVersion: apps/v1
kind: StatefulSet
metadata:

现在kubectl get <pod-kind>
最后删除一样,pod也会被删除

删除部署,而不是 pods。部署正在制作另一个吊舱。删除pods.

后可以看到不同的pod名称
kubectl get all

kubectl delete deployment DEPLOYMENTNAME