云原生之深入解析Thanos在EKS多集群架构上存储多个集群Prometheus

一、前言

  • 随着 HiredScore 的产品和客户群越来越大,已经开始向 Kubernetes 过渡并迅速采用它,它是我们重要的障碍之一,也可能是最大的监控基础设施。我们在使用 Prometheus / Grafana 堆栈进行监控方面有一些经验,了解到希望创建一个更好、高可用性和弹性的基础架构,具有可行且具有成本效益的数据保留,此外,它还允许 HiredScore 的高速增长做好准备。
  • CNCF 推广了多种基础设施,可以解决这些监控痛点,并实现具有高可用性、数据保留和成本效益的监控。
  • 要求:
    • 单点可观察性将聚合来自任何区域的所有集群的所有数据;
    • Prometheus 的高可用性和弹性基础架构;
    • 我们所有应用程序数据的数据保留;
    • 经济高效的解决方案。
  • 最终选择 Bitnami 的 Kube-Prometheus 解决方案和 Thanos-io 的 Kube-Thanos 解决方案,该解决方案效果很好,并成功满足了所有需求。现在来认识一下 players:
    • Prometheus — 是用于事件监控和警报的免费软件应用程序,它在使用 HTTP 拉取模型构建的时间序列数据库中记录实时指标,具有灵活的查询和实时警报;
    • Thanos — 一个基于 Prometheus 组件的开源 CNCF 沙盒项目,用于创建全球规模的高可用性监控系统,它通过几个简单的步骤无缝地扩展了 Prometheus。

二、工作原理

  • 正如下图所示,每个 EKS 集群在同一个名称空间中拥有两个 Prometheus pods,它们通过抓取集群行为来监视它们。每个 Prometheus pods 在专用 PVC 中保存最后几个小时,在规定的保留时间后,数据通过 Thanos sidecar 发送到 S3 桶。通过这种方式,可以在少量本地存储上节省成本,并将其他所有存储都集中在一个地方(S3):

在这里插入图片描述

  • 为了显示来自 k8s 集群的 Grafana 数据,创建一个专用集群,负责使用连接到 thanos-sidecar 容器的 GRPC 直接从每个集群收集所有实时(最近约 2 小时)数据(暴露默认情况下在端口 10901 上)并从 S3 存储桶(配置存储)中获取远程数据。
  • 实现细节:
    • 第一阶段是在每个集群中实现 kube-prometheus 和 Thanos sidecar。
    • 第二阶段是在“聚合”集群中实现 kube-thanos,它将负责从集群中收集所有集群的实时数据,并从发送到 S3 存储桶(ObjectStore)的保留数据中收集数据。

三、具体实现

① 第一阶段

  • 在这里,关注如何在我们要监控的每个集群中部署和配置 Prometheus 以及 Thanos sidecar,在每个集群中创建一个名为 monitoring 的命名空间:
kubectl create ns monitoring
  • 创建一个存储类以使 Prometheus 能够持久化日期:
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: prometheus-storage-class
provisioner: kubernetes.io/aws-ebs
parameters:type: gp3
reclaimPolicy: Retain
allowVolumeExpansion: true
volumeBindingMode: Immediatekubectl apply -f prometheus-storage-class.yaml -n monitoring
  • 安装 kube-prometheus:
helm repo add bitnami https://charts.bitnami.com/bitnami
helm repo update
  • 将要配置的相关值复制到本地文件夹中,需要在值中应用的一些更改。
  • 第 1 步:
    • 使 Prometheus 高可用:设置 Prometheus Replica Count— 所需的 Prometheus 副本数(超过 2 个):
## @param prometheus.replicaCount Number of Prometheus replicas desired##replicaCount: 2
  • 第 2 步:定义 pod 资源限制 Prometheus 资源-定义它以避免 Prometheus 消耗所有服务资源:
resources:requests:cpu: 512mmemory: 3072Milimits:cpu: 512mmemory: 4096Mi 
  • 第 3 步:启用 Thanos Sidecar 创建:
thanos:## @param prometheus.thanos.create Create a Thanos sidecar container##create: true
  • 第 4 步:
    • 将 Thanos sidecar 服务类型从更改 ClusterIP 为 LoadBalancer- 它将创建一个 AWS 经典负载均衡器端点,该端点将在 GRPC 端口 10901 中公开 sidecar,然后可以使用此端点通过 route53 将其路由到某个 DNS 名称 thanos-prometheus-(cluster_name)。在自己的集群中公开 Thanos 端点 prometheus.thanos.service:
service:type: LoadBalancerport: 10901annotations:service.beta.kubernetes.io/aws-load-balancer-internal: "true"
    • 现在,在创建 CLB 之后,需要在 kube-thanos 清单中实现它。
  • 第 5 步:
    • 禁用压缩并定义保留,这是通过 Thanos sidecar 上传数据的一个非常重要的步骤,为了使用 Thanos 边车上传,这两个值必须相等 --storage.tsdb.min-block-duration,–storage.tsdb.max-block-duration 默认情况下,它们设置为 2 小时,Prometheus 的保留时间建议不低于 min block duration 的 3 倍,即 6 小时:
