Kubernetes Pod應用性能分析工具 Kubectl Flame
什么是性能分析?
性能分析是分析應用程序性能以改善代碼段性能的行為。可視化配置文件并快速識別性能問題的最流行方法之一是生成 “火焰圖”。例如下圖

y軸是堆棧深度,x軸跨越樣本總體。每個矩形都是一個函數,其中的寬度表示它在配置文件中出現的頻率。從左到右的順序并不重要(堆棧按字母順序排序)。
在Kubernetes上如何分析應用性能?
應用性能分析是一項艱巨的任務。大多數探查器有兩個主要問題:
- 需要修改應用程序。通常,可以通過將標志添加到執行命令或將一些性能分析庫導入代碼中來實現。
- 由于在性能分析過程中會嚴重影響性能,因此通常避免在產品中進行性能分析。
在Kubernetes集群中運行的應用程序上執行分析時,甚至更加困難。需要部署一個包含配置文件修改的新容器映像,而不是當前正在運行的容器。此外,當應用程序重新啟動時,某些性能問題可能會消失,這使調試變得困難。
在Kubernetes應用性能分析解決方案?
Kubernetes 中可以使用 Kubectl Flame 分析 Pod 應用性能。Kubectl Flame 是一個kubectl插件,可以使在Kubernetes中運行的分析應用程序獲得流暢的體驗,而無需進行任何應用程序修改或停機。另外,kubectl flame的目標是通過最大程度地降低性能損失來實現生產友好。
源碼地址:https://github.com/VerizonMedia/kubectl-flame
運行原理
kubectl flame 在與目標容器相同的節點上啟動 Kubernetes Job。在后臺kubectl-flame使用async-profiler來為Java應用程序生成火焰圖。通過共享/tmp文件夾與目標JVM進行交互。Golang支持基于ebpf分析。Python支持基于py-spy。
使用要求
- 支持的語言:Go,Java(任何基于JVM的語言)和 Python
- 使用Docker作為容器運行時的Kubernetes集群(已在GKE,EKS和AKS上測試)
安裝
- $ kubectl krew install flame
使用
分析 Kubernetes Pod
分析 Java 應用 mypod 1分鐘,并在將火焰圖保存到 /tmp/flamegraph.svg
- $ kubectl flame mypod -t 1m --lang java -f /tmp/flamegraph.svg
分析基于 alpine 操作系統的容器
在基于 alpine 的容器中分析 Java 應用程序需要使用 --alpine 標志
- $ kubectl flame mypod -t 1m -f /tmp/flamegraph.svg --lang Java --alpine
注意:僅 Java 應用程序需要此 --alpine 標志,而 Go 分析則不需要該標志。
分析 sidecar 容器
包含多個容器的 Pod 需要將目標容器指定為參數
- $ kubectl flame mypod -t 1m --lang go -f /tmp/flamegraph.svg mycontainer
分析 Golang 多進程容器
在包含多個進程的Pod中對Go應用程序進行性能分析需要通過 --pgrep 標志指定目標進程名稱:
- $ kubectl flame mypod -t 1m --lang go -f /tmp/flamegraph.svg --pgrep go-app
Java分析假定進程名稱為java。--pgrep 如果您的進程名稱不同,請使用標志。
參考鏈接
https://github.com/VerizonMedia/kubectl-flame
https://blog.csdn.net/weixin_26746861/article/details/108935182