Alert故障处理
本文介绍关于 k3s/k8s 常见告警主题处理及解决方案。
本文目录
处理流程

告警列表及优先级说明
ONES对告警进行优先级划分使用的是priority, 优先级从高到低为P0、P1、P2、P3、P4
- P0 要立刻处理的严重告警,可能已经发生了严重的集群整体不可用的问题
- P1 要立刻处理的严重告警,可能已经发生了严重的关键业务不可用的问题
- P2 可以延后处理(8-24小时)的告警,可能已经发生了非关键业务不可用的问题,或长期下去,可能会升级为P1的问题
- P3 可以延后处理(1-7天)的告警,可能已经发生了轻微的业务问题
- P4 信息级别的告警,无需处理,一般仅来让大家知道告警信息的接收没有问题,如果长期没有接受到P4的信息,就需要去处理下告警发送的问题
对于不同的告警应该设置不同的告警间隔时间(频率),建议如下
- P0: 10分钟
- P1: 30分钟
- P2: 2小时
- p3: 12小时
- p4: 12小时
注意:
- 下列告警列表,部分告警内容是有阈值的。
- 没有明确列出阈值的,则不存在阈值, 或者无需关心阈值。
- 告警里面也会有一些建议延后处理的时间点,虽然跟P0-P4的标准延后处理时间有差异。 但按标准的P0-P4的标准来处理也不会有大问题。
告警列表
1. KubeStateMetricsListErrors
-
优先级: P0
-
描述:
-
kube-state-metrics is experiencing errors at an elevated rate in list operations. This is likely causing it to not be able to expose metrics about Kubernetes objects correctly or at all.
-
kube-state-metrics 在list操作中遇到错误的频率很高。这很可能导致它无法正确或根本无法公开有关 Kubernetes 对象的指标。
-
-
原因:
- kubernetes集群出现内部问题, 一般是比较复杂的原因。
- 可能是etcd负载过高、etcd所在节点出现了某些问题、 kube-apiserver 负载过高等。
-
能否自愈:
- 一般情况下不能,需要人工介入
-
影响:
- 可能会因为kubernetes内部问题,进而引起长时间业务故障。
-
解决方法:
- 立刻处理
- 联系ONES技术支持分析, 排除问题的思路:
- 列出关键信息 kubectl get nodes, kubectl -n kube-system get pods -o wide, kubectl -n monitoring get pods -o wide,
- 根据情况,分析pod log 及 kubectl describe 分析状态, 必要情况下,需要进一步分析kubelet。
- 如果是负载过高引起的,使用top nmon 等近实时监控工具,分析高负载 的原因,再视具体情况谨慎处理。
2. KubeStateMetricsWatchErrors
-
优先级: P0
-
描述:
- kube-state-metrics is experiencing errors at an elevated rate in watch operations. This is likely causing it to not be able to expose metrics about Kubernetes objects correctly or at all.
- kube-state-metrics 在 watch 操作中遇到错误的频率很高。这很可能导致它无法正确或根本无法公开有关 Kubernetes 对象的指标。
-
能否自愈:
- 一般情况下不能,需要人工介入
-
原因
3. NodeFilesystemSpaceFillingUp
-
优先级:
- P0: 4小时内耗尽
- P0: 24小时内耗尽
-
描述:
-
Filesystem on $labels.device at $labels.instance has only printf "%.2f" $value % available space left and is filling up.
-
Filesystem is predicted to run out of space within the next 24 hours. (按磁盘消耗的速度,24小时内耗尽)
-
Filesystem is predicted to run out of space within the next 4 hours. (按磁盘消耗的速度 ,4小时内耗尽)
节点剩余空间不足,即将耗尽。
-
-
原因:
- 可能是前期存在资源规划问题,过度压缩了磁盘大,导致资源不足。
- 可能是业务bug,对于临时文件使用后,没有及时回收或清理。
- 可能是 当前配置 不能够满足 业务数据的增长。
-
能否自愈:
- 一般情况下不能,需要人工介入
-
影响:
- 一旦耗尽,引起的长时间的存储相关业务不可用。
-
解决方法:
- 根据磁盘剩余空间大小,再决定是马上介入处理 还是 延后到业务低峰期处理(4-24小时内)。
- 磁盘扩容或清理临时文件,扩容时, 可以逐个节点进行扩展。(可以reboot的情况下,不要强制关机)
- 如果是业务临时文件引起的, 反馈到ONES技术支持(必须在技术支持的指引下,谨慎清理临时文件,需慎重,做好备份)
4. NodeFilesystemAlmostOutOfSpace
-
优先级:
- P0: 剩余空间不足5%
- P1: 剩余空间不足15%
-
描述:
- Filesystem has less than $config alertThresholdP1NodeFilesystemOutOfSpace space left.
- Filesystem has less than $config alertThresholdP0NodeFilesystemOutOfSpace space left.
- 文件系统空间余量小于设置的阈值了
-
能否自愈:
- 一般情况下不能,需要人工介入
-
原因
5. NodeNetworkReceiveErrs
-
优先级: P3
-
描述:
- ' $labels.instance interface $labels.device has encountered printf "%.0f" $value receive errors in the last two minutes.'
- 网卡设备 2分钟内产生了较多的 receive 错误
-
原因:
- 某节点网卡、或网络故障、交换器故障、waf拦截。
-
影响:
- 服务不可用持续约2分钟,2分钟后一般情况下能自愈(这两份钟是由k8s自身默认机制决定的)。
-
解决方法:
- 检查网卡状态、排查内网网络问题、waf问题
-
缓解手段:
- 下线故障节点(init 0, 尽量不要直接关机)
响应时机:
如果业务还能够使用, 可以延后到业务低峰期处理(12小时内)。
6. NodeNetworkTransmitErrs
- 优先级: P3
描述:
' $labels.instance interface $labels.device has encountered printf "%.0f" $value transmit errors in the last two minutes.
网卡设备 2分钟内产生了较多的 transmit 错误
原因、影响、解决方发、响应时机, 同上 5. NodeNetworkReceiveErrs
7. KubePodCrashLooping
-
优先级:
- P1:正常情况下都为P1, 特例服务不出现在p1中(比如libreffice)
- P3: 特例,比如第三方工具libreffice等,偶尔会发生自身故障导致重启的,到重启次数超过3时,为P3
-
描述:
- Pod $labels.namespace / $labels.pod ( $labels.container ) is restarting printf "%.2f" $value times / 5 minutes.
- Pod实例重启了
-
原因:
- 进程异常退出
- OOM
- 业务bug(访问空指针且没有捕获异常)
- 资源上限配置过低了
-
能否自愈:
- 一般情况下能自愈
- 特殊情况下,如果5分钟内连续重启超过5次,会引发5分钟-10分钟的服务故障,这时需要人工介入处理。
- 边缘服务可以延后(4-8小时)处理。
- 关键服务需要马上处理。
-
影响:
- 如果是关键服务,会引发服务抖动、短时间卡顿问题。
- 如果是边缘服务,会导致一些异步或非关键功能异常,比如 performance、审计日志、搜索的实时性产生影响。
-
解决方法:
- 关键服务立刻处理
- 边缘服务延后(1-4小时处理)
- 如果确定某类 pod 重启告警需要做降级或屏蔽,需要联系ONES进行评估,再确定处理方案。
8. KubePodNotReady
-
优先级: P1
-
描述:
- Pod $labels.namespace / $labels.pod has been in a non-ready state for longer than 15 minutes.
- Pod 长时间non-ready
-
原因:
- 节点调度出现问题
- 集群资源不足
- 业务升级出现了问题
- 存储出现问题
- kubelet故障
- docker bug
- linux内核故障
- 网络故障
- 部署工具编排bug
-
能否自愈:
- 不能自愈,需要人工介入
-
影响:
- 可能业务升级出现问题
- 有潜在导致服务不可用的风险。
-
解决方法:
- 立刻处理
- 排查思路:
- kubectl -n xxx get pods -o wide
- kubectl -n xxx describe pod xxx
- kubectl -n xxx get node
- kubectl -n xxx describe node xxx
- ping xxx
- journalctl -f
- 处理方法:
- 具体问题具体分析,需要谨慎操作。
- 需要重启对应节点,才能重新加入集群(重启过程由于kubernetes自身组件问题,服务影响在1-2分钟)
- 检查内网网络问题
- 查看内核日志等
9. KubeDeploymentGenerationMismatch
-
优先级: P2
-
描述:
- Deployment generation for $labels.namespace / $labels.deployment does not match, this indicates that the Deployment has failed but has not been rolled back.
-
原因:
- kubernetes集群出现问题,导致deployment 无法完成正常的滚动更新调度问题
- 也可能是部署工具编排 Deployment 的bug。
- 集群资源不足
-
能否自愈:
- 一般情况下不能,需要人工介入
-
影响:
- 可能会因为kubernetes内部问题,进而引起长时间业务故障。
-
解决方法:
- 延后处理
- 排查思路:
- kubectl get nodes
- kubectl -n kube-system get pods
- kubectl -n xxx get deployment
- kubectl -n xxx describe deployment xxx
- kubectl -n xxx get pods
- kubectl -n xxx describe pod xxxx
- 处理方法:
- 联系ONES进行处理。
10. KubeStatefulSetReplicasMismatch
-
优先级: P2
-
描述:
- StatefulSet $labels.namespace / $labels.statefulset has not matched the expected number of replicas for longer than 15 minutes.
-
原因:
- 同上: 9. KubeDeploymentGenerationMismatch
- 差异:
- kubectl -n xxx get statefulset
- kubectl -n xxx describe statefulset xxx
11. KubeStatefulSetGenerationMismatch
-
优先级: P1
-
描述:
- StatefulSet generation for $labels.namespace / $labels.statefulset does not match, this indicates that the StatefulSet has failed but has not been rolled back.
-
原因:
- 同上: 9. KubeDeploymentGenerationMismatch
- 差异:
- 需要立即处理,因为有状态应用的影响程度比无状态应用要高
- kubectl -n xxx get statefulset
- kubectl -n xxx describe statefulset xxx
12. KubeStatefulSetUpdateNotRolledOut
-
优先级: P1
-
描述:
- StatefulSet $labels.namespace / $labels.statefulset update has not been rolled out.
-
原因:
- 同上: 9. KubeDeploymentGenerationMismatch
- 差异:
- 需要立即处理,因为有状态应用的影响程度比无状态应用要高
- kubectl -n xxx get statefulset
- kubectl -n xxx describe statefulset xxx
13. KubeDaemonSetRolloutStuck
-
优先级: P1
-
描述:
- Only $value | humanizePercentage of the desired Pods of DaemonSet $labels.namespace / $labels.daemonset are scheduled and ready.
-
原因:
- 同上: 9. KubeDeploymentGenerationMismatch
- 差异:
- 需要立即处理,因为daemonset的影响程度比无状态应用要高,并且很多情况下是影响所有节点的
- kubectl -n xxx get daemonset
- kubectl -n xxx describe daemonset xxx
14. KubeContainerWaiting
-
优先级: P3
-
描述:
- Pod $labels.namespace / $labels.pod container $labels.container has been in waiting state for longer than 1 hour.
-
原因:
- 部署问题
- 在等待依赖的中间件、或服务,且对应的中间件或服务长时间没有准备好
- 集群资源不足,导致依赖的中间件、或服务, 间接引发该告警
- 镜像仓库虽然能正常连接,但是拉取镜像的速度过慢,可能限速过于严重。
-
能否自愈:
- 一般情况下不能,需要人工介入
-
影响:
- 业务可能无法正常更新版本或配置
-
解决方法:
- 延后处理(2-8小时)
- 排查思路:
- kubectl -n xxx describe pods xxx
- kubectl -n xxx get pods xxx -o yaml , 观察是哪个container 卡住
- 处理方法:
- 具体问题,具体分析,解决卡住初始化的问题
15. KubeDaemonSetNotScheduled
-
优先级: P3
-
描述:
- $value Pods of DaemonSet $labels.namespace / $labels.daemonset are not scheduled.'
-
原因:
- 集群调度出现问题
- 可能是集群资源问题
- 可能是docker bug
- 可能是网络故障
-
能否自愈:
- 一般情况下不能,需要人工介入
-
影响:
- 可能会因为kubernetes内部问题,进而引起长时间业务故障 。
-
解决方法:
- 如果业务还能正常访问,则可延后处理,否则立刻处理
- 排查思路:
- kubectl get nodes
- kubectl -n kube-system get pods
- kubectl -n xxx get daemonset
- kubectl -n xxx describe daemonset xxx
- kubectl -n xxx get pods
- kubectl -n xxx describe pod xxxx
- 处理方法:
- 联系ONES进行处理。
16. KubeCronJobRunning
-
优先级: P1
-
描述:
- CronJob $labels.namespace / $labels.cronjob is taking more than 1h to complete.
-
原因:
- MySQL数据迁移时间过长、迁移失败、迁移卡住、死锁
- 某些定时任务执行时间过长
- 业务编排问题
-
能否自愈:
- 一般情况下能够自愈
-
影响:
- 可能会导致 ONES 业务版本更新时数据迁移失败
- 可能会引发集群资源问题,需要随时留意集群的情况,避免发生服务不可用的问题。
-
解决方法:
- 可以延后处理 (2-8小时)
- 耐心等待,但是要注意观察集群的情况或留意新的告警。