故障诊断
用户可定义诊断规则来快速帮助定位问题并给出诊断建议。当集群内资源符合某些特征时,给出预置的解决方案,从而快速帮助运维人员解决问题。诊断建议将会被展示在ADP-Local上,也可以通过获取CR的status查询到诊断规则匹配的对象。
功能概述
ADP底座提供的故障诊断引擎包含以下能力:
对告警消息进行诊断并提供修复建议;
对于组件整体提供诊断数据并分析根因;
关联运维操作提供修复方案。
接入流程
ADP-Local的故障诊断引擎,允许客户根据业务场景配置诊断规则,然后根据诊断素材匹配诊断规则,并给出诊断建议,除了文档帮助,还可以关联运维操作进行问题修复。
匹配k8s资源属性或状态
通过判断特定类型资源某个参数值符合某特征
此样例:查找所有Pod,任意Container因OOMKilled而terminated,即命中规则,给出诊断建议
apiVersion: diagnosis.adp.aliyuncs.com/v1beta1
kind: DiagnosisRule
metadata:
creationTimestamp: null
name: pod-oom-killed
spec:
# 诊断匹配规则,任意一条命中,就会判断匹配成功
rules:
# 数据来源
- sources:
# 取 K8s 对象
- type: K8SObjects
objects:
- apiVersion: v1
kind: Pod
# 分析流水线
analyzePipeline:
# 使用jq表达式对取到Pod的信息进行筛选匹配
- type: jq
expression: '[.status.containerStatuses[]?.lastState.terminated.reason=="OOMKilled"]|any'
# 对jq表达式的结果进行匹配,结果是否匹配'true'
- type: regexp
expression: "true"
# 问题严重等级:Critical/Warning/Info
level: Critical
# 问题总结
summary: Pod因OOM被Kill
# 问题原因, 支持markdown格式
reason: 某容器的内存使用超过了.spec.containers[].resource.limits.memory定义的数值,造成了OOM(Out Of Memory)错误,进程被系统kill
# 处置建议,支持markdown格式
suggestion: |-
建议:
- 提升配置,增加limits.memory的值(可在ADP-Local中,在组件的【组件运维】菜单,使用【垂直扩容】功能进行操作)
- 排查程序是否存在内存泄露问题
匹配标准输出日志关键字
apiVersion: diagnosis.adp.aliyuncs.com/v1beta1
kind: DiagnosisRule
metadata:
creationTimestamp: null
name: loki-err-creating-index
spec:
level: Warning
sources:
# 日志类型
- type: Log
logOptions:
labelSelector:
matchLabels:
app: loki
level: Pod
# 取最后100行
tail: 100
# 取特定namespace下资源
namespaceSelector:
matchNames:
- acs-system
rules:
- analyzePipeline:
# 正则匹配
- expression: file size too small\\nerror creating index
type: regexp
# 模板数据,可将实际数据用于渲染suggestion建议模板
- templateData:
- key: index
value:
expression: index_[0-9]*
type: regexp
- key: podUID
value:
expression: .metadata.uid
type: jq
- key: podName
value:
expression: .metadata.name
type: jq
- key: hostIP
value:
expression: .status.hostIP
type: jq
type: prepareTemplateData
summary: Loki创建index失败
reason: 问题来源于Loki v2.1版本的BUG,需要手动修复
# 使用go-template语法,变量将会被templateData中的数据渲染
suggestion: |-
执行下面命令修复此问题:
```bash
kubectl -n acs-system exec -it loki-stack-0 -- sh
rm -rf /data/loki/boltdb-shipper-active/{{.index}} /data/loki/boltdb-shipper-cache/{{.index}}
## 如果由于Pod始终处于waiting状态无法 `kubectl exec`,报错为error: unable to upgrade connection: container not found ("loki"), 则只能到 POD 所在节点删除文件,参考以下操作(需要ssh跨节点,输入节点密码)
## ssh到Pod所在主机
ssh root@{{.hostIP}}
## 在目标主机上进入Pod挂载点
cd $(mount | grep {{.podUID}} | grep ext4 | awk '{print $3}')/loki
## 删除错误的文件
rm -rf boltdb-shipper-active/{{.index}} boltdb-shipper-cache/{{.index}}
## 完成退出 ssh
exit
## 重启Pod
kubectl -n acs-system delete pod {{.podName}}
```
等待一段时间后便可观察到恢复,如新的Pod启动后还是同样的错误,可能是由于错误文件未删除干净,请重新运行此诊断程序获取新的命令进行执行