Kubernetes組件問題排查的一些方法
本文轉(zhuǎn)載自微信公眾號(hào)「運(yùn)維開發(fā)故事」,作者 喬克 。轉(zhuǎn)載本文請(qǐng)聯(lián)系運(yùn)維開發(fā)故事公眾號(hào)。
Kubernetes的基礎(chǔ)組件就像一棟房子的地基,它們的重要性不言而喻。作為Kubernetes集群的維護(hù)者,經(jīng)常會(huì)遇到組件的問題,那平時(shí)是怎么去定位解決的呢?
這里簡(jiǎn)要分析一下我的排查思路。
- 通過集群的狀態(tài),找到故障的節(jié)點(diǎn)或者組件
- 分析組件的日志
- 使用pprof分析組件的具體性能
確定范圍
Kubernetes的基礎(chǔ)組件不多,而且部署也非常簡(jiǎn)單,所以在定義范圍的時(shí)候還是很容易的,比如我們?cè)谑褂胟ubectl get nodes的時(shí)候,如果某個(gè)節(jié)點(diǎn)的狀態(tài)是NotReady,我們腦海中是不是會(huì)出現(xiàn)兩種可能?
(1)節(jié)點(diǎn)的kubelet組件有問題
(2)節(jié)點(diǎn)的網(wǎng)絡(luò)組件有問題
這樣一來,大體方向已經(jīng)確定了,然后就是做排除法了。
這里為何說是排除法?因?yàn)樵诮鉀Q問題的途中,我們通常會(huì)采用先假設(shè)再驗(yàn)證的方式進(jìn)行,先把所以可能的因素列出來,然后一個(gè)一個(gè)的去驗(yàn)證去排除,直到解決問題。
分析日志
日志分析是故障排查最直接的方式,大部分問題都能從日志里體現(xiàn)出來,Kubernetes的組件日志查看方式通常有兩種:
- 通過systemd啟動(dòng)的服務(wù),使用journalctl -l -u xxxx
- 使用靜態(tài)pod啟動(dòng)的服務(wù),使用kubectl logs -n kube-system $PODNAME --tail 100
當(dāng)然,很多時(shí)候不僅僅是分析它本身的問題,我們還會(huì)關(guān)注周邊的問題,比如基礎(chǔ)設(shè)施的CPU、內(nèi)存、IO等情況,這樣進(jìn)行綜合考慮來找出問題。
性能分析
為什么把性能分析放到最后呢?
對(duì)于大部分人來說,并不擅長(zhǎng),也不喜歡分析組件的性能。第一是時(shí)間比較長(zhǎng),第二是要對(duì)各個(gè)性能指標(biāo)有一定的了解,第三是學(xué)習(xí)成本比較大。
眾所周知,Kubernetes的版本迭代比較快,基本一年會(huì)發(fā)2-3個(gè)版本,如此快的迭代速度,不排除一些版本中存在BUG,存在一些性能問題。所以在實(shí)在沒招的情況下,可以嘗試對(duì)其組件的性能進(jìn)行分析。
Kubernetes是使用Golang開發(fā),而Golang的pprof是性能分析的利器,提供交互式界面和UI圖形化,比較直觀,可以很方便的找出問題。除此之外,還可以使用go-torch將profile數(shù)據(jù)生成火焰圖,這樣會(huì)更直觀。
Kubernetes的組件都可以使用pprof進(jìn)行性能分析,界面在host:port/debug/pprof/。
pprof的常用方式
使用交互式命令
查看堆棧調(diào)用信息
- go tool pprof http://localhost:8001/debug/pprof/heap
查看 30 秒內(nèi)的 CPU 信息
- go tool pprof http://localhost:8001/debug/pprof/profile?seconds=30
查看 goroutine 阻塞
- go tool pprof http://localhost:8001/debug/pprof/block
收集 5 秒內(nèi)的執(zhí)行路徑
- go tool pprof http://localhost:8001/debug/pprof/trace?seconds=5
互斥持有者的堆棧跟蹤
- go tool pprof http://localhost:8001/debug/pprof/mutex
通過UI界面
UI分析工具使用起來相對(duì)比較麻煩,我們需要先導(dǎo)出文件,然后再使用go tool工具起服務(wù)進(jìn)行分析。
比如我們導(dǎo)出kube-scheduler的堆棧信息。
- curl -sK -v http://localhost:10251/debug/pprof/heap > heap.out
然后使用go tool工具起一個(gè)服務(wù),如下:
- go tool pprof -http=0.0.0.0:8989 heap.out
然后就可以在瀏覽器上看到具體的堆棧信息圖了。
注意,這里需要在服務(wù)端安裝graphviz組件,各種操作系統(tǒng)的安裝方式見[3]。
UI界面主要的菜單以及其功能簡(jiǎn)要介紹如下:
- VIEW:查看模式
- Top:從高到底排序查看
- Graph:默認(rèn)的模式,以關(guān)系圖形式查看
- Flame Graph:以火焰圖形式查看
- Peek:排序查看,展示的信息更多
- Source:排序查看,帶源碼標(biāo)注
- Disassemble:現(xiàn)實(shí)所有總量
- SAMPLE:為VIEW提供查看模式
- alloc_objects:已分配的對(duì)象總量(不管是否已釋放
- alloc_space:已分配的內(nèi)存總量(不管是否已釋放)
- inuse_objects:已分配但尚未釋放的對(duì)象數(shù)量
- inuse_sapce:已分配但尚未釋放的內(nèi)存數(shù)量
- REFINE:提供篩選能力
上面簡(jiǎn)單介紹了pprof的基本使用方法,下面就Kubernetes的各個(gè)組件進(jìn)行簡(jiǎn)單的分析,這里只就CPU信息進(jìn) 行獲取以及展示。
注意:由于版本原因,有的版本默認(rèn)開啟了pprof,有的版本則沒有,如果沒有開啟的,需要自行去開啟,參數(shù)基本都是profiling: true,具體的信息可以到官網(wǎng)進(jìn)行查看[4]。
分析kube-apiserver
(1)使用kubectl proxy啟動(dòng)一個(gè)代理
- kubectl proxy
(2)另起一個(gè)終端,獲取CPU信息
- curl -sK -v http://localhost:8001/debug/pprof/profile >apiserver-cpu.out
(3)使用go tool工具啟動(dòng)服務(wù)
- go tool pprof -http=0.0.0.0:8989 apiserver-cpu.out
(4)在瀏覽器上進(jìn)行查看
分析kube-scheduler
(1)獲取CPU的信息
- curl -sK -v http://localhost:10251/debug/pprof/profile >scheduler-cpu.out
(2)使用go tool工具啟動(dòng)服務(wù)
- go tool pprof -http=0.0.0.0:8989 scheduler-cpu.out
(3)在瀏覽器進(jìn)行查看
分析kube-controller-manager
(1)獲取CPU的信息
- curl -sK -v http://localhost:10252/debug/pprof/profile >controller-cpu.out
(2)使用go tool工具啟動(dòng)服務(wù)
- go tool pprof -http=0.0.0.0:8989 controller-cpu.out
(3)在瀏覽器進(jìn)行查看
分析kubelet
(1)使用kubectl proxy啟動(dòng)一個(gè)代理
- kubectl proxy
(2)另起一個(gè)終端,獲取CPU信息
- curl -sK -v http://127.0.0.1:8001/api/v1/nodes/k8s-node04-138/proxy/debug/pprof/profile >kubelet-cpu.out
(3)使用go tool工具啟動(dòng)服務(wù)
- go tool pprof -http=0.0.0.0:8989 kubelet-cpu.out
(4)在瀏覽器上進(jìn)行查看
能夠抓到具體的性能數(shù)據(jù)才是第一步,后續(xù)的具體分析才會(huì)幫助我們找到問題。
文檔
[1] https://github.com/google/pprof
[2] https://github.com/uber-archive/go-torch
[3] http://www.graphviz.org/download/#linux
[4] https://kubernetes.io/zh/docs/reference/command-line-tools-reference/kube-apiserver/