如何转储正在运行的 kubelet 的 goroutine 堆栈竞争

kubernetes比较复杂,kubelet在某些场景下长时间运行后会出现死锁。


有没有办法转储正在运行的 kubelet 的 goroutine 堆栈跟踪?


如下的预期输出对于调试 kubelet 的死锁类型问题非常有帮助。


goroutine 386 [chan send, 1140 minutes]:

k8s.io/kubernetes/pkg/kubelet/pleg.(*GenericPLEG).relist(0xc42069ea20)

    /workspace/anago-v1.11.5-beta.0.24+753b2dbc622f5c/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s.io/kubernetes/pkg/kubelet/pleg/generic.go:261 +0x74e

k8s.io/kubernetes/pkg/kubelet/pleg.(*GenericPLEG).(k8s.io/kubernetes/pkg/kubelet/pleg.relist)-fm()

    /workspace/anago-v1.11.5-beta.0.24+753b2dbc622f5c/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s.io/kubernetes/pkg/kubelet/pleg/generic.go:130 +0x2a

k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait.JitterUntil.func1(0xc4212ee520)

    /workspace/anago-v1.11.5-beta.0.24+753b2dbc622f5c/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go:133 +0x54

k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait.JitterUntil(0xc4212ee520, 0x3b9aca00, 0x0, 0x1, 0xc420056540)

    /workspace/anago-v1.11.5-beta.0.24+753b2dbc622f5c/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go:134 +0xbd

k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait.Until(0xc4212ee520, 0x3b9aca00, 0xc420056540)

    /workspace/anago-v1.11.5-beta.0.24+753b2dbc622f5c/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s.io/kubernetes/vendor/k8s.io/apimachinery/pkg/util/wait/wait.go:88 +0x4d

created by k8s.io/kubernetes/pkg/kubelet/pleg.(*GenericPLEG).Start

    /workspace/anago-v1.11.5-beta.0.24+753b2dbc622f5c/src/k8s.io/kubernetes/_output/dockerized/go/src/k8s.io/kubernetes/pkg/kubelet/pleg/generic.go:130 +0x88


我很感激任何人都可以分享关于如何转储 kubelet 的 goroutine 堆栈竞争的经验,就像 docker 提供的那样[1]


$ pkill -SIGUSR1 dockerd

[1]. https://success.docker.com/article/how-to-dump-goroutines-stacktraces


慕哥9229398
浏览 101回答 1
1回答

一只斗牛犬

pprof,它将保持 kubelet 运行在node-x上安装go在一个终端中运行“kubectl proxy”卷曲 http://localhost:8001/api/v1/proxy/nodes/node-x/debug/pprof/goroutine?debug=2注意:API针对不同的k8s版本进行了更改,对于1.16,它是curl http://127.0.0.1:8001/api/v1/nodes/node-**/proxy/debug/pprof/goroutine?debug=2向 kubelet 发送信号,导致 kubelet 退出并出现堆栈转储杀死-SIGABRT
打开App,查看更多内容
随时随地看视频慕课网APP