1. 简介

Kubernetes 是用于有序管理容器部署的平台,具备冗余和部署控制等高级功能。在 Kubernetes 中,最小可管理单元是 Pod,而 Pod 可能包含一个或多个容器。

本文将探讨如何在 Kubernetes 集群中重启 Pod 和容器。我们将从创建一个包含两个容器的 Pod 开始,接着介绍如何在 Deployment 中重启 Pod,如何单独重启一个 Pod,最后探讨三种重启 Pod 内部单个容器的方法。

测试环境为 Debian 12 (Bookworm) + GNU Bash 5.2.15,除非另有说明,应适用于大多数 POSIX 兼容环境。


2. 示例 Kubernetes Pod

我们先从创建一个包含多个容器的 Pod 开始,以理解 Kubernetes 的最小单元。

以下是一个包含两个容器的 Pod 定义:

$ printf '
apiVersion: v1
kind: Pod
metadata:
  name: compod
spec:
  containers:
  - name: deb1
    image: debian:latest
    command: ["bash"]
    tty: true
  - name: deb2
    image: debian:latest
    command: ["bash"]
    tty: true
' | kubectl apply --filename=-
pod/compod created

这个 Pod 包含两个容器:deb1deb2,都运行 bash 并保持运行状态(通过 tty: true)。

验证 Pod 状态:

$ kubectl get pod/compod
NAME     READY   STATUS    RESTARTS   AGE
compod   2/2     Running   0          1m

查看 Pod 中的容器列表:

$ kubectl get pod/compod --output=jsonpath='{.spec.containers[*].name}'
deb1 deb2

3. 在 Deployment 中重启 Pod

Deployment 通常通过 ReplicaSet 管理 Pod 副本,重启 Pod 的方式有以下两种。

3.1. 删除 Pod 触发重启

Deployment 会确保副本数量,删除 Pod 后会自动重建:

$ kubectl delete pods --selector=app=ox

Kubernetes 会自动创建新 Pod 替代被删除的旧 Pod。

⚠️ 注意:这种方式会触发所有匹配的 Pod 重启,适用于需要批量重启的场景。

3.2. 使用 rollout restart

通过 rollout restart 可以重启整个 Deployment 的所有 Pod:

$ kubectl rollout restart deployment comdep

✅ 优点:操作简单
❌ 缺点:影响范围大,适用于整体更新或重启场景


4. 单独重启 Pod

若 Pod 不属于任何 Deployment,可使用以下方式重启:

$ kubectl get pod/compod --output=YAML | kubectl replace --force --filename=-

✅ 原理:获取 Pod 的 YAML 定义并强制替换,相当于重建 Pod
⚠️ 注意:Pod 必须是非控制器管理的(即非 Deployment、DaemonSet 等)


5. 重启 Pod 内部容器

Kubernetes 没有直接提供“重启单个容器”的命令,但可以通过以下三种方式间接实现。

5.1. 使用 exec 命令杀死容器进程

$ kubectl exec --tty --stdin --pod=pod/compod --container=deb1 -- killall5

✅ 原理:通过 exec 进入容器并杀死所有进程,触发容器重启
⚠️ 注意:容器必须支持 killall5 命令

5.2. 通过交互式 Shell 操作

$ kubectl exec --tty --stdin --pod=pod/compod --container=deb1 -- sh

✅ 原理:进入容器执行任意命令,适合调试或手动重启
❌ 缺点:并非所有容器都提供 shell

5.3. 使用调试容器注入工具

当容器中没有 shell 或 kill 命令时,可注入一个临时调试容器:

$ kubectl debug --tty --stdin --pod=pod/compod --image=debian:latest --target=deb1 -- killall5

✅ 原理:创建一个临时容器并执行命令,不影响原容器状态
✅ 优点:无需修改原容器镜像
⚠️ 注意:需要 Kubernetes v1.16+ 支持


6. 总结

场景 方法 特点
Deployment 中重启 Pod kubectl delete pods --selector=...kubectl rollout restart 适合批量重启
独立 Pod 重启 `kubectl get pod -o YAML kubectl replace --force`
单个容器重启 kubectl exec -- killall5 需要容器支持命令
容器调试 kubectl exec -- sh 适合手动操作
无命令容器重启 kubectl debug --image=... 适用于调试或注入工具

建议:

  • 若 Pod 属于 Deployment,优先使用 deleterollout
  • 若需精确控制某个容器,考虑使用 execdebug 方式
  • 避免对非控制器管理的 Pod 做频繁重启,除非必要

通过本文介绍的方法,你可以灵活地在 Kubernetes 中控制 Pod 和容器的生命周期,提升运维效率并减少误操作风险。


原始标题:Kubernetes Pod and Container Restarting