使用 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 创建后,它会在该节点上打开一个交互式 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 的日志,kubelet 负责在节点上运行容器。
/host/var/log/kube-proxy.log
kube-proxy 的日志,kube-proxy 负责将流量导向 Service endpoint。
/host/var/log/containerd.log
节点上运行的 containerd 进程的日志。
/host/var/log/syslog
显示有关系统的通用消息和信息。
/host/var/log/kern.log
显示内核日志。

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

  • kubectl debug 会根据节点名称自动生成新 Pod 的名称。
  • 节点的根文件系统将挂载在 /host
  • 尽管容器运行在主机的 IPC、Network 和 PID 命名空间中,但该 Pod 没有特权。这意味着读取某些进程信息可能会失败,因为这些信息的访问权限仅限于超级用户。例如,chroot /host 将会失败。如果你需要一个特权 Pod,请手动创建它或使用 --profile=sysadmin 标志。
  • 通过应用调试配置文件(Debugging Profiles),你可以为调试 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:添加关于调试配置文件的描述 (0c8a63f4a2)