retention: 12hdisableCompaction: true 
  • 第 6 步:
    • 启用配置密钥,通过启用对象存储配置,可以将数据写入 S3 或任何其他受支持的 BlockDevice,以确保长期数据的持久性:
## @param prometheus.thanos.objectStorageConfig Support mounting a Secret for the objectStorageConfig of the sideCar container.
objectStorageConfig:secretName: thanos-objstore-configsecretKey: thanos.yaml
    • 虽然源文件 thanos-storage-config.yaml 必须采用这种形式:
type: s3
config:bucket: thanos-store #S3 bucket nameendpoint: s3.<region>.amazonaws.com #S3 Regional endpointaccess_key: <aws-account-id>secret_key: <aws-account-secret>
    • 值得一提的是,目前只能使用单个 S3 存储桶(ObjectStore) 使用以下命令创建密钥:
kubectl -n monitoring create secret generic thanos-objstore-config --from-file=thanos.yaml=thanos-storage-config.yaml
  • 第 7 步:
    • 现在可以使用相关自定义来安装/升级 helm chart:
helm install kube-prometheus -f values.yaml bitnami/kube-prometheus -n monitoring
// 或者
helm upgrade kube-prometheus -f values.yaml bitnami/kube-prometheus -n monitoring
  • 现在应该已经运行带有 Thanos sidecar 容器的 Prometheus pod,一方面通过 GRPC 将抓取的数据发送到清单,另一方面,相同的 sidecar 发送(大约 2 小时后)数据到 S3 存储桶(配置存储)。

② 第二阶段

  • 我们专注于如何在主要的可观察性集群上部署和配置 Thanos,如前所述,它将负责在第一阶段部署的所有集群中收集所有数据。为此,使用 kube-thanos manifests,可以发现,只需要实现查询和存储部分。
  • 第 1 步:
    • 安装和自定义 kube-thanos:在主可观察性集群中,创建一个名为 thanos 的命名空间:
kubectl create ns thanos
    • 可以选择克隆 kube-thanos 存储库并使用清单文件夹或自己编译 kube-thanos 清单,最后一个不需要复制整个存储库,只需要清单文件。
  • 第 2 步:
    • 在通过第一阶段后,将负责 thanos-query-deployment.yaml 从第一阶段开始与其他集群之间的通信。为此,需要添加以下内容:
- --store=dnssrv+_grpc._tcp.thanos-prometheus-<cluster_name>.<domain_name>:10901
    • 进入 args,在上面公开和定义的 Thanos sidecar GRPC 端点部分:
- args:- query- --grpc-address=0.0.0.0:10901- --http-address=0.0.0.0:9090- --log.level=info- --log.format=logfmt- --query.replica-label=prometheus_replica- --query.replica-label=rule_replica- --store=dnssrv+_grpc._tcp.thanos-store.thanos.svc.cluster.local:10901- --store=dnssrv+_grpc._tcp.thanos-receive-ingestor-default.thanos.svc.cluster.local:10901- --store=dnssrv+_grpc._tcp.thanos-prometheus-<cluster_name>.<domain_name>:10901- --query.auto-downsampling
  • 第 3 步:
    • 现在处理 thanos-store 与配置要从第一阶段发送到的数据的 S3 存储桶(ObjectStore)之间的通信。因此,正如在第一步中所做的那样,我们需要配置一个名称,该名称在注入环境 thanos-store-statefulSet.yaml 的一部分中请求到 Thanos 存储 pod:
env:- name: OBJSTORE_CONFIGvalueFrom:secretKeyRef:key: thanos.yamlname: thanos-objectstorage
    • 然后可以重用第一阶段的相同源文件并为 thanos-storethanos-storage-config.yaml 创建一个秘密:
kubectl -n thanos create secret generic thanos-objectstorage --from-file=thanos.yaml=thanos-storage-config.yaml
  • 第 4 步:
    • 安装清单:
kubectl apply -f manifests -n thanos
    • 现在,应该关闭循环,Thanos 通过 thanos-query 部署从其他集群接收实时数据,并通过 thanos-store-statefulSet 保留来自 S3 存储桶(ObjectStore)的数据:

在这里插入图片描述

四、结论

  • Thanos 让我们改变了对 Prometheus 高度可用、耐用和经济高效的看法,在许多 Kubernetes 集群上实施 Thanos 和 Prometheus 需要付出很多努力,但如果关心确保高可用的 Prometheus,这是值得的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/285034.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

得帆信息创始人-张桐,受邀出席 BV百度风投AIGC主题论坛

