3. kubectl debug 简介:用途、基本语法与核心区别

在 Kubernetes 故障排查中,kubectl debug 是 1.20 版本引入的官方调试命令,专为解决“容器内缺少调试工具”和“Pod 无法启动”两大痛点而设计。与传统的 kubectl exec 不同,kubectl debug 允许你通过创建临时容器(Ephemeral Container)或复制 Pod 的方式,在不影响原容器运行状态的前提下,注入完整的调试环境。

3.1 命令用途与适用场景

kubectl debug 的核心价值在于:当目标容器不可达、无 Shell、或缺少必要工具(如 curl、tcpdump、strace)时,仍能进行故障排查。它主要解决以下三类场景:

  • 场景一:容器已崩溃或无法启动 —— 通过复制 Pod 并替换镜像,在相同配置下启动一个可交互的调试容器。
  • 场景二:容器内无 Shell 或工具链 —— 使用 --image 参数注入一个包含完整调试工具集的临时容器。
  • 场景三:需要隔离调试,避免影响生产流量 —— 临时容器不会重启原 Pod,调试过程对业务无感。
最佳实践: 在故障域划分中,kubectl debug 常用于“资源模型排错”的第三步——验证 Pod 内部网络连通性、DNS 解析、存储挂载状态。它让你在“怀疑网络策略”或“怀疑镜像配置”之前,先确认容器内部环境是否正常。

3.2 基本语法与常用参数

kubectl debug 的基本语法结构如下:

kubectl debug (POD | TYPE[[.VERSION].GROUP]/NAME) [--command] [ARG...] [flags]

常用参数及其说明:

参数 类型 说明
--image string 指定调试容器的镜像,默认使用 busybox 或 nicolaka/netshoot
--target string 指定临时容器附加到的目标容器名称(多容器 Pod 时必用)
--copy-to string 复制 Pod 并重命名,用于调试无法启动的 Pod
--replace bool 调试完成后是否删除原 Pod(与 --copy-to 配合使用)
--share-processes bool 是否与目标容器共享 PID 命名空间(默认 false)
--command bool 后面跟随的命令作为容器入口点执行,而非默认的 /bin/sh

典型用法示例:

# 在运行中的 Pod 内启动临时调试容器(注入 netshoot 镜像)
kubectl debug my-pod -n my-namespace --image=nicolaka/netshoot

# 调试无法启动的 Pod(复制并替换镜像为 busybox)
kubectl debug my-pod -n my-namespace --copy-to=my-pod-debug --image=busybox -- /bin/sh

# 多容器 Pod 中指定目标容器
kubectl debug my-pod -n my-namespace --target=app-container --image=nicolaka/netshoot

3.3 kubectl debug 与 kubectl exec 的核心区别

两者虽然都用于进入容器执行命令,但在设计理念、适用场景和权限模型上有本质差异。下表从 7 个维度进行对比:

对比维度 kubectl exec kubectl debug
核心机制 在已有容器内执行命令 创建临时容器或复制 Pod 后执行命令
容器状态要求 容器必须处于 Running 状态 支持 CrashLoopBackOff、Init:Error 等非运行状态
工具依赖 依赖容器镜像内置工具 可注入任意调试镜像,不依赖原容器
对原容器影响 直接进入进程命名空间,可能影响业务 临时容器独立运行,不重启原 Pod
网络命名空间 共享原容器的网络栈 默认共享,也可通过 --copy-to 独立
权限要求 需要 pods/exec 子资源权限 需要 pods/ephemeralcontainers 或 pods/exec 权限
适用版本 所有版本 Kubernetes 1.20+(Ephemeral Containers 特性门控)
常见误区: 很多运维人员习惯用 kubectl exec -it 进入容器,但当容器内没有 /bin/bash 或 /bin/sh 时,exec 会直接失败。此时应改用 kubectl debug 并指定 --image 参数,注入一个包含 Shell 的调试容器。

3.4 两种调试模式的架构对比

下图展示了 kubectl exec 与 kubectl debug 在 Pod 内部的工作机制差异:

kubectl exec vs kubectl debug 工作机制对比 kubectl exec 模式 Pod 主容器(app) 内置工具:curl, bash exec 直接进入 ⚠ 限制 容器必须 Running,依赖内置工具 kubectl debug 模式 Pod 主容器 (无 Shell) 临时容器 netshoot 共享网络 --copy-to 复制 Pod 并替换镜像 ✓ 优势 支持 CrashLoopBackOff,可注入任意工具

3.5 在故障域划分中的定位

在“故障域划分”的排错流程中,kubectl debug 通常位于第二层——容器内部域的排查环节。当第一层(集群基础设施域)确认节点和网络正常后,debug 命令帮助你快速验证:

  1. 容器进程是否存活 —— 通过 --copy-to 复制崩溃 Pod 并进入调试。
  2. 容器内网络连通性 —— 使用 netshoot 镜像测试 DNS、Service 访问、MTU 问题。
  3. 存储挂载是否正常 —— 检查 Volume 挂载点、文件权限、磁盘空间。
  4. 环境变量与配置 —— 验证 ConfigMap 和 Secret 是否正确注入。
排错口诀: “先 exec,不行再 debug;容器崩了用 copy-to,缺工具用 netshoot。” 在故障域划分中,debug 命令是连接“容器内部”和“集群外部”两个故障域的关键桥梁。