使用 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:/#

调试命令有助于收集信息和排除故障。您可能使用的命令包括 `ip`、`ifconfig`、`nc`、`ping` 和 `ps` 等。您还可以从相应的包管理器安装其他工具,例如 `mtr`、`tcpdump` 和 `curl`。

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

/host/var/log/kubelet.log
来自 `kubelet` 的日志,负责在节点上运行容器。
/host/var/log/kube-proxy.log
来自 `kube-proxy` 的日志,负责将流量定向到服务端点。
/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` 标志。
  • 通过应用 调试配置文件,您可以将特定属性(如 securityContext)设置为调试 Pod。

清理

使用完调试 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)