基于ScheduledSQL实现K8S集群指标预计算

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,恶意文件检测 1000次 1年
对象存储 OSS,内容安全 1000次 1年
简介: 随着云原生的普及,各家公司都通过K8S实现了服务的容器化,极大的简化了开发运维人员的工作,是目前最为常用的基础服务。同时,K8S集群中的各项基础服务能够通过metrics接口导出Prometheus格式的多种指标,方便观察当前系统状态,及时发现问题。用户将K8S集群指标采集到日志服务SLS时序存储之后,可以随时查看系统历史及当前指标,还可以通过SLS内置仪表盘或者Grafana构建监控大盘,方便观察系统情况。但是随着系统规模以及负载成倍增加,复杂的指标查询以及监控大盘的渲染开始变慢,进而影响操作体验。

背景

随着云原生的普及,各家公司都通过K8S实现了服务的容器化,极大的简化了开发运维人员的工作,是目前最为常用的基础服务。同时,K8S集群中的各项基础服务能够通过metrics接口导出Prometheus格式的多种指标,方便观察当前系统状态,及时发现问题。用户将K8S集群指标采集到日志服务SLS时序存储之后,可以随时查看系统历史及当前指标,还可以通过SLS内置仪表盘或者Grafana构建监控大盘,方便观察系统情况。但是随着系统规模以及负载成倍增加,复杂的指标查询以及监控大盘的渲染开始变慢,进而影响操作体验。

指标预聚和

image.png

指标预聚合指在后台定时运行批处理任务,按照一定的规则将多条系统指标合并为一条,减少所需指标计算涉及到的数据量,加快计算结果的产出。因而在观察指标确定的情况下,使用指标预聚合可以很好的解决前面遇到的问题。我们以CPU指标利用率的计算为例:

可以获取到K8S的两项指标:CPU累计使用时长container_cpu_usage_seconds_total以及CPU配额container_spec_cpu_quota。为了计算单位事件内CPU的利用率:

  1. 计算单位时间累计利用率: container_cpu_usage_minutes_total: sum(rate(container_cpu_usage_seconds_total{image!=""}[5m])) by (namespace,pod_name);
  2. 计算单位时间内的总CPU配额:container_spec_cpu_cores: (sum(container_spec_cpu_quota{image!=""}/100000) by (namespace,pod_name));
  3. 计算单位的CPU利用率:container_cpu_usage: container_cpu_usage_minutes_total: container_cpu_usage_minutes_total / container_spec_cpu_cores * 100

整条链路冗长而且速度慢,我们可以通过预先计算container_cpu_usage_minutes_total和container_spec_cpu_cores来加快计算速度。

本文主要介绍第一种方案,可以实现:

  1. 降低分析延迟:预计算多项常用系统指标,加快计算速度;
  2. 优化数据存储:只存储关心的聚合指标,定期清理详细指标;

原理即为使用SLS提供的ScheduledSQL服务,在后台定时运行SQL计算任务,将统计结果存入时序存储。

K8S指标

K8S指标众多,首先需要确定常用的监控指标,得到预聚合计算表达式。本文选取了Prometheus Operator中部分常用指标的计算表达式,更多的指标用户可以根据需求自行构建。

指标名称

说明

cpu_resource_request_percentage

CPU Request水位

mem_resource_request_percentage

Mem Request水位

kubelet_running_pod_percentage

Pod水位

api_service_success_percentage

APIServer请求成功率

CPU Request水位

* | select promql_query_range('(sum(kube_pod_container_resource_requests_cpu_cores))/(sum(kube_node_status_allocatable_cpu_cores)) * 100') from metrics limit 1000

Mem Request水位

* | select promql_query_range('(sum(kube_pod_container_resource_requests_memory_bytes))/(sum(kube_node_status_allocatable_memory_bytes)) * 100') from metrics limit 1000

Pod水位

* | select promql_query_range('(sum(kubelet_running_pod_count)-33)/(sum(kube_node_status_allocatable_pods)-330) * 100') from metrics limit 1000

APIServer请求成功率

* | select promql_query_range('sum(irate(apiserver_request_count{job="apiserver", code=~"20.*"}[5m]))/sum(irate(apiserver_request_count{job="apiserver"}[5m]))') from metrics limit 1000

ScheduledSQL实践

计算配置

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

写入模式

写入模式有三种选择,当源为日志库时,可以选择日志库导入日志库以及日志库导入时序库;当源为时序库时,可以选择时序库导入时序库。因为K8S指标为时序库,计算结果为时序数据,所以此处选择时序库导入时序库。

结果指标名

指定计算结果的指标名称,默认选择metric列的值作为指标名称。此处需要注意,如果metric列的结果包含多种不同的指标名称,将会全部重命名为此处配置的指标名称。因为该例子中的指标名称为null,所以配置为cpu_resource_requests。

哈希列

如果时序库中同一label的数据写入到固定的hard中,可以增强局部性,提升查询效率。因此可以选择常用的过滤标签,作为哈系列,使给定标签相同的指标存入同一shard中。此处留空。

附加labels

为计算结果添加额外的属性,方便后续查询,此处留空。

