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