使用 Kubectl 调试 Kubernetes 节点

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

准备工作

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

你的 Kubernetes 服务器版本必须是 1.2 或更高。

要检查版本,请输入 kubectl version

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

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

调试命令有助于收集信息和排除问题。你可能会使用的命令包括 ipifconfigncpingps 等。你还可以从相应的包管理器安装其他工具,例如 mtrtcpdumpcurl

调试 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 标志。
  • 通过应用调试配置文件,你可以为调试 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)