推薦一款Kubernetes應用性能分析工具Kubectl Flame
什么是性能分析?
性能分析是分析應用程序性能來改進代碼質量的常用方法,最流行的可視化性能分析方法是生成火焰圖。
基于 Spring 框架的 Java 應用的火焰圖
y軸是堆棧深度,x軸跨越樣本總體。每個矩形都是一個函數,其中寬度顯示它出現的頻率,從左到右的排序并不重要 (堆棧按字母順序排序)。
Kubernetes 上的性能分析
性能分析是一項較為復雜的任務,大多數探查器有兩個主要問題:
- 需要修改應用程序,通??梢酝ㄟ^將標志添加到執行命令或將一些性能分析庫導入代碼中來實現。
- 由于在分析過程中會嚴重影響性能,因此通常避免在生產環境中進行性能分析。
選擇正確的探查器可能會解決這些問題,但是這需要仔細去進行研究,并且通常取決于編程語言和操作系統。
在 Kubernetes 集群中運行的應用程序上執行分析時,會變得更加困難。需要部署一個包含配置文件修改的新容器鏡像,而不是當前正在運行的容器。此外,當應用程序重新啟動時,某些性能問題可能會消失,這就使得調試變得困難。
Kubectl flame
Kubectl Flame 是一個 kubectl 插件,可以以較低的開銷生成火焰圖🔥來分析應用程序性能,無需進行任何應用程序修改或停機。
項目倉庫地址:https://github.com/VerizonMedia/kubectl-flame
安裝
可以通過 Krew 來安裝 kubectl flame 插件,一旦安裝了 Krew,就可以通過如下命令進行安裝:
- $ kubectl krew install flame
使用要求
- 支持的語言:Go、Java(任何基于JVM的語言)、Python 和 Ruby
- 使用 Docker 作為容器運行時的 Kubernetes 集群(已在 GKE,EKS 和 AKS 上測試)
運行原理
kubectl-flame 通過在與目標容器相同的節點上啟動一個探查器來啟動性能分析,大多數探查器將與目標容器共享一些資源:比如通過將 hostPID 設置為 true 來啟用 PID 命名空間共享,通過掛載 /var/lib/docker 并查詢 overlayFS 來啟用文件系統共享。
在后臺kubectl-flame使用 async-profiler 來為 Java 應用程序生成火焰圖,通過共享/tmp文件夾與目標 JVM 進行交互,Golang 則支持基于 ebpf 分析,Python 支持基于 py-spy 進行分析。
kubectl flame 概述
使用實例
1. 分析 Kubernetes Pod
分析 Java 應用 mypod 1分鐘,并在將火焰圖保存到 /tmp/flamegraph.svg:
- $ kubectl flame mypod -t 1m --lang java -f /tmp/flamegraph.svg
2. 分析基于 alpine 的容器
在基于 alpine 的容器中分析 Java 應用程序需要使用 --alpine 標志:
- $ kubectl flame mypod -t 1m -f /tmp/flamegraph.svg --lang Java --alpine
注意:僅 Java 應用程序需要此 --alpine 標志,而 Go 分析則不需要該標志。
3. 分析 sidecar 容器
包含多個容器的 Pod 需要將目標容器指定為參數:
- $ kubectl flame mypod -t 1m --lang go -f /tmp/flamegraph.svg mycontainer
本文轉載自:「 k8s技術圈 」,原文:http://t.cn/A6t8p02V,版權歸原作者所有。歡迎投稿,投稿郵箱: editor@hi-linux.com。