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

调试命令有助于收集信息和排查问题。您可能使用的命令包括 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。

清理

完成使用调试 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:添加有关调试配置文件的说明 (0c8a63f4a2)