使用 Kubectl 调试 Kubernetes 节点

本页介绍如何使用 kubectl debug 命令调试在 Kubernetes 集群上运行的节点

准备开始

你需要有一个 Kubernetes 集群,并且必须配置 kubectl 命令行工具以与你的集群通信。建议在至少有两个非控制平面主机的节点上运行本教程。如果你还没有集群,可以使用 minikube 创建一个,或者你可以使用这些 Kubernetes 游乐场之一

你的 Kubernetes 服务器版本必须为 1.2 或更高版本。要检查版本,请输入 kubectl version

你需要拥有创建 Pod 以及将这些新 Pod 分配给任意节点的权限。你还需要被授权创建可以访问主机文件系统的 Pod。

使用 kubectl debug node 调试节点

使用 kubectl debug node 命令将 Pod 部署到你想要进行故障排除的节点。此命令在你无法使用 SSH 连接访问节点的情况下非常有用。当 Pod 创建时,Pod 会在该节点上打开一个交互式 shell。要在名为“mynode”的节点上创建一个交互式 shell,请运行

kubectl debug node/mynode -it --image=ubuntu
Creating debugging pod node-debugger-mynode-pdx84 with container debugger on node mynode.
If you don't see a command prompt, try pressing enter.
root@mynode:/#

debug 命令有助于收集信息并解决问题。你可能使用的命令包括 ipifconfigncpingps 等。你还可以从相应的软件包管理器安装其他工具,例如 mtrtcpdumpcurl

调试 Pod 可以访问节点的根文件系统,该文件系统在 Pod 中挂载在 /host。如果你在文件系统命名空间中运行 kubelet,则调试 Pod 会看到该命名空间的根目录,而不是整个节点的根目录。对于典型的 Linux 节点,你可以查看以下路径以查找相关日志

/host/var/log/kubelet.log
来自 kubelet 的日志,负责在节点上运行容器。
/host/var/log/kube-proxy.log
来自 kube-proxy 的日志,负责将流量定向到 Service 端点。
/host/var/log/containerd.log
来自节点上运行的 containerd 进程的日志。
/host/var/log/syslog
显示有关系统的常规消息和信息。
/host/var/log/kern.log
显示内核日志。

在节点上创建调试会话时,请记住

  • kubectl debug 会根据节点的名称自动生成新 Pod 的名称。
  • 节点的根文件系统将挂载在 /host
  • 虽然容器在主机 IPC、网络和 PID 命名空间中运行,但 Pod 不是特权的。这意味着读取某些进程信息可能会失败,因为对该信息的访问仅限于超级用户。例如,chroot /host 将失败。如果你需要一个特权 Pod,请手动创建它或使用 --profile=sysadmin 标志。
  • 通过应用调试配置文件,你可以为调试 Pod 设置特定的属性,例如 securityContext

清理

使用完调试 Pod 后,删除它

kubectl get pods
NAME                          READY   STATUS       RESTARTS   AGE
node-debugger-mynode-pdx84    0/1     Completed    0          8m1s
# Change the pod name accordingly
kubectl delete pod node-debugger-mynode-pdx84 --now
pod "node-debugger-mynode-pdx84" deleted
上次修改时间为 2024 年 6 月 27 日上午 8:48 PST:添加有关调试配置文件的描述 (0c8a63f4a2)