22

我尝试使用 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。我现在该怎么办?

4

6 回答 6

18

我确实面临同样的问题。运行命令:

kubectl get deployment

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

kubectl delete deployment xyz

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

于 2018-11-27T13:22:47.813 回答
12

运营商提供的链接可能不可用。见update章节

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

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

更新

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

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

看,谁控制谁:

  • ReplicationController -> Pod(s)
  • ReplicaSet -> Pod(s)
  • 部署 -> ReplicaSet(s) -> Pod(s)
  • StatefulSet -> Pod(s)
  • DaemonSet -> Pod(s)
  • 作业 -> 吊舱
  • CronJob -> 作业 -> Pod

a -> b表示a创建和控制,清单中b的字段值 是 的引用。例如,.metadata.ownerReferenceba

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' 当前statusa'匹配spec。说,如果一个删除b,那么b将被删除。But ais still alive and 's controller 看到'current和'sa之间存在差异。So的控制器重新创建一个新的obj 以匹配' 的规范。astatusaspecaba

操作创建了一个部署,该部署创建了 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}
于 2018-11-21T06:04:22.430 回答
6

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

kubectl delete pods <pod>

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

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

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

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

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

kubectl patch pod <pod> -p '{"metadata":{"finalizers":null}}'
于 2018-11-21T05:27:49.717 回答
3

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

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

kubectl describe pod <podname>检查

apiVersion: apps/v1
kind: StatefulSet
metadata:

现在做kubectl get <pod-kind>
最后删除相同的,pod也将被删除。

于 2018-12-11T09:23:03.193 回答
2

正如@Shudipta Sharma 的回答显然是关于如何删除豆荚的正确方法。我只是想确保作者能够理解为什么会发生这种情况。原因是 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 文档中找到更多相关信息:

有状态集

集群的期望状态

更多关于 Kubernetes 对象和它们之间的区别

于 2018-11-21T13:30:58.077 回答
2

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

kubectl get all

kubectl delete deployment DEPLOYMENTNAME
于 2020-02-26T08:33:49.677 回答