调度配置

设置 SQL 每 5 分钟执行一次,每次执行处理最近 5 分钟窗口的数据。

注意:

1. 设置延迟执行参数,上游时序库的数据到来可能延迟,建议设置大一些的值做等待来保证计算数据的完整性。

2. SQL运行超过指定次数或指定时间后,这一次的SQL实例会失败并继续下一个实例的调度。

任务管理

在SLS控制台可以查看之前创建的ScheduledSQL作业。

在作业管理页面内,可以查看到每一次执行的实例列表。

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

效果

计算完成之后,可以在时序库中查询结果指标。

CPU Request水位

API Server请求成功率

总结

通过SLS提供的ScheduledSQL功能,用户可以轻松聚合时序数据,存入到SLS的时序库中,满足用户监测系统指标的需求。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
3天前
|
存储 运维 Kubernetes
Kubernetes 集群的监控与维护策略
【4月更文挑战第23天】 在微服务架构日益盛行的当下,容器编排工具如 Kubernetes 成为了运维工作的重要环节。然而,随着集群规模的增长和复杂性的提升,如何确保 Kubernetes 集群的高效稳定运行成为了一大挑战。本文将深入探讨 Kubernetes 集群的监控要点、常见问题及解决方案,并提出一系列切实可行的维护策略,旨在帮助运维人员有效管理和维护 Kubernetes 环境,保障服务的持续可用性和性能优化。
|
5天前
|
存储 运维 Kubernetes
Kubernetes 集群的持续性能优化实践
【4月更文挑战第22天】在动态且复杂的微服务架构中,确保 Kubernetes 集群的高性能运行是至关重要的。本文将深入探讨针对 Kubernetes 集群性能优化的策略与实践,从节点资源配置、网络优化到应用部署模式等多个维度展开,旨在为运维工程师提供一套系统的性能调优方法论。通过实际案例分析与经验总结,读者可以掌握持续优化 Kubernetes 集群性能的有效手段,以适应不断变化的业务需求和技术挑战。
17 4
|
2月前
|
Kubernetes Ubuntu 应用服务中间件
在Ubuntu22.04 LTS上搭建Kubernetes集群
在Ubuntu22.04.4上安装Kubernetes v1.28.7,步骤超详细
339 1
在Ubuntu22.04 LTS上搭建Kubernetes集群
|
1月前
|
Prometheus 监控 Kubernetes
Kubernetes 集群监控与日志管理实践
【2月更文挑战第29天】 在微服务架构日益普及的当下,Kubernetes 已成为容器编排的事实标准。然而,随着集群规模的扩大和业务复杂度的提升,有效的监控和日志管理变得至关重要。本文将探讨构建高效 Kubernetes 集群监控系统的策略,以及实施日志聚合和分析的最佳实践。通过引入如 Prometheus 和 Fluentd 等开源工具,我们旨在为运维专家提供一套完整的解决方案,以保障系统的稳定性和可靠性。
|
23天前
|
数据库 存储 监控
什么是 SAP HANA 内存数据库 的 Delta Storage
什么是 SAP HANA 内存数据库 的 Delta Storage
17 0
什么是 SAP HANA 内存数据库 的 Delta Storage
|
12天前
|
Kubernetes 搜索推荐 Docker
使用 kubeadm 部署 Kubernetes 集群(二)k8s环境安装
使用 kubeadm 部署 Kubernetes 集群(二)k8s环境安装
58 17
|
25天前
|
消息中间件 Kubernetes Kafka
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
Terraform阿里云创建资源1分钟创建集群一键发布应用Terraform 创建 Kubernetes 集群
18 0
|
26天前
|
Kubernetes 安全 网络安全
搭建k8s集群kubeadm搭建Kubernetes二进制搭建Kubernetes集群
搭建k8s集群kubeadm搭建Kubernetes二进制搭建Kubernetes集群
108 0
|
1月前
|
Kubernetes Cloud Native Docker
【云原生】kubeadm快速搭建K8s集群Kubernetes1.19.0
Kubernetes 是一个开源平台,用于管理容器化工作负载和服务,提供声明式配置和自动化。源自 Google 的大规模运维经验,它拥有广泛的生态支持。本文档详细介绍了 Kubernetes 集群的搭建过程,包括服务器配置、Docker 和 Kubernetes 组件的安装,以及 Master 和 Node 的部署。此外,还提到了使用 Calico 作为 CNI 网络插件,并提供了集群功能的测试步骤。
219 0
|
1月前
|
Prometheus 监控 Kubernetes
Kubernetes 集群的监控与日志管理实践
【2月更文挑战第31天】 在微服务架构日益普及的今天,容器编排工具如Kubernetes已成为部署、管理和扩展容器化应用的关键平台。然而,随着集群规模的扩大和业务复杂性的增加,如何有效监控集群状态、及时响应系统异常,以及管理海量日志信息成为了运维人员面临的重要挑战。本文将深入探讨 Kubernetes 集群监控的最佳实践和日志管理的高效策略,旨在为运维团队提供一套系统的解决思路和操作指南。
27 0

推荐镜像

更多