近日&#xff0c;得帆信息创始人兼CEO张桐&#xff0c;作为百度风投被投代表企业创始人受邀出席“向未来&#xff0c;共成长” BV百度风投AIGC主题论坛。 与包括上海市徐汇区相关部门领导、百度集团相关事业部负责人及代表&#xff0c;以及来自国寿资本、中网投、麦顿投资的投资…

YOLOV5 数据集的划分的详细流程(超详细)

1 数据划分 标注好后的数据集分为两个文件夹&#xff0c;一个文件夹中放置图片另一个文件夹中放置了txt文件。将数据集按照一定的比例进行划分为训练集&#xff0c;测试集&#xff0c;验证集&#xff08;train、test、val&#xff09;&#xff0c;下述的代码中我按照了 8:1:1 的…

php-使用wangeditor实现富文本(完成图片上传)-npm

官网参考连接&#xff1a;快速开始 | wangEditor 样式&#xff1a; 一、新建一个临时文件夹test1和一个文件夹wangeditor 临时文件夹test1&#xff1a;临时存放通过npm下载的文件文件夹wangeditor&#xff1a;用于存放在临时文件夹test1拷贝的css和js 二、安装 editor 在确保有…

云原生之深入解析如何在K8S环境中使用Prometheus来监控CoreDNS指标

一、什么是 Kubernetes CoreDNS&#xff1f; CoreDNS 是 Kubernetes 环境的DNS add-on 组件&#xff0c;它是在控制平面节点中运行的组件之一&#xff0c;使其正常运行和响应是 Kubernetes 集群正常运行的关键。DNS 是每个体系结构中最敏感和最重要的服务之一。应用程序、微服…

去掉乘法的加法神经网络

AdderNet: Do We Really Need Multiplications in Deep Learning? 核心贡献 用filter与input feature之间的L1-范数距离作为“卷积层”的输出为了提升模型性能&#xff0c;提出全精度梯度的反向传播方法根据不同层的梯度级数&#xff0c;提出自适应学习率策略 研究动机 加…

1.[BUU][极客大挑战 2019]EasySQL1

1.了解万能密码--》1 or 11# 这是一种常见的SQL注入攻击。在一个SQL查询中&#xff0c;这个语句会导致条件始终为真&#xff08;11&#xff09;&#xff0c;因此查询会返回所有的结果。#表示注释&#xff0c;可以用来结束SQL语句&#xff0c;防止后续的部分执行。因此&#xf…

HTML_CSS的基本选择器的使用及其作用范围和优先级

目录 ✨CSS的使用&#xff1a;行内样式内部样式外部样式 ✨CSS基本选择器&#xff1a;id选择器class选择器标签选择器 ✨优先级&#xff1a;选择器的优先级样式表的优先级 ✨CSS的使用&#xff1a; 根据定义CSS的位置不同&#xff0c;分为行内样式、内部样式和外部样式 行内样…

【目标检测】视频输出体积太大?分析视频的编码与码率问题

在做视频目标检测时&#xff0c;发现一个问题&#xff0c;检测输出完的视频时大时小&#xff0c;有时输出体积过大&#xff0c;造成播放器播放时严重卡顿现象。本文就这一情况进行分析&#xff0c;并就该问题提出相关解决方案。 视频基础知识 隔行扫描和逐行扫描 早期电视台在…

Unity与Android交互通信系列(2)

在上一篇文章中&#xff0c;我们介绍了Unity和Android交互通信的原理及在Unity中直接调用Java代码的方式&#xff0c;但没有给出代码示例&#xff0c;下面通过实际例子演示上篇文章中AndroidJavaClass、AndroidJavaObject两个类的基本用法&#xff0c;由于交互通信涉及到两端&a…

Rust与python联动进行多线程跑数据

最近有个学弟想请教我联动多线程爬取数据的案例&#xff0c;看了以前的模版没有合适的&#xff0c;我就利用空闲时间&#xff0c;专门给他写了一段模版作为参考。这里遇到注意的是需要代理IP介入&#xff0c;才能让多线程爬取减少网站风控限制。 以下是一个使用 Rust 编写的爬虫…

传统软件集成AI大模型——Function Calling

传统软件和AI大模型的胶水——Function Calling 浅谈GPT对传统软件的影响Function Calling做了什么&#xff0c;为什么选择Function CallingFunction Calling简单例子&#xff0c;如何使用使用场景 浅谈GPT对传统软件的影响 目前为止好多人对chatGPT的使用才停留在OpenAI自己提…

打响指针的第一枪:指针家族

前言 指针其实是我们学习C语言中最难的知识点&#xff0c;很多人在学习指针的时候会被绕晕&#xff0c;包括博主也是&#xff0c;当初百思不得其解&#xff0c;脑袋都要冒烟了&#xff0c;本来打算在学习指针的时候就写一篇博客&#xff0c;但是当初自己的能力还是没有办法去完…