1. 概述

在本教程中,我们将深入探讨在 Kubernetes 集群中停止或暂停 Pod的多种方法和策略。这些操作有助于我们控制流量以及服务的整体可用性。

2. 停止 Pod

Kubernetes 中的 Pod 是一个隔离的最小执行单元,通常包含一个或多个相关的容器。停止 Pod 是一种有意终止 Pod 及其内部所有容器运行的操作。

通常,Pod 的终止分为两种方式:

  • 优雅终止(Graceful Termination)
  • 强制终止(Forceful Termination)

下面我们通过示例来说明这两种方式。

2.1 使用 kubectl delete 命令

我们可以使用 kubectl delete 命令来删除 Kubernetes 中的各种资源,包括 Pod。

优雅删除 Pod 示例:

$ kubectl delete pod my-pod
pod "my-pod" deleted

执行上述命令后,Kubernetes 会开始优雅终止流程:

  • 向 Pod 中的主进程发送终止信号(SIGTERM)
  • 等待一段时间(默认 30 秒)让容器完成清理工作
  • 超时后会强制终止容器(发送 SIGKILL)

2.2 强制终止 Pod

如果 Pod 由于某些原因无法正常终止,我们可以使用 --force 参数进行强制删除:

$ kubectl delete pod my-pod --force
pod "my-pod" deleted (force)

⚠️ 注意:强制删除不会等待优雅终止周期完成,可能会导致数据不一致或服务中断,使用时需谨慎。

2.3 缩容 Deployment 副本数至 0

在实际生产环境中,Pod 通常由 Deployment 管理。如果我们想一次性停止某个 Deployment 下的所有 Pod,可以将其副本数缩容为 0:

$ kubectl scale deployment my-deployment --replicas=0
deployment.apps/my-deployment scaled

随后可以使用以下命令验证 Pod 是否已全部停止:

$ kubectl get pods

✅ 优点:

  • 无需逐个删除 Pod
  • 可随时恢复(重新扩容副本数)
  • 适用于大规模部署场景

3. 暂停 Pod

在 Docker 中,我们可以使用 docker pause 命令暂停容器进程。但在 Kubernetes 中,并没有原生支持暂停 Pod的功能。Pod 是一个运行状态的最小单元,要么运行,要么终止。

不过,我们可以通过一些变通方式来实现“暂停”效果。

3.1 应用层自定义逻辑控制

我们可以在应用代码中加入控制逻辑,通过开关控制是否执行业务逻辑。

例如,定义一个配置项:

env:
- name: PROCESSING_ENABLED
  value: "true"

然后在代码中根据该配置决定是否执行处理逻辑:

if (Boolean.parseBoolean(System.getenv("PROCESSING_ENABLED"))) {
    startProcessing();
} else {
    pauseProcessing();
}

✅ 优点:

  • 控制粒度细
  • 不依赖 Kubernetes 原生功能
  • 可与配置中心联动实现动态控制

3.2 修改 Service 的 Pod Selector

我们可以通过修改 Service 的 selector 标签,使其不再匹配目标 Pod,从而阻止流量进入这些 Pod

例如,我们原本的 Service 配置如下:

selector:
  app: data-processor

暂停时可以将其修改为:

selector:
  app: data-processor-paused

这样,Service 就不会再将请求转发给原本的 Pod。维护结束后再改回原来的标签即可恢复流量。

✅ 优点:

  • 无需修改应用代码
  • 实现简单,适合临时维护场景
  • 可用于灰度发布、蓝绿部署等策略

4. 小结

本文我们介绍了 Kubernetes 中停止 Pod 的几种方法:

方法 描述 是否推荐
kubectl delete 删除单个 Pod ⚠️ 仅适用于无 Deployment 管理的 Pod
kubectl delete --force 强制删除 Pod ⚠️ 用于异常 Pod,谨慎使用
kubectl scale --replicas=0 缩容 Deployment 副本数 ✅ 推荐用于生产环境
自定义应用逻辑 通过开关控制处理逻辑 ✅ 适用于需要动态控制的场景
修改 Service Selector 阻止流量进入 Pod ✅ 适用于临时维护

对于暂停 Pod 的需求,虽然 Kubernetes 本身不支持,但我们可以结合应用逻辑或 Service 配置来实现类似效果。

📌 踩坑提醒:不要在生产环境中随意使用 kubectl delete --force,除非确认该 Pod 已无法正常终止。建议优先使用 Deployment 缩容机制,避免直接操作 Pod。


原始标题:How to Stop/Pause a Pod in Kubernetes