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