用 Kubectl 调试 Kubernetes 节点
你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:
你的 Kubernetes 服务器版本必须不低于版本 1.2. 要获知版本信息,请输入 kubectl version
.
你需要有权限创建 Pod 并将这些新 Pod 分配到任意节点。 你还需要被授权创建能够访问主机上文件系统的 Pod。
使用 kubectl debug node
命令将 Pod 部署到要排查故障的节点上。 此命令在你无法使用 SSH 连接节点时比较有用。 当 Pod 被创建时,Pod 会在节点上打开一个交互的 Shell。 要在名为 “mynode” 的节点上创建一个交互式 Shell,运行:
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
、、ping
和 ps
等等。 你还可以从各种包管理器安装 mtr
、tcpdump
和 curl
等其他工具。
说明:
用于调试的 Pod 可以访问节点的根文件系统,该文件系统挂载在 Pod 中的 /host
路径。 如果你在 filesystem 名字空间中运行 kubelet, 则正调试的 Pod 将看到此名字空间的根,而不是整个节点的根。 对于典型的 Linux 节点,你可以查看以下路径找到一些重要的日志:
/host/var/log/kubelet.log
负责在节点上运行容器的 kubelet
所产生的日志。
/host/var/log/kube-proxy.log
负责将流量导向到 Service 端点的 所产生的日志。
/host/var/log/containerd.log
/host/var/log/syslog
显示常规消息以及系统相关信息。
/host/var/log/kern.log
显示内核日志。
当在节点上创建一个调试会话时,需谨记:
kubectl debug
根据节点的名称自动生成新 Pod 的名称。- 尽管容器运行在主机 IPC、Network 和 PID 名字空间中,但 Pod 没有特权。 这意味着读取某些进程信息可能会失败,这是因为访问这些信息仅限于超级用户 (superuser)。 例如,
chroot /host
将失败。如果你需要一个有特权的 Pod,请手动创建。
当你使用正调试的 Pod 完成时,将其删除:
NAME READY STATUS RESTARTS AGE
node-debugger-mynode-pdx84 0/1 Completed 0 8m1s
如果节点停机(网络断开或 kubelet 宕机且无法启动等),则 kubectl debug node
命令将不起作用。 这种情况下请检查。