对 K8s 异常事件的定时 SQL 分析

本文涉及的产品
对象存储 OSS,20GB 3个月
日志服务 SLS,月写入数据量 50GB 1个月
阿里云盘企业版 CDE,企业版用户数5人 500GB空间
简介: 使用 K8s 集群,我们关注业务、容器、集群三个层面稳定性,最基础的依赖是 K8s node 要稳定。阿里云容器服务(ACK)提供容器场景事件监控方案,通过 NPD(node-problem-detector)以及 kube-eventer 提供容器节点的事件采集、存储能力。本文介绍通过 Scheduled SQL 完成对 K8s 异常事件的定时分析及结果存储。

K8s 事件简介

K8s 是基于状态机的设计,在不同状态之间迁移时会生成事件。正常的状态间转换会生成 Normal 事件,从正常状态转换为异常状态则会生成 Warning 事件。

使用 K8s 集群,我们关注业务、容器、集群三个层面稳定性,最基础的依赖是 K8s node 要稳定。可能影响 pod 运行的节点问题包括:

  • 基础设施:ntp 服务不可用、网络故障等。
  • 硬件:例如 CPU、内存、磁盘故障,使用 IaaS 会大大降低这类问题发生概率。
  • OS:Kernel deadlock,文件系统损坏等。
  • Container Runtime:例如 docker engine hang。
  • 其它。

阿里云容器服务(ACK)提供开箱即用的容器场景事件监控方案,通过 NPD(node-problem-detector)以及 kube-eventer 提供容器节点的事件采集、存储能力。

  • NPD 是 K8s 集群节点异常事件监控组件,可以将 NPD 以 DaemonSet 或独立守护程序运行。用于监视和报告节点的健康状况,并将事件报告给 API Server。
  • kube-eventer 是 ACK 维护的 K8s 事件开源工具,可以将集群事件转储到钉钉、SLS、EventBridge 等系统,并提供不同等级的过滤条件,实现事件的实时采集、定向告警、异步归档。

image-20210803104007028.png

阿里云日志服务(SLS)是云原生观测分析平台,为 Log/Metric/Trace 等数据提供大规模、低成本、实时平台化服务,支持数据采集、加工、分析、告警可视化与投递功能,帮助提升研发、运维、运营和安全等场景数字化能力。

使用 ACK 事件中心,设置 Sink 参数将 K8s 事件数据采集到 SLS,样例如下:

image-20210802121332793.png

k8s.io/api/core/v1/types.go 对事件结构进行了定义,其中几个重要的字段是:

  • Message:当前操作对应状态的详细描述。
  • Reason:事件描述的简短枚举值。
  • Involved Object:事件所关联的对象,例如 Pod,Deployment,Node 等。
  • Source:汇报事件的模块,例如 kube-scheduler、kubelet 等。
  • Type:目前只有两种类型,Normal 或 Warning。
  • Count:事件发生的次数。

异常事件分析

以一个中型(~100 台) K8s 生产集群的为例,在 SLS 上通过 SQL 代码统计一天里 Pod 创建、启动次数的时间趋势:

eventId.reason:Created or eventId.reason:Started | select from_unixtime(__time__ - __time__ % 60) as dt, "eventId.reason" as action, sum(cast("eventId.count" as bigint)) as event_count group by dt, action order by dt asc limit 10000

看到会有 burst 情况,对于 K8s 集群稳定性是一个挑战:

image-20210802143143843.png

通过 SQL 代码统计不同事件类型关联的 Pod 数目分布:

* | select reason, count(DISTINCT "eventId.involvedObject.name") as object_count group by reason order by object_count desc limit 100

发现有少量 Failed、DeadlineExceeded、FailedMount、FailedCreatePodSandBox 等异常事件,这些需要引起关注:

image-20210803105420766.png

如何将这类事件分析操作变成一种常态化的工作,本文介绍一种周期性 SQL 计算方案。要实现:

  • 优化事件中心长期存储(3个月以上)成本,对冷数据做降精度存储。
  • 对长周期(例如时间跨度 1 个月以上)统计分析做响应延时优化,将全量数据计算拆分为多次增量计算。

具体来说,是将 SQL 分析从控制台上的交互式操作转变为后台任务的周期性运行,得到一个个时间区间的统计值,将这些统计结果写入存储库,达到如下效果:

  • 统计结果直接存储下来,可被多种下游系统直接使用,例如可视化大盘、告警监控、入库数仓等。
  • 通过周期性计算任务相当于预先构建了 Cube,查询引擎在目标库的数据上计算,由于要处理的数据量大大降低,达到秒开的效果。
  • 全量 K8s 事件随着时间推移,需要的存储量持续增加。在有了降维后的目标库数据后,如果不需要原文做问题调查,存储原文的日志库可以缩短存储周期。

Scheduled SQL 实践

Scheduled SQL 是一项由 SLS 全托管的功能,解决场景需求包括:

  • 定时分析数据:根据业务需求设置 SQL 语句或查询分析语句,定时执行数据分析,并将分析结果存储到目标库中。
  • 全局聚合:对全量、细粒度的数据进行聚合存储,汇总为存储大小、精度适合的数据,相当于一定程度的有损压缩数据。

image-20210803163820034.png

本节演示通过 Scheduled SQL 完成对 K8s 异常事件的定时分析及结果存储。

分析预览

在 k8s-event 日志库上,过滤 Normal 级别事件,按照 namespace、object 类型、事件类型分组统计:关联的 object 数目、事件数目、关联的节点数目。

