本章,您将学习各种删除它们的方法。删除 pod 将终止其容器并将它们从节点中删除。删除 Deployment 对象会导致其 pod 被删除,而删除 LoadBalancer 类型的服务会取消配置负载均衡器(如果已配置)。

按名称删除 pod

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

删除单个 pod

  1. $ kubectl delete po kubia
  2. pod "kubia" deleted

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

默认情况下,kubectl delete 命令会等到对象不再存在。要跳过等待,请使用 —wait=false 选项运行命令。

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

  1. $ kubectl get po kubia
  2. NAME READY STATUS RESTARTS AGE
  3. kubia 1/1 Terminating 0 35m

如果您希望您的应用程序为其客户提供良好的体验,那么准确了解容器是如何关闭的很重要。这将在下一章中解释,我们将深入探讨 pod 及其容器的生命周期。

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

使用单个命令删除多个 pod

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

  1. $ kubectl delete po kubia-init kubia-init-slow
  2. pod "kubia-init" deleted
  3. pod "kubia-init-slow" deleted

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

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

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

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

  1. $ kubectl delete -f kubia-ssl.yaml
  2. pod "kubia-ssl" deleted

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

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

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

  1. $ kubectl delete -f kubia.yaml,kubia-ssl.yaml

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

在我使用 Kubernetes 的多年中,我从未真正使用过这种方法,但我经常通过指定目录名称而不是单个文件的名称来部署文件目录中的所有清单文件。例如,您可以通过在本书代码存档的基本目录中运行以下命令来再次部署您在本章中创建的所有 Pod:

  1. $ kubectl apply -f Chapter05/

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

  1. $ kubectl delete -f Chapter05/

使用 —recursive 标志也可以扫描子目录。

删除所有 pods

您现在已经删除了除 kubia-stdin 和您在第 3 章中使用 kubectl create deployment 命令创建的 pod 之外的所有 pod。根据您扩展部署的方式,其中一些 pod 应该仍在运行:

  1. $ kubectl get pods
  2. NAME READY STATUS RESTARTS AGE
  3. kubia-stdin 1/1 Running 0 10m
  4. kubia-9d785b578-58vhc 1/1 Running 0 1d
  5. kubia-9d785b578-jmnj8 1/1 Running 0 1d

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

  1. $ kubectl delete po --all
  2. pod "kubia-stdin" deleted
  3. pod "kubia-9d785b578-58vhc" deleted
  4. pod "kubia-9d785b578-jmnj8" deleted

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

  1. $ kubectl get po
  2. NAME READY STATUS RESTARTS AGE
  3. kubia-9d785b578-cc6tk 1/1 Running 0 13s
  4. kubia-9d785b578-h4gml 1/1 Running 0 13s

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

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

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

删除大多数类型的对象

您可以使用下一个清单中显示的命令删除迄今为止创建的所有内容 - 包括部署、其 pod 和服务。

  1. $ kubectl delete all --all
  2. pod "kubia-9d785b578-cc6tk" deleted
  3. pod "kubia-9d785b578-h4gml" deleted
  4. service "kubernetes" deleted
  5. service "kubia" deleted
  6. deployment.apps "kubia" deleted
  7. replicaset.apps "kubia-9d785b578" deleted

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

删除对象时,kubectl 会打印每个已删除对象的类型和名称。在前面的清单中,您应该看到它删除了 pod、部署和服务,还删除了一个所谓的副本集对象。您将在第 11 章了解这是什么,我们将在其中仔细研究部署。

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

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

您可以在删除命令中指定多种对象类型。例如,您可以使用 kubectl delete events,all —all 删除事件以及 all 中包含的所有对象类型。