共计 2205 个字符,预计需要花费 6 分钟才能阅读完成。
概述
有时候,集群资源莫名被删除或批改,有可能是人为误操作,也有可能是某个利用的 bug 或恶意程序调用 apiserver 接口导致,须要找出 “ 真凶 ”。这时候,咱们须要为集群开启审计,记录 apiserver 的接口调用,而后依据条件检索和剖析审计日志来找到起因。
对于 TKE 的集群审计简介与根底操作,请参考官网文档 集群审计。因为集群审计的数据存储在日志服务,所以咱们须要在日志服务控制台去对审计后果进行检索和剖析,检索语法请参考 日志检索语法与规定,要进行剖析就还须要写日志服务所反对的 SQL 语句,请参考 日志服务剖析简介。
注: 本文仅实用于 TKE 集群
场景示例
上面给出一些集群审计应用场景和查问的示例。
找出是谁做的操作
如果节点被封闭了,不晓得是哪个利用或人为操作的,须要查出来,能够在开启集群审计后,应用上面的语句来检索:
objectRef.resource:nodes AND requestObject:unschedulable
版面设置能够设置显示 user.username
, requestObject
和 objectRef.name
三个字段,别离示意做操作的用户、申请内容以及节点名称:
从上图能够看出,是 10001****958
这个子账号在 2020-10-09 16:13:22
的时候对 main.63u5qua9.0
这台节点进行了封闭操作,咱们在 拜访治理 - 用户 - 用户列表 里能够依据账号 ID 找到对于这个子账号的详细信息。
如果某个工作负载被删除,想晓得是谁删除的,这里以 deployments/nginx
为例来查问:
objectRef.resource:deployments AND objectRef.name:"nginx" AND verb:"delete"
查问后果:
揪出导致 apiserver 限频的真凶
apiserver 会有默认的申请频率限度爱护,防止恶意程序或 bug 导致对 apiserver 申请频率过高,使得 apiserver/etcd 负载过高,影响失常申请。如果产生了限频,咱们能够通过审计来找出到底是谁在发大量申请。
如果咱们通过 userAgent 来剖析统计申请的客户端,首先须要批改下日志主题的键值索引,为 userAgent 字段开启统计:
通过以下 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:
能够看到查到数据了,但可能后果太多,小面板显示不下,点击增加到仪表盘,放大显示:
此例中能够看到 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/client-go@v0.0.0-20191109102209-3c0d1af94be5/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
显示成果:
小结
本文介绍了如何利用 TKE 的集群审计性能来辅助咱们排查问题,给出了一些实际的例子。
参考资料
- 集群审计官网文档: https://cloud.tencent.com/doc…
- 日志服务检索语法规定: https://cloud.tencent.com/doc…
- 日志服务剖析简介: https://cloud.tencent.com/doc…
【腾讯云原生】云说新品、云研新术、云游新活、云赏资讯,扫码关注同名公众号,及时获取更多干货!!