不要记录来自 kubelet 的堆栈跟踪

不要记录来自 kubelet 的堆栈跟踪

我的 Kubernetes 节点出了点问题,但很难调试,因为我得到了一页又一页的堆栈跟踪,比如

Nov 13 10:55:51 corona kubelet[29656]:         /workspace/anago-v1.19.4-rc.0.51+5f1e5cafd33a88/src/k8s.io/kubernetes/_ou
Nov 13 10:55:51 corona kubelet[29656]: k8s.io/kubernetes/vendor/k8s.io/client-go/tools/cache.(*Reflector).Run(0xc000040f
Nov 13 10:55:51 corona kubelet[29656]:         /workspace/anago-v1.19.4-rc.0.51+5f1e5cafd33a88/src/k8s.io/kubernetes/_ou
Nov 13 10:55:51 corona kubelet[29656]: created by k8s.io/kubernetes/pkg/kubelet/config.newSourceApiserverFromLW
Nov 13 10:55:51 corona kubelet[29656]:         /workspace/anago-v1.19.4-rc.0.51+5f1e5cafd33a88/src/k8s.io/kubernetes/_ou
Nov 13 10:55:51 corona kubelet[29656]: goroutine 244 [select]:
Nov 13 10:55:51 corona kubelet[29656]: k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait.contextForChannel.func
Nov 13 10:55:51 corona kubelet[29656]:         /workspace/anago-v1.19.4-rc.0.51+5f1e5cafd33a88/src/k8s.io/kubernetes/_ou
Nov 13 10:55:51 corona kubelet[29656]: created by k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait.contextForC
Nov 13 10:55:51 corona kubelet[29656]:         /workspace/anago-v1.19.4-rc.0.51+5f1e5cafd33a88/src/k8s.io/kubernetes/_ou
Nov 13 10:55:51 corona kubelet[29656]: goroutine 205 [sync.Cond.Wait]:
Nov 13 10:55:51 corona kubelet[29656]: runtime.goparkunlock(...)
Nov 13 10:55:51 corona kubelet[29656]:         /usr/local/go/src/runtime/proc.go:312
Nov 13 10:55:51 corona kubelet[29656]: sync.runtime_notifyListWait(0xc000b140c8, 0x1)
Nov 13 10:55:51 corona kubelet[29656]:         /usr/local/go/src/runtime/sema.go:513 +0xf8
Nov 13 10:55:51 corona kubelet[29656]: sync.(*Cond).Wait(0xc000b140b8)
Nov 13 10:55:51 corona kubelet[29656]:         /usr/local/go/src/sync/cond.go:56 +0x9d
Nov 13 10:55:51 corona kubelet[29656]: k8s.io/kubernetes/vendor/k8s.io/client-go/tools/cache.(*DeltaFIFO).Pop(0xc000b140
Nov 13 10:55:51 corona kubelet[29656]:         /workspace/anago-v1.19.4-rc.0.51+5f1e5cafd33a88/src/k8s.io/kubernetes/_ou
Nov 13 10:55:51 corona kubelet[29656]: k8s.io/kubernetes/vendor/k8s.io/client-go/tools/cache.(*controller).processLoop(0
Nov 13 10:55:51 corona kubelet[29656]:         /workspace/anago-v1.19.4-rc.0.51+5f1e5cafd33a88/src/k8s.io/kubernetes/_ou
Nov 13 10:55:51 corona kubelet[29656]: k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait.BackoffUntil.func1(0xc
Nov 13 10:55:51 corona kubelet[29656]:         /workspace/anago-v1.19.4-rc.0.51+5f1e5cafd33a88/src/k8s.io/kubernetes/_ou
Nov 13 10:55:51 corona kubelet[29656]: k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait.BackoffUntil(0xc000def
Nov 13 10:55:51 corona kubelet[29656]:         /workspace/anago-v1.19.4-rc.0.51+5f1e5cafd33a88/src/k8s.io/kubernetes/_ou
Nov 13 10:55:51 corona kubelet[29656]: k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait.JitterUntil(0xc000defe
Nov 13 10:55:51 corona kubelet[29656]:         /workspace/anago-v1.19.4-rc.0.51+5f1e5cafd33a88/src/k8s.io/kubernetes/_ou
Nov 13 10:55:51 corona kubelet[29656]: k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait.Until(...)

我尝试-v=0在 systemd 单元文件中添加 kubelet 命令,但它仍然在喷涌。我查看了一下,/var/lib/kubelet/config.yaml它显示logging: {}。我不确定是否可以在其中添加一些东西来让它更安静。

有什么方法可以告诉 kubelet 跳过堆栈跟踪?跟踪之前的错误消息很有帮助,但在噪音中很难找到。

答案1

首先检查是否存在用于运行 kubelet 的任何配置文件或环境变量。

最佳检查方法:

1. 检查 kubelet 进程(例如 ps -ef | grep kubelet)以查看所有参数

2. 如果 kubelet 使用动态配置,请检查 Kube-system 中的 ConfigMap kubelet-config-1.18,看看是否按你的需要指定了 cgroupDriver 3.如果您使用 运行 kubelet systemd,那么您可以使用以下方法查看 kubelet 的日志:

# journalctl -u kubelet

看:系统组件日志

查看如何缩小日志范围的示例:管理-日志-kubernetes

错误failed to run Kubelet: misconfiguration: kubelet cgroup driver: "cgroupfs" is different from docker cgroup driver: "systemd"是由于 Kubelet 中使用的 Cgroup 驱动程序造成的。Kubelet 和 Docker 应该使用 Systemd 驱动程序或 Cgroupfs 运行。建议使用 Systemd。

检查工作节点文件/var/lib/kubelet/kubeadm-flags.env,看看KUBELET_KUBEADM_ARGS是否有--cgroup-driver=cgroupfs标志。将其更改为systemd,kubelet 将再次开始工作。

看一看: kubelete-cgroupfs-驱动程序kubelet-cgroupfs

也可以看看:kubelet 运行时恐慌

答案2

堆栈跟踪来自 kubelet 调用中的代码panic,这是一个 Golang 例程,它从所有线程转储堆栈跟踪并以非成功退出代码终止程序。

除了不调用代码外,没有其他方法可以避免堆栈跟踪panic。通常,恐慌表示程序已进入意外状态,堆栈跟踪将帮助程序员调试问题。

在这种情况下,至少部分恐慌来自已知错误。程序以不正确的配置启动。没有办法缩短或避免堆栈跟踪输出。可能应该更正 kubelet 代码,使其干净地退出并显示错误,而不是在问题明显的情况下恐慌。

从操作员的角度来看,唯一能做的就是找到恐慌的第一行,它通常包含可读的错误消息,看看是否可以解决它。

相关内容