K8S - 删除 pod 和其他对象

按名称删除 pod

删除对象最简单的方法是按名称删除它。

删除单个 pod

使用以下命令从集群中删除 kiada pod:

kubectl delete po kiada
# output
pod "kiada" deleted

通过删除一个 pod,您声明您不再希望该 pod 或其容器存在。Kubelet 关闭 pod 的容器,删除所有相关资源,例如日志文件,并在此过程完成后通知 API 服务器。然后删除 Pod 对象。

提示

默认情况下,该 kubectl delete 命令会阻塞,直到对象不再存在。要跳过等待,请运行带有--wait=false选项的命令。

当 pod 处于关闭过程中时,其状态变为 Terminating

kubectl get po kiada
# output
NAME    READY   STATUS        RESTARTS   AGE
kiada   1/1     Terminating   0          35m

如果您希望您的应用程序为其客户提供良好的体验,那么确切地了解容器是如何关闭的很重要。

提示

如果您熟悉 Docker,您可能想知道是否可以像使用 Docker 容器一样停止 pod 并在稍后重新启动它。答案是不。使用 Kubernetes,您只能完全删除一个 pod,然后再重新创建它。

使用单个命令删除多个 pod

您还可以使用单个命令删除多个 pod。如果您运行了 kiada-initkiada-init-slow pod,则可以通过指定以空格分隔的名称来删除它们,如下所示:

kubectl delete po kiada-init kiada-init-slow
# output
pod "kiada-init" deleted
pod "kiada-init-slow" deleted

删除清单文件中定义的对象

每当您从文件创建对象时,您也可以通过将文件传递给 delete 命令而不是指定 pod 的名称来删除它们。

通过指定清单文件删除对象

您可以使用以下命令删除 kiada-ssl 从文件创建的 pod :pod.kiada-ssl.yaml

kubectl delete -f pod.kiada-ssl.yaml
# output
pod "kiada-ssl" deleted

在您的情况下,该文件仅包含一个 pod 对象,但您通常会遇到包含多个代表完整应用程序的不同类型对象的文件。这使得部署和删除应用程序就像分别执行 kubectl apply -f app.yamlkubectl delete -f app.yaml 一样简单。

从多个清单文件中删除对象

有时,一个应用程序在多个清单文件中定义。您可以通过用逗号分隔来指定多个文件。例如:

kubectl delete -f pod.kiada.yaml,pod.kiada-ssl.yaml
提示

您还可以使用此语法同时应用多个文件(例如:kubectl apply -f pod.kiada.yaml,pod.kiada-ssl.yaml。)

在我使用 Kubernetes 的这么多年里,我从未真正使用过这种方法,但我经常通过指定目录名称而不是单个文件的名称来部署文件目录中的所有清单文件。

kubectl apply -f dirName/

这适用于目录中具有正确文件扩展名(.yaml.json等)的所有文件。然后您可以使用相同的方法删除 pod:

kubectl delete -f dirName/
注意

如果清单文件存储在子目录中,则必须使用 --recursive 标志(或-R)。

删除所有 pod

我们可以使用 --all 选项将 pods 全部删除,而不是按名称删除这些 pod :

kubectl delete po --all
# output
pod "kiada-stdin" deleted
pod "kiada-9d785b578-58vhc" deleted
pod "kiada-9d785b578-jmnj8" deleted

现在通过再次执行 kubectl get pods 命令确认不存在 pod :

kubectl get po
# output
NAME                    READY   STATUS    RESTARTS   AGE
kiada-9d785b578-cc6tk   1/1     Running   0          13s
kiada-9d785b578-h4gml   1/1     Running   0          13s

这是出乎意料的!两个 pod 仍在运行。如果您仔细查看他们的名字,您会发现这不是您刚刚删除的两个。该 AGE 列还表明这些是*新*的pod。您也可以尝试删除它们,但您会发现无论删除它们的频率如何,都会创建新的 pod 来替换它们。

这些 pod 不断弹出的原因是因为 Deployment 对象。负责使 Deployment 对象生效的控制器必须确保 pod 的数量始终与对象中指定的所需副本数相匹配。当您删除与 Deployment 关联的 pod 时,控制器会立即创建一个替换 pod。

要删除这些 pod,您必须将 Deployment 缩放为零或完全删除该对象。这表示您不再希望此部署或其 pod 存在于您的集群中。

使用“all”关键字删除对象

您可以使用以下命令删除到目前为止创建的所有内容,包括部署、它的 pod 和服务:

kubectl delete all --all
# output
pod "kiada-9d785b578-cc6tk" deleted
pod "kiada-9d785b578-h4gml" deleted
service "kubernetes" deleted
service "kiada" deleted
deployment.apps "kiada" deleted
replicaset.apps "kiada-9d785b578" deleted

命令中的第一个 all 表示您要删除所有类型的对象。该 --all 选项表示您要删除每个对象类型的所有实例。当您尝试删除所有 pod 时,您在上一节中使用了此选项。

删除对象时,kubectl打印每个已删除对象的类型和名称。在前面的清单中,您应该看到它删除了 pod、部署和服务,还删除了一个所谓的副本集对象。

您会注意到 delete 命令还会删除内置 kubernetes 服务。不用担心这一点,因为服务会在片刻后自动重新创建。

使用此方法时某些对象不会被删除,因为关键字 all 不包括所有对象种类。这是一项预防措施,可防止您意外删除包含重要信息的对象。Event 对象类型就是一个例子。

注意

您可以在 delete 命令中指定多种对象类型。例如,您可以使用 kubectl delete events,all --all 删除事件以及 all.


好好学习,天天向上