使用 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 可以访问节点的根文件系统,该文件系统在 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
注意
如果节点已关闭(与网络断开连接,或者 kubelet 死亡并且不会重启等),则 `kubectl debug node` 命令将不起作用。请查看在这种情况下 调试已关闭/无法访问的节点。上次修改时间:2024 年 6 月 27 日上午 8:48 PST:添加有关调试配置文件的说明 (0c8a63f4a2)