手把手教你使用容器服務 TKE 叢集審計排查問題
阿新 • • 發佈:2020-11-09
## 概述
有時候,叢集資源莫名被刪除或修改,有可能是人為誤操作,也有可能是某個應用的 bug 或惡意程式呼叫 apiserver 介面導致,需要找出 "真凶"。這時候,我們需要為叢集開啟審計,記錄 apiserver 的介面呼叫,然後根據條件檢索和分析審計日誌來找到原因。
關於 TKE 的叢集審計簡介與基礎操作,請參考官方文件 [叢集審計](https://cloud.tencent.com/document/product/457/48346)。因為叢集審計的資料儲存在日誌服務,所以我們需要在日誌服務控制檯去對審計結果進行檢索和分析,檢索語法請參考 [日誌檢索語法與規則](https://cloud.tencent.com/document/product/614/47044),要進行分析就還需要寫日誌服務所支援的 SQL 語句,請參考 [日誌服務分析簡介](https://cloud.tencent.com/document/product/614/44061)。
> **注:** 本文僅適用於 TKE 叢集
## 場景示例
下面給出一些叢集審計使用場景和查詢的示例。
### 找出是誰做的操作
如果節點被封鎖了,不知道是哪個應用或人為操作的,需要查出來,可以在開啟叢集審計後,使用下面的語句來檢索:
```
objectRef.resource:nodes AND requestObject:unschedulable
```
版面設定可以設定顯示 `user.username`, `requestObject` 和 `objectRef.name` 三個欄位,分別表示做操作的使用者、請求內容以及節點名稱:
![img](https://img2020.cnblogs.com/other/2041406/202011/2041406-20201109180313701-1708864733.png)
從上圖可以看出,是 `10001****958` 這個子賬號在 `2020-10-09 16:13:22` 的時候對 `main.63u5qua9.0` 這臺節點進行了封鎖操作,我們在 [訪問管理-使用者-使用者列表](https://console.cloud.tencent.com/cam) 裡可以根據賬號 ID 找到關於這個子賬號的詳細資訊。
如果某個工作負載被刪除,想知道是誰刪除的,這裡以 `deployments/nginx` 為例來查詢:
```
objectRef.resource:deployments AND objectRef.name:"nginx" AND verb:"delete"
```
查詢結果:
![img](https://img2020.cnblogs.com/other/2041406/202011/2041406-20201109180314091-467911973.png)
### 揪出導致 apiserver 限頻的真凶
apiserver 會有預設的請求頻率限制保護,避免惡意程式或 bug 導致對 apiserver 請求頻率過高,使得 apiserver/etcd 負載過高,影響正常請求。如果發生了限頻,我們可以通過審計來找出到底是誰在發大量請求。
如果我們通過 userAgent 來分析統計請求的客戶端,首先需要修改下日誌主題的鍵值索引,為 userAgent 欄位開啟統計:
![img](https://img2020.cnblogs.com/other/2041406/202011/2041406-20201109180314527-770150573.png)
通過以下 SQL 語句進行統計每種客戶端請求 apiserver 的 QPS 大小:
```
* | SELECT CAST((__TIMESTAMP_US__ /1000-__TIMESTAMP_US__ /1000%1000) as TIMESTAMP) AS time, COUNT(1) AS qps,userAgent GROUP BY time,userAgent ORDER BY time
```
切換到圖示分析,選擇折線圖,X 軸用 time,Y 軸用 qps,聚合列使用 userAgent:
![img](https://img2020.cnblogs.com/other/2041406/202011/2041406-20201109180314800-1641221187.png)
可以看到查到資料了,但可能結果太多,小面板顯示不下,點選新增到儀表盤,放大顯示:
![img](https://img2020.cnblogs.com/other/2041406/202011/2041406-20201109180315322-456695615.png)
此例中可以看到 kube-state-metrics 這個客戶端對 apiserver 請求頻率遠遠高於其它客戶端,這就找到了 "真凶" 是 kube-state-metrics,檢視日誌可以發現是因為 RBAC 權問題導致 kube-state-metrics 不停的請求 apiserver 重試,觸發了 apiserver 的限頻:
```
I1009 13:13:09.760767 1 request.go:538] Throttling request took 1.393921018s, request: GET:https://172.16.252.1:443/api/v1/endpoints?limit=500&resourceVersion=1029843735
E1009 13:13:09.766106 1 reflector.go:156] pkg/mod/k8s.io/[email protected]/tools/cache/reflector.go:108: Failed to list *v1.Endpoints: endpoints is forbidden: User "system:serviceaccount:monitoring:kube-state-metrics" cannot list resource "endpoints" in API group "" at the cluster scope
```
同理,如果要使用其它欄位來區分要統計的客戶端,可以根據需求靈活修改 SQL,比如使用 user.username 來區分,SQL 這樣寫:
```
* | SELECT CAST((__TIMESTAMP_US__ /1000-__TIMESTAMP_US__ /1000%1000) as TIMESTAMP) AS time, COUNT(1) AS qps,user.username GROUP BY time,user.username ORDER BY time
```
顯示效果:
![img](https://img2020.cnblogs.com/other/2041406/202011/2041406-20201109180315815-1907792490.png)
## 小結
本文介紹瞭如何利用 TKE 的叢集審計功能來輔助我們排查問題,給出了一些實踐的例子。
## 參考資料
- 叢集審計官網文件: https://cloud.tencent.com/document/product/457/48346
- 日誌服務檢索語法規則: https://cloud.tencent.com/document/product/614/47044
- 日誌服務分析簡介: https://cloud.tencent.com/document/product/614/44061
>【騰訊雲原生】雲說新品、雲研新術、雲遊新活、雲賞資訊,掃碼關注同名公眾號,及時獲取更多幹貨!!
![](https://img2020.cnblogs.com/other/2041406/202011/2041406-20201109180316396-1681489