SQL 代码如下:

* not level : Normal | select "eventId.involvedObject.namespace" as namespace, "eventId.involvedObject.Kind" as kind, reason, arbitrary(message) as msg, count(DISTINCT "eventId.involvedObject.name") as object_count, sum(cast("eventId.count" as bigint)) as event_count, count(distinct hostname) as host_count group by namespace, kind, reason order by event_count desc

在 SLS 控制台上分析预览:

image-20210802112631771.png

确认结果符合预期后,点击按钮创建 Scheduled SQL 作业。

计算配置

资源池有免费(Project 级别 15 并行度)、增强型(收费,但资源可扩展,适用于大量计算且有 SLA 要求的业务场景)两种,按照你的需求来设置即可。

image-20210802122243581.png

关于目标库(k8s_event_errors),注意提前为目标库准备好索引:

image-20210802120343019.png

调度配置

设置 SQL 每天执行一次,查询前一天零点到当前零点时间窗口内的数据。因为上游事件数据到来可能延迟,这里设置 120 秒延迟等待来保证计算数据的完整性。

image-20210802120001597.png

实例查看、管理

在控制台上查看刚才创建的 Scheduled SQL 作业,作业管理页面内可以查看到每一次执行的实例列表。

image-20210803163554267.png

每个实例信息中有 SQL 查询区间,如果任务失败(权限、SQL 语法等原因)或 SQL 处理行数指标为 0(数据迟到或确实没有数据),可以对指定实例做重试。

效果

通过 Scheduled SQL 计算后的数据格式如下:

image-20210802121907359.png

结果数据集的规模大大降低了,做一年时间范围的数据分析也没有压力,这里有两个例子。

  • 按 namespace 统计异常事件的时间趋势

SQL 代码:

* | select from_unixtime(__time__) as dt, namespace, sum(object_count) as objects group by dt, namespace order by dt asc limit 100000

可视化图表:

image-20210802172555108.png

  • 按 object 类型统计异常事件的时间趋势

SQL 代码:

* | select from_unixtime(__time__) as dt, kind, sum(object_count) as objects group by dt, kind order by dt asc limit 100000

可视化图表:

image-20210802172715089.png

更多内容请参考:

使用Kubernetes事件中心,采集事件到 SLS

使用 Scheduled SQL 定时分析事件数据

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
1月前
|
容器 Perl Kubernetes
深入 Kubernetes 网络:实战K8s网络故障排查与诊断策略
本文介绍了Kubernetes网络的基础知识和故障排查经验,重点讨论了私有化环境中Kubernetes网络的挑战。首先,文章阐述了Kubernetes网络模型的三大核心要素:Pod网络、Service网络和CNI,并强调了其在容器通信和服务发现中的作用。接着,通过三个具体的故障案例,展示了网络冲突、主节点DNS配置更改导致的服务中断以及容器网络抖动问题的解决过程,强调了网络规划、配置管理和人员培训的重要性。最后,提到了KubeSkoop exporter工具在监控和定位网络抖动问题中的应用。通过这些案例,读者可以深入了解Kubernetes网络的复杂性,并学习到实用的故障排查方法。
146407 19
|
25天前
|
Kubernetes 安全 Cloud Native
云上攻防-云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行
云上攻防-云原生篇&Kubernetes&K8s安全&API&Kubelet未授权访问&容器执行
|
7天前
|
SQL Java 数据库连接
【Java】已解决java.sql.SQLRecoverableException异常
【Java】已解决java.sql.SQLRecoverableException异常
6 0
|
7天前
|
SQL Java 数据库连接
【Java】已解决java.sql.SQLTimeoutException异常
【Java】已解决java.sql.SQLTimeoutException异常
6 0
|
7天前
|
SQL Java 数据库连接
【Java】已解决java.sql.SQLException异常
【Java】已解决java.sql.SQLException异常
7 0
|
1月前
|
SQL 缓存 关系型数据库
✅分析SQL执行计划,我们需要关注哪些重要信息
SQL执行计划解析:12个关键字段详解,包括id(操作标识)、select_type(操作类型)、table(涉及表)、partitions(分区)、type(索引类型)、possible_keys(可能的索引)、key(使用索引)、key_len(索引长度)、ref(比较对象)、rows(扫描行数)、filtered(过滤比例)和Extra(额外信息)。类型从优至劣:system>const>eq_ref>ref>range>index>ALL。
|
12天前
|
SQL 存储 大数据
SQL中DISTINCT关键字的使用与性能影响分析
SQL中DISTINCT关键字的使用与性能影响分析
|
1月前
|
运维 Kubernetes Java
Java一分钟之Kubernetes(K8s):容器编排深入浅出
【6月更文挑战第6天】Kubernetes是容器编排的主流工具,简化分布式系统运维。本文介绍了K8s核心概念:节点、Pod、服务、部署和副本集。讨论了资源不足、依赖服务未就绪等常见问题及其解决策略,并提供创建Deployment的代码示例。学习K8s能提升部署效率和运维灵活性。
137 5
|
17天前
|
Prometheus 监控 Kubernetes
一篇文章讲明白Kubernetes(k8s)部署Promehteus监控
一篇文章讲明白Kubernetes(k8s)部署Promehteus监控
28 0
|
2月前
|
运维 Kubernetes 调度
【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路
【kubernetes】关于k8s集群的污点、容忍、驱逐以及k8s集群故障排查思路

热门文章

最新文章

推荐镜像

更多